本文介绍在使用Terway网络插件的集群中,启用Datapath V2后如何优化集群的网络配置,例如Conntrack参数配置、Identity资源管理等,以提升集群性能和稳定性。
优化Conntrack配置
Conntrack是Linux内核中的连接跟踪模块,用于跟踪网络连接的状态。在Datapath V2模式下,容器网络的Conntrack由eBPF程序提供。您可以参见优化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 版本后才提供,请升级至最新版本。
指标名 | 类型 | 说明 |
| Gauge | 最重要。Map 当前条目占 |
| Gauge | Map 容量 |
| Counter | Map 操作计数,按 |
| 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/服务条目需要重新填充,可能造成短暂的连接抖动。请避开业务高峰,并分批滚动。
参数总览
参数 | 影响功能 | 默认值 | 取值范围 | 何时调整 |
| 连接跟踪与 NAT:节点上可同时存活的 TCP/UDP 连接数、NodePort / SNAT 翻译条目数。表满 → 新建连接失败、丢包 |
|
| 节点跑高并发或长连接业务,CT/NAT Map 压力偏高 |
| NetworkPolicy(每个 Pod):单个 Pod 数据面可承载的策略规则数(允许通信的 Identity × 端口/协议 组合)。表满 → 策略规则下发被截断,行为不符合预期 |
|
| 启用了 NetworkPolicy,且 Identity 较多或单 Pod 访问的对端范围广 |
| Kubernetes Service(全节点):ClusterIP / NodePort / LoadBalancer 在数据面下发的条目总数。表满 → 新 Service 或后端 Pod 无法下发,Service IP 不通 |
| 不强制上限(受内存约束) | 集群 Service 数 × 平均后端 Pod 数 接近默认 64K |
| 集群节点规模:可识别的 Node ID ↔ IP 映射数;跨节点 Pod 通信、IPsec/WireGuard 加密、Egress Gateway 都依赖此表。表满 → 新加入的节点无法参与数据面 |
|
| 集群节点数接近 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_v2cilium_lb4_backends_v3/cilium_lb6_backends_v3cilium_lb4_reverse_nat/cilium_lb6_reverse_natcilium_lb4_affinity/cilium_lb6_affinitycilium_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 会导致连接中断,因为新映射需要重新填充现有的服务条目。