升级Kubernetes到1.18时发现1个严重的问题:
首先是发现部分Services无法访问,经过各种检查最终发现当Pod重启后,就无法访问。
搭建一个测试的Deployment和Service,进行问题排查:Deployment如下:
1 | apiVersion: apps/v1 |
Service如下:
1 | apiVersion: v1 |
再启动一个curl进行测试:
1 | kubectl run curl --image=radial/busyboxplus:curl -it |
正确情况如下:
1 | [ root@curl-69c656fd45-ztblt:/ ]$ curl hostnames |
可以通过Service正常访问到Pod。
现在删除掉hostnames的Pod,等到Pod运行正常时,再次执行:
1 | [ root@curl-69c656fd45-ztblt:/ ]$ curl hostnames |
通过检查确定DNS没有问题,通过Pod的IP,可以正常访问,通过Service的IP就无法访问了。也就是说,升级Kubernetes V1.18(我的版本是V1.18.2),就会导致Pod重新启动后,Service无法访问。
那么现在重点是Proxy的检查,我使用的是模式是ipvs,检查ipvs列表。
在master或其他节点上执行:
1 | [root@node01 ~]# ipvsadm -L |grep -A 5 10.103.122.243 |
10.103.122.243为Service的IP, 而转发地址10.244.10.237:9376是老的Pod的地址,不是新Pod的地址,这样肯定无法访问。再次验证一下这个原因,将转发修改正确:
1 | [root@node01 ~]# ipvsadm -D -t 10.103.122.243:http |
第一句是删除老的转发,第二句是新增正确的转发。其中10.244.10.238是新的Pod的的地址
进入curl容器执行:
1 | [ root@curl-69c656fd45-ztblt:/ ]$ curl hostnames |
看到结果已经正常。这个确定了导致这个问题的原因是ipvs规则没有更新。经过确定,需要升级Liunx的内核到V4以上。