升级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
以上。