问题描述
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 级别的日志信息,根据关键字 IPVS
、parseIP 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以上,问题解决。