节点ARP表项超过限制
问题现象
ARP缓存超限,容器网络的访问出现异常,例如coredns域名解析概率失败。
问题根因
出现该问题的原因是节点上容器缓存的ARP表项超过限制。
问题定位
- 在节点操作系统内核为4.3以上时,dmsg日志中会有显性的打印neighbor table overflow字样。详情请参见社区链接:link。
# dmesg -T [Tue May 30 18:35:55 2023] neighbour: arp_cache: neighbor table overflow! [Tue May 30 18:35:55 2023] neighbour: arp_cache: neighbor table overflow! [Tue May 30 18:35:55 2023] neighbour: arp_cache: neighbor table overflow! [Tue May 30 18:35:55 2023] neighbour: arp_cache: neighbor table overflow! [Tue May 30 18:35:55 2023] neighbour: arp_cache: neighbor table overflow! [Tue May 30 18:35:55 2023] neighbour: arp_cache: neighbor table overflow! [Tue May 30 18:35:55 2023] neighbour: arp_cache: neighbor table overflow! [Tue May 30 18:35:55 2023] neighbour: arp_cache: neighbor table overflow! [Tue May 30 18:35:55 2023] neighbour: arp_cache: neighbor table overflow! [Tue May 30 18:35:58 2023] print_fib4_table_status: 7 callbacks suppressed [Tue May 30 18:35:59 2023] print_fib4_table_status: 23 callbacks suppressed [Tue May 30 18:36:00 2023] print_fib4_table_status: 16 callbacks suppressed [Tue May 30 18:36:03 2023] print_fib4_table_status: 7 callbacks suppressed [Tue May 30 18:36:04 2023] print_fib4_table_status: 17 callbacks suppressed [Tue May 30 18:37:38 2023] net_ratelimit: 7966 callbacks suppressed [Tue May 30 18:37:38 2023] neighbour: arp_cache: neighbor table overflow!
- 在节点操作系统内核低于4.3时,不会显示打印,若有callbacks suppressed字样,则也有可能是ARP表超限导致。
解决办法
节点最大可允许的非永久表项数量由内核参数net.ipv4.neigh.default.gc_thresh3确定,此内核参数非namespace隔离,节点和节点上运行容器会共用ARP表项大小。容器场景下,该参数推荐设置为163790。
此内核参数计算公式如下:
- CCE Turbo集群&容器隧道网络模型集群:
net.ipv4.neigh.default.gc_thresh3 = 单节点容器个数*容器子网可用IP数(Turbo集群多容器子网情况下,取容器子网可用IP数较大值)
举例:当前容器子网为192.168.0.1/20,可用地址为4096个,单节点容器部署密度最大为35个,那么net.ipv4.neigh.default.gc_thresh3建议配置为4096*35=143360个。
- VPC网络模式集群:
net.ipv4.neigh.default.gc_thresh3 = (单节点容器个数)^2
举例:当前节点容器小网段掩码为25,则单节点容器可用地址为个128个,那么net.ipv4.neigh.default.gc_thresh3建议配置为128*128=16384个。
以上计算公式均为最极端场景:
1. 节点上的所有容器都会主动连接容器关联子网的所有IP地址,如网关类容器需要链接集群内所有其他容器。
2. 容器关联的子网所有的IP地址都被容器使用。
- 在88-k8s.conf中,将net.ipv4.neigh.default.gc_thresh3的值修改为163790。
vi /etc/sysctl.d/88-k8s.conf
net.ipv4.neigh.default.gc_thresh1和net.ipv4.neigh.default.gc_thresh2参数禁止修改。
- 重新加载配置文件。
sysctl -p /etc/sysctl.d/88-k8s.conf
- 再次查看配置是否最终生效。
sysctl -a | grep gc_thresh3