
# 节点ARP表项超过限制
#### 问题现象
ARP缓存超限，容器网络的访问出现异常，例如coredns域名解析概率失败。
#### 问题根因
出现该问题的原因是节点上容器缓存的ARP表项超过限制。
#### 问题定位
- 在节点操作系统内核为4.3及以上时，dmesg日志中会有显性的打印neighbor table overflow字样。详情请参见社区链接：[link](https://github.com/torvalds/linux/commit/fb811395cd5a71b9e94a068f524a6f4a21b67bdb)。
  ```
  # 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表超限导致。 ![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0000001640412696.png "点击放大")
  
 
#### 解决办法
节点最大可允许的非永久表项数量由内核参数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个。
  
![](https://support.huaweicloud.com/cce_faq/public_sys-resources/note_3.0-zh-cn.png)
以上计算公式均为最极端场景：
1. 节点上的所有容器都会主动连接容器关联子网的所有IP地址，如网关类容器需要连接集群内所有其他容器。
2. 容器关联的子网所有的IP地址都被容器使用。
1. 在88-k8s.conf中，将net.ipv4.neigh.default.gc_thresh3的值修改为163790。 
   ```
   vi /etc/sysctl.d/88-k8s.conf
   ```
   ![](https://support.huaweicloud.com/cce_faq/public_sys-resources/note_3.0-zh-cn.png)
   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
   ```
   ![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0000001645699622.png "点击放大")
   
   
 
