0%

Kubernetes V1.18 ipvs故障

升级Kubernetes1.18时发现1个严重的问题:

首先是发现部分Services无法访问,经过各种检查最终发现当Pod重启后,就无法访问。

搭建一个测试的DeploymentService,进行问题排查:Deployment如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostnames
spec:
selector:
matchLabels:
app: hostnames
replicas: 1
template:
metadata:
labels:
app: hostnames
spec:
containers:
- name: hostnames
image: mirrorgooglecontainers/serve_hostname
ports:
- containerPort: 9376
protocol: TCP

Service如下:

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: hostnames
spec:
selector:
app: hostnames
ports:
- name: default
protocol: TCP
port: 80
targetPort: 9376

再启动一个curl进行测试:

1
kubectl run curl --image=radial/busyboxplus:curl -it

正确情况如下:

1
2
[ root@curl-69c656fd45-ztblt:/ ]$ curl hostnames
hostnames-dd4cc9dd9-5k42b

可以通过Service正常访问到Pod

现在删除掉hostnamesPod,等到Pod运行正常时,再次执行:

1
2
[ root@curl-69c656fd45-ztblt:/ ]$ curl hostnames
connect to hostnames failed: No route to host

通过检查确定DNS没有问题,通过PodIP,可以正常访问,通过ServiceIP就无法访问了。也就是说,升级Kubernetes V1.18(我的版本是V1.18.2),就会导致Pod重新启动后,Service无法访问。

那么现在重点是Proxy的检查,我使用的是模式是ipvs,检查ipvs列表。
master或其他节点上执行:

1
2
3
4
5
6
7
[root@node01 ~]# ipvsadm -L |grep -A 5 10.103.122.243
TCP 10.103.122.243:http rr
-> 10.244.10.237:9376 Masq 1 0 0
TCP 10.103.123.173:webcache rr
-> 10.244.9.26:webcache Masq 1 0 0
TCP 10.103.143.242:6379 rr
-> 10.244.9.229:6379 Masq 1 0 0

10.103.122.243ServiceIP, 而转发地址10.244.10.237:9376是老的Pod的地址,不是新Pod的地址,这样肯定无法访问。再次验证一下这个原因,将转发修改正确:

1
2
3
[root@node01 ~]# ipvsadm -D -t 10.103.122.243:http 

[root@node01 ~]# ipvsadm -a -t 10.103.122.243:http -r 10.244.10.238:9376 -m

第一句是删除老的转发,第二句是新增正确的转发。其中10.244.10.238是新的Pod的的地址

进入curl容器执行:

1
2
[ root@curl-69c656fd45-ztblt:/ ]$ curl hostnames
hostnames-dd4cc9dd9-5k42b

看到结果已经正常。这个确定了导致这个问题的原因是ipvs规则没有更新。经过确定,需要升级Liunx的内核到V4以上。

坚持原创技术分享,您的支持将鼓励我继续创作!