困扰多年的 Kubernetes 健康检查问题终于解决了
我们有一个部署在 k8s 上的应用被一个健康检查问题困扰多年,每次发布时由于健康检查(readiness probe)失败,pod 要被重启很多次,快的话要等半小时到1小时 pod 才能启动成功,慢的话要等几小时甚至十几个小时,最近一次最夸张,pod 重启了2天才启动成功,重启了300多次。
NAME READY STATUS RESTARTS AGE IP
i-web-2.1.374-75d745d9f-8l4zm 1/2 Running 328 (84s ago) 35h 192.168.39.73
pod 重启是因为健康检查时出现 connection refused
错误
Liveness probe failed: Get "http://192.168.242.152:80/alive": dial tcp 192.168.242.152:80: connect: connection refused
Container i-web failed liveness probe, will be restarted
Readiness probe failed: Get "http://192.168.242.152:80/alive": dial tcp 192.168.242.152:80: connect: connection refused
昨天终于找到了原因,是 deployment 中 volumeMounts 挂载了 2 个 nas 路径引起的
volumeMounts
- name: nas
mountPath: /app/logs
subPath: logs/i/web/
- name: nas
mountPath: /app/App_Data
subPath: appdata/i/backup
2个 nas 挂载对应的是同一个 volume,PersistentVolume 使用的是阿里云文件存储 nas
volumes:
- name: nas
persistentVolumeClaim:
claimName: pvc-nas-production
去掉其中一个挂载,问题就解决了。
之前这 2 个挂载对应的是 2 个不同的阿里云 nas,后来排查 pod 重启问题时以为是同一个 pod 挂载 2 个不同 nas 引起的,于是改为使用同一个 nas volume 挂载2个路径,但问题依旧,于是就没有继续从 nas 角度排查问题,原来一个 pod 不仅不能同时挂载 2 个 nas,而且不能挂载同一个 nas 的 2 个 不同路径。
2月9日更新:后来又发现一个影响因素,所挂载的 nas 路径 appdata/i/backup
中有几十万文件夹,也会部分地引起各个问题,将挂载路径改为上一级 appdata/i/
可以避开问题。