全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

Kube-Proxy IPVS模式的conn_reuse_mode问题

最近更新时间:2024-09-20 17:19:40

问题说明

对于节点内核版本小于5.9的场景,KCE集群在IPVS模式下,通过Service方式访问集群内部服务,会小概率出现Service访问失败或出现1秒访问延时的情况,该问题的主要原因为Linux内核IPVS连接复用Bug。

IPVS连接复用参数说明

ipvs连接复用策略主要由内核参数net.ipv4.vs.conn_reuse_mode控制:

  1. 当net.ipv4.vs.conn_reuse_mode=1时,ipvs会对新连接进行重新负载。

  2. 当net.ipv4.vs.conn_reuse_mode=0时,ipvs复用之前的负载结果,将新连接转发到原来的RS上。

IPVS连接复用参数引入问题

在绝大多数内核版本上,net.ipv4.vs.conn_reuse_mode无论设置为1还是0,都存在问题

  1. 当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

  2. 当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转发表中移除。

对KCE集群影响

集群内节点内核版本低于5.9,查看集群节点内核版本方式

uname -r

建议

新建集群:推荐使用高版本内核(大于5.9)规避此问题。金山云提供的内核版本大于5.9的操作系统有:Ubuntu 22.04

存量集群:如已遇到IPVS连接复用参数问题,请对节点操作系统重装,参考重装系统

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