Datapath V2下最佳实践

更新时间:
复制为 MD 格式

本文介绍在使用Terway网络插件的集群中,启用Datapath V2后如何优化集群的网络配置,例如Conntrack参数配置、Identity资源管理等,以提升集群性能和稳定性。

优化Conntrack配置

ConntrackLinux内核中的连接跟踪模块,用于跟踪网络连接的状态。在Datapath V2模式下,容器网络的ConntrackeBPF程序提供。您可以参见优化Terway模式下conntrack配置来调整Conntrack参数,例如调整Conntrack表大小、调整TCP链接记录超时时间,以适配高并发服务等场景下的网络需求。

限制Identity数量

在 Datapath V2 功能中,NetworkPolicy通过 eBPF 技术实现。与传统的基于 Netfilter 的方式不同,在 eBPF 的实现中,系统会为每个 Pod 分配一种 Identity作为身份ID标识,用于精准管理网络权限。

Identity由 Pod 标签和Namespace标签组合而成,具有相同标签组合的 Pod 会被分配同一个 Identity,以便统一管控它们的网络访问规则。

NetworkPolicy的规则会通过 IP-Identity 映射来判断流量是否符合策略。简单来说,系统会使用 Pod 的 IP 地址与其 Identity,判断是否允许该流量通过。

  • 若您没有开启NetworkPolicy功能,Identity无任何作用,Terway会自动限制Identity数量。

  • 若您启用NetworkPolicy功能,您应当避免一组相同身份的Pod,具备不同的标签。使用不同标签会产生大量Identity资源,可能会造成集群管控压力升高,IP分配速度下降。

通过配置标签过滤,可以避免无效的标签被记录到Identity中。

重要
  • 调整标签过滤规则会触发Identity新建,短时间内Identity数量会增加,API Server资源开销也会有不同程度的增加。

  • 配置错误的标签过滤规则会导致NetworkPolicy策略失效。

    • 不可过滤所有标签:需为每组 Pod 保留至少一个标签(Namespace 或 Pod 标签),否则系统将无法识别该 Pod 的身份。

    • 被过滤的标签无法用于策略规则:如果某个标签被添加到过滤列表中,该标签将无法在 NetworkPolicy 规则中被引用。请确保仅过滤无效标签。

关于配置标签过滤的语法,请参见Cilium

关于在Terway中如何配置,请参见自定义Terway配置参数cilium_args相关内容。

Identity 数量直接影响每个 Pod 的 Policy Map 条目数。Policy Map 容量由 bpf-policy-map-max 控制(默认 16384,单 Endpoint 上限 65536),详见bpf-lb-map-max

监控 BPF Map 使用率

BPF Map 一旦填满,会导致 Pod 网络异常或服务条目下发失败,因此强烈建议在生产集群中开启 Cilium Agent 的 Prometheus 指标采集,并对各类 BPF Map 设置使用率告警。

启用 Prometheus 指标

Datapath V2 复用 Cilium Agent 的指标端点。在 Terway ConfigMap 的cilium_args中追加--prometheus-serve-addr

"cilium_args": "--prometheus-serve-addr=:9962"
  • :9962是 Cilium 上游约定的 metrics 端口;置空字符串关闭。监听在0.0.0.0,可通过 Pod 的 hostNetwork 端口直接抓取。

  • 修改后重启 terway-eniip Pod 生效。

  • 在 Pod/Service 上添加抓取注解,或编写 ServiceMonitor,使集群内 Prometheus 自动发现:

    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9962"
        prometheus.io/path: "/metrics"
重要

请为集群设置合适的安全组,避免 metrics 端口被外部访问。

重点关注的 BPF Map 指标

部分指标在Terway >=v1.14.0 版本后才提供,请升级至最新版本。

指标名

类型

说明

cilium_bpf_map_pressure

Gauge

最重要。Map 当前条目占max_entries的比例,按 map_name 标签区分。仅当占用 ≥0.1(10%)后才会上报。

cilium_bpf_map_capacity

Gauge

Map 容量max_entries,按map_group标签分组;容量为 65536 的 Map 统一归到 default 组。

cilium_bpf_map_ops_total

Counter

Map 操作计数,按map_name/operation/outcome标签区分,可用于发现update失败激增。

cilium_bpf_maps_virtual_memory_max_bytes

Gauge

所有 Map 占用的虚拟内存上限,监控节点内存压力。

推荐告警与查询示例

# 任意 BPF Map 使用率超过 80% 持续 5 分钟
max by (map_name) (cilium_bpf_map_pressure) > 0.8

# 每个节点的 LB Service Map 使用率
cilium_bpf_map_pressure{map_name=~"cilium_lb[46]_services_v2"}

