k8s集群curl service的ip延迟响应高

问题描述

qq群的小伙伴,在昨天提了个问题,说在master节点上curl service的ip不通,故写下排查问题的过程。

解决过程

首先想到的是,master节点安没安装kube-proxy,小伙伴已确认安装,并说curl了一会能通,但是很慢。

查kube-proxy日志

1
可以看到报错有timeout情况,应该只是时间过长

通过curl命令观察具体时间

1
curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}"\n" "ip地址"

小伙伴回答超时时间为63s,看到63s我就想到ipvs tcpfin的等待时间默认为2分钟,一般会多等3s,正好达到这个timeout超时的时间。后经过确认,他用的是iptables模式,但是集群已经是k8s1.18的版本了,故换下ipvs试一下。

小伙伴修改iptables模式为ipvs

换完ipvs后,发现kube-proxy还有报错。

通过 kube-proxy Pod 的日志可以看到,里面有很多 Error 级别的日志信息,根据关键字 IPVSparseIP Error 可知,可能是由于 IPVS 模块对 IP 进行格式化导致出现问题。

因为这个问题是升级到 kubernetes 1.18 版本才出现的,所以去 Kubernetes Github 查看相关 issues,发现有人在升级 Kubernetes 版本到 1.18 后,也遇见了相同的问题,经过 issue 中 Kubernetes 维护人员讨论,分析出原因可能为新版 Kubernetes 使用的 IPVS 模块是比较新的,需要系统内核版本支持,小伙伴使用的是 CentOS 系统,内核版本为 3.10,里面的 IPVS 模块比较老旧,缺少新版 Kubernetes IPVS 所需的依赖。

问题解决

将iptables模式换为ipvs,并内核升级为4.4以上,问题解决。

参考链接

Donate