优化DataPlane V2模式下conntrack配置
conntrack是连接跟踪机制的一种实现,用于跟踪和记录网络连接的状态,例如TCP连接的状态(SYN、ESTABLISHED、CLOSED等)。开启DataPlane V2后,集群对应的conntrack信息不再存储在Linux conntrack表里,而是存储在eBPF map里。
当前DataPlane V2默认启用cilium的配置参数“--bpf-map-dynamic-size-ratio=0.0025”,此参数表示几个大型eBPF map的上限容量根据节点总内存量计算得出,且最少条目数会确保131072,详见cilium eBPF map。而kube-proxy会根据机器的核数设置Linux conntrack表的最大条目数。kube-proxy的默认设置为每核最多32768个条目,且无论机器核数多少,最小条目数始终为131072。
下表展示了当cilium配置参数为“--bpf-map-dynamic-size-ratio=0.0025”时,kube-proxy和cilium为其各自的连接跟踪表设置的值。
| vCPU | Memory (GiB) | Kube-proxy CT entries | Cilium CT entries |
|---|---|---|---|
| 1 | 3.75 | 131072 | 131072 |
| 2 | 7.5 | 131072 | 131072 |
| 4 | 15 | 131072 | 131072 |
| 8 | 30 | 262144 | 284560 |
| 16 | 60 | 524288 | 569120 |
| 32 | 120 | 1048576 | 1138240 |
| 64 | 240 | 2097152 | 2276480 |
| 96 | 360 | 3145728 | 4552960 |
检查当前conntrack配置
若您需要查看DataPlane V2一个节点当前conntrack表大小,您可以执行以下操作。
- 获取节点yangtse-cilium Pod名称。
kubectl describe node <nodename> | grep yangtse-cilium预期回显如下:
kube-system yangtse-cilium-tdhzb 100m (5%) 1 (51%) 128Mi (0%) 0 (0%) 1d
- 检查conntrack表大小。
kubectl exec -it -nkube-system yangtse-cilium-tdhzb -- cilium status --verbose | grep -A23 "BPF Maps"
以下示例是8G节点上的输出:
BPF Maps: dynamic sizing: on (ratio: 0.002500) Name Size Auth 524288 Non-TCP connection tracking 65536 TCP connection tracking 131072 Endpoints 65535 IP cache 512000 IPv4 masquerading agent 16384 IPv6 masquerading agent 16384 IPv4 fragmentation 8192 IPv4 service 65536 IPv6 service 65536 IPv4 service backend 65536 IPv6 service backend 65536 IPv4 service reverse NAT 65536 IPv6 service reverse NAT 65536 Metrics 1024 Ratelimit metrics 64 NAT 131072 Neighbor table 131072 Endpoint policy 16384 Policy stats 65536 Session affinity 65536 Sock reverse NAT 65536
部分关键输出项说明如下:
主要输出项
默认值
主要作用
配置参数
dynamic sizing: on
0.0025
根据系统总内存比例确定eBPF Map的大小,包含以下Map:
- cilium_ct_{4,6}_global
- cilium_ct_{4,6}_any
- cilium_nodeport_neigh{4,6}
- cilium_snat_v{4,6}_external
- cilium_lb{4,6}_reverse_sk
bpf-map-dynamic-size-ratio
Non-TCP connection tracking
65536
非TCP连接跟踪Map,主要用于UDP、ICMP等无连接协议的反向包匹配,对应的eBPF Map名为cilium_ct_any{4,6}_global 。
bpf-ct-global-any-max
TCP connection tracking
131072
TCP连接跟踪Map,记录TCP连接五元组、方向、状态、revNAT信息等,对应的eBPF Map名为cilium_ct{4,6}_global。
bpf-ct-global-tcp-max
NAT
131072
BPF NAT/SNAT Map,常见于BPF masquerade、NodePort SNAT、egress SNAT等路径。
NAT Map大小不能超过TCP+ Non-TCP CT 总容量的2/3。
bpf-nat-global-max
Sock reverse NAT
65536
Socket LB 反向NAT Map,主要用于UDP和 getpeername()
bpf-sock-rev-map-max
调整conntrack配置
eBPF的conntrack和Linux的conntrack在功能上相同,默认配置可以满足大部分业务场景的需要,无需调整。
- 目前只有Dataplane V2 2.1.1及以上插件版本支持自定义配置。
- 调整conntrack大小为高危操作,请充分验证后再应用到生产环境。
当您的业务符合下面场景时,请根据业务需要合理调整配置。
| 业务场景 | CCE Standard集群(VPC网络模型) | CCE Turbo集群 |
|---|---|---|
| bpf-ct-global-tcp-max: "524288" bpf-ct-global-any-max: "262144" bpf-nat-global-max: "524288" bpf-sock-rev-map-max: "262144" | bpf-ct-global-tcp-max: "524288" bpf-ct-global-any-max: "262144" bpf-nat-global-max: "524288" bpf-sock-rev-map-max: "262144" |
| bpf-ct-global-tcp-max: "2097152" bpf-ct-global-any-max: "524288" bpf-nat-global-max: "1048576" bpf-sock-rev-map-max: "524288" | bpf-ct-global-tcp-max: "1048576" bpf-ct-global-any-max: "524288" bpf-nat-global-max: "524288" bpf-sock-rev-map-max: "524288" |
| bpf-ct-global-tcp-max: "4194304" bpf-ct-global-any-max: "1048576" bpf-nat-global-max: "2097152" bpf-sock-rev-map-max: "1048576" | bpf-ct-global-tcp-max: "2097152" bpf-ct-global-any-max: "1048576" bpf-nat-global-max: "1048576" bpf-sock-rev-map-max: "1048576" |
您可以根据您的业务规模创建如下cilium社区原生的ConfigMap配置。
apiVersion: v1 kind: ConfigMap metadata: name: cilium-config namespace: kube-system data: bpf-ct-global-tcp-max: "524288" bpf-ct-global-any-max: "262144" bpf-nat-global-max: "524288" bpf-sock-rev-map-max: "262144"
当您配置好cilium-config,您可以通过执行以下命令滚动重建yangtse-cilium即可生效:
uuid=$(uuidgen)
kubectl patch daemonset -nkube-system yangtse-cilium --type='json' -p="[{\"op\": \"add\", \"path\": \"/spec/template/metadata/annotations/change-id\", \"value\": \"$uuid\"}]"