
# 优化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](https://docs.cilium.io/en/stable/network/ebpf/maps/)。而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表大小，您可以执行以下操作。
1. 获取节点yangtse-cilium Pod名称。 
   ```
   kubectl describe node <nodename>  | grep yangtse-cilium
   ```
   预期回显如下：
   ```
   kube-system                yangtse-cilium-tdhzb                      100m (5%)     1 (51%)     128Mi (0%)       0 (0%)         1d
   ```
   
   
2. 检查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在功能上相同，默认配置可以满足大部分业务场景的需要，无需调整。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
- 目前只有Dataplane V2 2.1.1及以上插件版本支持自定义配置。
- 调整conntrack大小为**高危操作**，请充分验证后再应用到生产环境。
 
当您的业务符合下面场景时，请根据业务需要合理调整配置。
| 业务场景                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | CCE Standard集群（VPC网络模型）                                                                                                                                                                                                  | CCE Turbo集群                                                                                                                                                                                                            |
|:---|:---|:---|
| - 单节点Pod数 \< 80  - 单节点活跃TCP连接 \< 20万  - ClusterIP/NodePort数量不多                                                                                                                                                                              | 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" |
| - 单节点Pod数80～100  - 单节点活跃TCP连接20万～100万  - 节点上有Proxy代理业务  - 大量ClusterIP/NodePort/LoadBalancer                                                                                         | 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" |
| - 单节点Pod数100+  - 单节点活跃TCP连接100万～300万  - 节点是核心流量入口或出口  - 大量ClusterIP/NodePort/LoadBalancer  - BPF masquerade压力较高   | 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\"}]"
```
