更新时间:2024-11-13 GMT+08:00

节点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地址都被容器使用。

  1. 在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参数禁止修改。

  2. 重新加载配置文件。

    sysctl -p /etc/sysctl.d/88-k8s.conf

  3. 再次查看配置是否最终生效。

    sysctl -a | grep gc_thresh3