TKE 容器网络中的 ARP Overflow 问题探究及其解决之道

作者朱瑜坚,腾讯云后台开发工程师,熟悉 CNI 容器网络相关技术,负责腾讯云 TKE 的容器网络的构建和相关网络组件的开发维护工作,作为主力开发实现了 TKE 下一代容器网络方案。

1. 问题背景 1.1 问题描述

最近,某内部客户的 TKE VPC-CNI 模式的独立网卡集群上出现了 pod 间访问不通的情况,问题 pod ping 不通任何其他 pod 和节点。

查看 dmesg 内核日志,有如下报错信息:neighbour: arp_cache: neighbor table overflow!(下图为后续复现的日志截图)

TKE 容器网络中的 ARP Overflow 问题探究及其解决之道

并且,这个集群规模较大,约有 1000 个节点,30000 个 pod,基本可以怀疑是由于集群规模较大,导致 ARP 表项过多,从而引起 ARP Overflow 的问题。

1.2 名词解释 名词 说明
TKE   全称 Tencent Kubernetes Engine, 腾讯云容器服务,是基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务  
VPC-CNI 模式   是容器服务 TKE 基于 CNI 和 VPC 弹性网卡实现的容器网络能力  
Pod   Pod 是 kubernetes 的基本资源管理单位,拥有独立的网络命名空间,1个 Pod 可包含多个容器  
2. 问题初步分析

从如上报错信息可知,这个问题的基本原因在于 ARP 缓存表打满了。这里涉及到内核的 ARP 缓存垃圾回收机制。当 ARP 表项太多且又没有可回收的表项的时候,新表项就会无法插入。

这就导致网络包发送时无法找到对应的硬件地址(MAC)。使得网络包不能发送。

那么具体什么情况会导致新表项无法插入呢?回答这个问题,我们需要先深入了解一下 ARP 缓存老化及垃圾回收机制。

3. ARP 缓存老化回收机制 3.1 ARP 缓存表项状态机

TKE 容器网络中的 ARP Overflow 问题探究及其解决之道

如上图,是整个 ARP 表项的生命周期及其状态机。

我们知道,对于 TCP/IP 网络包发送时,网络栈需要对端的 MAC 地址才能让网络包转换成二层的数据结构——帧,从而在网络中传输。而对于不同广播域的 IP 地址,其对端 MAC 地址为网关,发送端会将网络包发给网关让其转发,而对于同广播域中的 IP 地址,其对端 MAC 地址即与 IP 地址对应。

而通过 IP 地址找到 MAC 地址就是 ARP 协议的主要工作内容。ARP 协议的工作过程此处不再赘述,而通过 ARP 协议找到 IP 地址对应的 MAC 地址后,会将该对应关系存储在本机上一段时间,以减少 ARP 协议的通信频率,加快网络包的发送。该对应关系,即 ARP 缓存表项,其状态机或整个生命周期可描述如下:

初始时,对于任何网络包发送时,内核协议栈需要找到目的 IP 地址对应的对端 MAC 地址,如果这时 ARP 缓存中没有命中,则会新插入一条状态为 Incomplete 的表项。Incomplete 状态会尝试发送 ARP 包,请求某 IP 地址对应的 MAC 地址。

若收到 ARP 回应的,表项状态就变为 Reachable。

若尝试了一定次数后没收到响应,表项即变为 Failed。

Reachable 表项在到达超时时间后,会变成 Stale 状态,Stale 状态的表项已不可再使用。

Stale 的表项若有被引用来发包,则表项会变为 Delay 状态。

Delay 状态的表项也不可使用来发包,但在 Delay 状态到期前,收到 ARP 的本机确认,则重新转为 Reachable 状态。

Delay 状态到期,表项变为 Probe 状态,该状态与 Incomplete 状态类似。

Stale 状态到期后,会被启动的垃圾回收起回收删除。

通过以下命令可查看当前网络命名空间(network namespace) 中 arp 表项及其状态:

ip neigh

如:

TKE 容器网络中的 ARP Overflow 问题探究及其解决之道

本机确认:这是代指本机收到了一个源 mac 地址匹配的网络包,这个网络包表示此次网络通信的“上一跳”即是该 mac 地址的机器,能收到这个网络包即说明该 mac 地址可达。因此即可把该表项转为 Reachable 状态。通过这一机制,内核可减少 ARP 的通信需求。

3.2 涉及到的内核参数

以下列出了该机制中主要涉及的内核参数:

参数 含义 默认值
/proc/sys/net/ipv4/neigh/default/base_reachable_time   Reachable 状态基础过期时间,每个表项过期时间是在[1/2base_reachable_time,3/2base_reachable_time]之间   30秒  
/proc/sys/net/ipv4/neigh/default/base_reachable_time_ms   Reachable 状态基础过期时间,毫秒表示   30秒  
/proc/sys/net/ipv4/neigh/default/gc_stale_time   Stale 状态过期时间   60秒  
/proc/sys/net/ipv4/neigh/default/delay_first_probe_time   delay 状态过期到 Probe 的时间   5秒  
/proc/sys/net/ipv4/neigh/default/gc_interval   gc 启动的周期时间   30秒  
/proc/sys/net/ipv4/neigh/default/gc_thresh1   少于这个值,gc 不会启动   2048  
/proc/sys/net/ipv4/neigh/default/gc_thresh2   ARP表的最多纪录的软限制,允许超过该数字5秒   4096  
/proc/sys/net/ipv4/neigh/default/gc_thresh3   ARP表的最多纪录的硬限制,大于该数目,gc立即启动,并强制回收   8192  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxsjg.html