# 每个 Endpoint 的 Policy Map 使用率(Top 10)
topk(10, cilium_bpf_map_pressure{map_name=~"cilium_policy_.*"})

# Node Map 容量告警(>80% 即应扩容 bpf-node-map-max)
cilium_bpf_map_pressure{map_name="cilium_node_map_v2"} > 0.8

# 全局 Conntrack Map 压力(与 bpf-map-dynamic-size-ratio 调优联动)
cilium_bpf_map_pressure{map_name=~"cilium_ct.*_global"} > 0.7

# Map 写入失败速率
sum by (map_name) (rate(cilium_bpf_map_ops_total{operation="update",outcome="fail"}[5m])) > 0

观察到cilium_bpf_map_pressure持续超过 0.8,应对照BPF Map 容量调优章节按 Map 类别调整对应参数;超过 0.95 时应视为紧急情况立即扩容,否则可能在短时间内出现条目下发失败。


BPF Map 容量调优

Datapath V2 依赖很多 BPF Map来进行工作,MAP 一旦创建,其max_entries就被固定下来,运行期无法扩容;如果填满,会出现 update 失败、Pod 流量异常、Identity/服务条目无法下发等问题。建议结合监控 BPF Map 使用率章节中的指标提前评估并调整。

警告

调整任何 BPF Map 大小都需要重启 Terway 节点上的 Cilium Agent(即重启 terway-eniip Pod)以重建 Map。

重建过程中已有连接的 Conntrack/服务条目需要重新填充,可能造成短暂的连接抖动。请避开业务高峰,并分批滚动。

参数总览

参数

影响功能

默认值

取值范围

何时调整

bpf-map-dynamic-size-ratio

连接跟踪与 NAT:节点上可同时存活的 TCP/UDP 连接数、NodePort / SNAT 翻译条目数。表满 → 新建连接失败、丢包

0.0025

(0.0, 1.0]

节点跑高并发或长连接业务,CT/NAT Map 压力偏高

bpf-policy-map-max

NetworkPolicy(每个 Pod):单个 Pod 数据面可承载的策略规则数(允许通信的 Identity × 端口/协议 组合)。表满 → 策略规则下发被截断,行为不符合预期

16384

[256, 65536]

启用了 NetworkPolicy,且 Identity 较多或单 Pod 访问的对端范围广

bpf-lb-map-max

Kubernetes Service(全节点):ClusterIP / NodePort / LoadBalancer 在数据面下发的条目总数。表满 → 新 Service 或后端 Pod 无法下发,Service IP 不通

65536

不强制上限(受内存约束)

集群 Service 数 × 平均后端 Pod 数 接近默认 64K

bpf-node-map-max

集群节点规模:可识别的 Node ID ↔ IP 映射数;跨节点 Pod 通信、IPsec/WireGuard 加密、Egress Gateway 都依赖此表。表满 → 新加入的节点无法参与数据面

16384

≥ 16384

集群节点数接近 5000

通过 Terway ConfigMap 的 cilium_args 字段统一配置,例如:

"cilium_args": "--bpf-map-dynamic-size-ratio=0.005 --bpf-policy-map-max=32768 --bpf-lb-map-max=131072"

关于在Terway中如何配置,请参见自定义Terway配置参数cilium_args相关内容。

bpf-map-dynamic-size-ratio

  • 功能:决定节点上同时可跟踪的连接数与 NodePort/SNAT 翻译条目数。表的容量 = 节点物理内存 × 此比例 / 单条记录大小,容量满时新连接无法建立,已有连接也可能被驱逐导致丢包。

  • 作用范围:CT (cilium_ct4_global / cilium_ct_any4_global)、NAT (cilium_snat_v4_external)、Neighbor (cilium_nodeport_neigh4)、SockRevNAT 这几张全局 Map 的容量,会按本参数 × 节点物理内存的比例动态计算

  • 取值范围(0.0, 1.0],默认 0.0025(即约 0.25% 的物理内存)。

  • 典型推算(参考 Cilium 默认元素大小):

    节点物理内存

    CT TCP 条目

    CT Any 条目

    NAT 条目

    512 MiB

    33,140

    16,570

    33,140

    1 GiB

    66,280

    33,140

    66,280

    4 GiB

    265,121

    132,560

    265,121

    16 GiB

    1,060,485

    530,242

    1,060,485

  • 上下限保护:动态计算结果会被钳制到 [1Ki, 16Mi](约 1GiB 内存/张 Map)之间,单 Map 上限为 2^24 = 16,777,216 条目。

  • 调优建议

    • 高并发服务(每节点万级以上长连接)的节点,建议适度提升至 0.005~0.01,让 CT/NAT 在大内存节点上获得更多条目。

    • 显式设置了bpf-ct-global-tcp-max/bpf-ct-global-any-max/bpf-nat-global-max的 Map 不会被本参数覆盖。

    • 如果通过监控 BPF Map 使用率观察到 cilium_ct4_global 等 Map 的cilium_bpf_map_pressure持续 >0.8,应优先调整本比例或为相应 Map 显式指定容量。

