最近更新时间:2024-09-20 17:19:40
对于节点内核版本小于5.9的场景,KCE集群在IPVS模式下,通过Service方式访问集群内部服务,会小概率出现Service访问失败或出现1秒访问延时的情况,该问题的主要原因为Linux内核IPVS连接复用Bug。
ipvs连接复用策略主要由内核参数net.ipv4.vs.conn_reuse_mode控制:
当net.ipv4.vs.conn_reuse_mode=1时,ipvs会对新连接进行重新负载。
当net.ipv4.vs.conn_reuse_mode=0时,ipvs复用之前的负载结果,将新连接转发到原来的RS上。
在绝大多数内核版本上,net.ipv4.vs.conn_reuse_mode无论设置为1还是0,都存在问题:
当net.ipv4.vs.conn_reuse_mode=1时,高并发场景下发生源端口与之前链接重复的情况,会重新进行调度,根据ip_vs_in()的处理逻辑,当开启了net.ipv4.vs.conntrack时,会先DROP掉第一个SYN包,等待重传(1秒)后才能建立连接,导致性能下降。因为这个原因,当 kube-proxy 使用 ipvs 转发模式时,默认将net.ipv4.vs.conn_reuse_mode置为 0 来规避这个问题,详见 PR #71114 与 issue #70747 。
当net.ipv4.vs.conn_reuse_mode=0时,开启连接复用,但 ipvs 连接复用有问题:只要源IP:源端口匹配上 ip_vs_conn 就直接转发给对应的 rs,不管 rs 当前处于何种状态,即使rs已经被删除/rs的权重为0。在高并发短链接的场景下,如果发生pod删除,连接复用会把请求转发到已删除的rs上,导致service访问失败。同时,由于一直有请求进来,ip_vs_conn的active_conn不为0,导致kube-proxy无法将已删除的rs从ipvs转发表中移除。
集群内节点内核版本低于5.9,查看集群节点内核版本方式
uname -r
新建集群:推荐使用高版本内核(大于5.9)规避此问题。金山云提供的内核版本大于5.9的操作系统有:Ubuntu 22.04
存量集群:如已遇到IPVS连接复用参数问题,请对节点操作系统重装,参考重装系统
纯净模式