conntrack是连接跟踪机制的一种实现,用于跟踪和记录网络连接的状态,例如TCP连接的状态(SYN、ESTABLISHED、CLOSED等)。在Terway Datapath V2或者IPvlan模式下,容器内流量对应的conntrack信息在eBPF map内存储,其他模式下conntrack信息在Linux conntrack存储。本文介绍如何调整eBPF conntrack大小。
检查当前conntrack大小上限
eBPF记录的conntrack表大小依据节点内存而不同,
若您需要查看一个节点当前conntrack表大小,您可以执行下面命令
- 获取节点terway-eniip Pod名称。 
# kubectl describe node <nodename>  | grep terway-eniip
  kube-system                 terway-eniip-xxxx         350m (8%)     1100m (28%)  200Mi (3%)       256Mi (3%)     16h- 检查conntrack表大小。 
# kubectl exec -it -nkube-system terway-eniip-xxxx -c policy -- cilium status --verbose
...
BPF Maps:   dynamic sizing: on (ratio: 0.002500)
  Name                          Size
  Auth                          524288
  Non-TCP connection tracking   65536
  TCP connection tracking       131072
  Endpoint policy               65535
...显示内容说明:
dynamic sizing: on:启用根据系统总内存比例确定eBPF Map的上限,如果显示off请手动设置bpf-map-dynamic-size-ratio启用动态调整,或手动指定bpf-ct-global-any-max,bpf-ct-global-tcp-max,bpf-nat-global-max大小。
ratio: 0.002500:根据系统总内存比例确定eBPF Map的上限。
Non-TCP connection tracking:非TCP连接跟踪表上限。
TCP connection tracking:TCP连接跟踪表上限。
检查当前conntrack占用数量
每个节点默认会暴露一个Promtheus metric端口。默认端口为9962。您可以通过监控采集组件采集下面的指标。
| 指标 | 标签与值 | 
| cilium_datapath_conntrack_gc_entries | family: IP地址类型。可选值: protocol: 协议类型。可选值: status: 清理状态。将全部状态统计在一起,可以得出清理前,Conntrack条目数。可选值: | 
调整默认监控端口
| 配置参数 | 说明 | 
| prometheus-serve-addr | prometheus接口监听地址。设置 
 | 
修改参数方式请参考自定义Terway配置参数章节操作cilium_args部分。
调整eBPF conntrack大小配置
在eBPF的conntrack和Linux的conntrack在功能上相同,默认配置可以满足大部分业务场景的需要,无需调整。
当您的业务符合下面场景时,需要根据业务需要调整配置。
- 大量长链接 
- Pod直接暴露到公网的,可能存在大量半开链接场景 
调整conntrack大小为高危操作,请充分验证后应用到生产环境。配置后可按照检查当前conntrack大小部分验证是否生效。
| 配置参数 | 说明 | 
| bpf-map-dynamic-size-ratio | 根据系统总内存比例确定eBPF Map的上限。 
 
 | 
| bpf-ct-timeout-regular-any | 非TCP连接跟踪表中条目的超时时间。 默认值: | 
| bpf-ct-timeout-regular-tcp | TCP连接跟踪表中已建立连接的条目的超时时间。 默认值: | 
| bpf-ct-timeout-regular-tcp-fin | TCP连接跟踪表中关闭中连接的超时时间。 默认值: | 
| bpf-ct-timeout-regular-tcp-syn | TCP连接跟踪表中建立连接的超时时间。 默认值: | 
| bpf-ct-timeout-service-any | 非TCP服务连接跟踪表中条目的超时时间。 默认值: | 
| bpf-ct-timeout-service-tcp | TCP服务连接跟踪表中已建立服务连接的超时时间。 默认值: | 
| bpf-ct-timeout-service-tcp-grace | TCP服务连接跟踪表中优雅关闭服务的超时时间。 默认值: | 
| conntrack-gc-interval | conntrack 清理周期。 默认值: 说明  cilium-agent主动清理conntrack的周期,您配置的时间,不应该大于默认值。 配置较短的清理周期,将消耗cilium-agent更多CPU,但可以避免conntrack满。您可以在控制台调整Terway容器CPU Limit配置。 | 
| bpf-ct-global-any-max | 非TCP服务连接跟踪表大小。 说明  在启用动态大小(dynamic sizing: on)的情况下,建议使用  | 
| bpf-ct-global-tcp-max | TCP服务连接跟踪表大小。 说明  在启用动态大小(dynamic sizing: on)的情况下,建议使用  | 
| bpf-nat-global-max | bpf NAT 表大小。 说明  bpf-nat-global-max 需小于 bpf-ct-global-any-max + bpf-ct-global-tcp-max 默认配置大小为 (bpf-ct-global-any-max + bpf-ct-global-tcp-max)*2/3 在启用动态大小(dynamic sizing: on)的情况下,建议使用  | 
修改参数方式请参考自定义Terway配置参数章节操作cilium_args部分。
设置bpf-map-dynamic-size-ratio为0.0025情况下,不同大小内存的机器中不同map大小如下表所示:
| 节点内存 | CTMapSizeTCP | CTMapSizeAny | NATMapSize | 
| 7.5GiB | 131072 | 65536 | 131072 | 
| 16GiB | 151765 | 75882 | 151765 | 
| 30GiB | 284560 | 142280 | 284560 | 
| 240GiB | 2276484 | 1138242 | 2276484 | 
配置示例
将bpf-map-dynamic-size-ratio调整为0.003,将bpf-ct-timeout-regular-tcp调整为1h。
10-terway.conf: |
{
  "cniVersion": "0.4.0",
  "name": "terway",
  "capabilities": {"bandwidth": true},
  "eniip_virtual_type": "IPvlan",
  "cilium_args": "--bpf-map-dynamic-size-ratio=0.003 --bpf-ct-timeout-regular-tcp=1h",
  "type": "terway"
}