bpf-policy-map-max

  • 作用范围:每个 Endpoint(每个 Pod)独立持有一张 cilium_policy_* Map,存放允许该 Endpoint 收发流量的对端 Identity × 端口/协议 条目,用于 NetworkPolicy 数据面执行。

  • 默认值16384最小值 256 (2^8),最大值 65536 (2^16);超出范围会被自动裁剪并打印 warning。

  • 何时需要调整

    • 集群启用了 NetworkPolicy 且 Identity 数量较多(参见限制Identity数量章节)。

    • 单个 Pod 需要访问的对端 Identity 数 × 暴露端口/协议组合数接近默认 16384。

    • 通过指标 cilium_bpf_map_pressure{map_name=~"cilium_policy_.*"} 观察到压力持续 >0.8。

  • 调整方式:在 Terway ConfigMap 的cilium_args中追加 --bpf-policy-map-max=32768,重启 terway-eniip Pod 生效。

  • 注意:每张 Map 占用的内存与max_entries成正比,每个节点上 Map 数量等于该节点 Pod 数量。盲目设置到 65536 会显著增加节点内存开销,请结合实际 Identity 规模评估。

bpf-node-map-max

  • 功能:决定集群可识别的最大节点规模。所有节点的 Node ID ↔ IP 映射存在这一张全局 Map 中,是跨节点 Pod 通信、IPsec/WireGuard 加密、Egress Gateway 等节点级特性的基础数据。表满后新加入的节点无法被数据面识别,跨节点流量会失败。

  • 作用范围:单张 cilium_node_map_v2 存放集群内所有 Node 的 Node ID ↔ IP 映射,用于跨节点 Pod 通信、Encryption、Egress Gateway 等场景。

  • 默认值16384(约可承载 1.6 万个唯一 Node IP)。

  • 限制:源码硬编码 不允许设置低于默认值 16384,启动时如果 bpf-node-map-max < 16384 会直接报错退出;上限受uint32约束(理论最大 4,294,967,295),但实际取决于节点内存。

  • 何时需要调整

    • 集群规模即将逼近 1.6 万节点,或开启 IPsec/WireGuard 等需要每节点条目膨胀的功能时。

    • 通过指标 cilium_bpf_map_pressure{map_name="cilium_node_map_v2"} 观察到压力 >0.8。

  • 调整方式:在cilium_args中追加 --bpf-node-map-max=32768,重启 terway-eniip Pod 生效。

说明

如果节点开启双栈或者获取到其他地址,一个节点可占用2、3个条目。

bpf-lb-map-max

  • 功能:决定全集群 Kubernetes Service 在数据面的下发能力,覆盖 ClusterIP、NodePort、LoadBalancer 三种类型,以及它们对应的后端、反向 NAT、会话亲和性、Maglev 哈希表等所有 LB 子 Map。表满后,新创建的 Service / 新增的后端 Pod 无法写入 BPF,表现为 Service IP 访问不通或端点更新延迟。

  • 作用范围:Cilium 使用名为 cilium_lb{4,6}_services_v2 的 LB Service Maps 来保存 ClusterIP 和 NodePort 类型服务的负载均衡条目。本参数同时作为以下 LB 子 Map 的默认上限(如未单独指定):

    • cilium_lb4_services_v2 / cilium_lb6_services_v2

    • cilium_lb4_backends_v3 / cilium_lb6_backends_v3

    • cilium_lb4_reverse_nat / cilium_lb6_reverse_nat

    • cilium_lb4_affinity / cilium_lb6_affinity

    • cilium_lb4_source_range / cilium_lb6_source_range

  • 默认值65536(64Ki)。如果此映射已满,Cilium 可能无法更新服务端点,影响服务 IP 的连通性或创建新服务的能力。

  • 容量估算:每个 ClusterIP/NodePort 服务创建的条目数等于该服务后端 Pod 数 × Service spec 中端口/协议组合数。

服务 LB 映射所需的大小取决于多个因素。

每个 ClusterIP/NodePort 服务创建的条目数量等于该服务选择的后端 Pod 数量乘以相应 Service spec 中的端口、协议条目数量。

利用这一点,我们可以粗略估算所需的映射大小为:

注意这种估算假设每个服务选择的 Pod 数量和端口/协议条目数大致呈正态分布。如果您的用例存在较大的异常值(例如,某个服务选择了非常大量的 Pod 后端),则可能需要进行更详细的估算。
警告

调整bpf-lb-map-max参数并重启 Cilium 会导致连接中断,因为新映射需要重新填充现有的服务条目。