[K8s解决方案] 在 v1.11 版本中已修复的 Liveness Probe 的 failureThreshold 的意外行为
增加记录
我在Slack的Kubernetes的jp-users频道发了帖子,收到了nekop先生下面的建议。非常感谢!

https://github.com/kubernetes/kubernetes/pull/46371/files
https://github.com/sjenning/kubernetes/blob/2c866a7aaa45dd552df9ea53cc1ca20b0d502a52/pkg/kubelet/prober/worker.go#L227
https://github.com/sjenning/kubernetes/blob/master/pkg/kubelet/prober/worker.go#L243
https://github.com/sjenning/kubernetes/commit/b49e07846f6779fdb35efb33eab5456bb85ec9f8
https://github.com/kubernetes/kubernetes/commit/b49e07846f6779fdb35efb33eab5456bb85ec9f8
以下是一些选项:
1. https://github.com/kubernetes/kubernetes/pull/46371/files
https://github.com/sjenning/kubernetes/blob/2c866a7aaa45dd552df9ea53cc1ca20b0d502a52/pkg/kubelet/prober/worker.go#L227
https://github.com/sjenning/kubernetes/blob/master/pkg/kubelet/prober/worker.go#L243
https://github.com/sjenning/kubernetes/commit/b49e07846f6779fdb35efb33eab5456bb85ec9f8
https://github.com/kubernetes/kubernetes/commit/b49e07846f6779fdb35efb33eab5456bb85ec9f8
「既然说『1.11及以后是否修好了呢?』,那我就真的试着在1.11版本上操作了一下。」
环境
minikube v0.28.2
然而,这次我们将使用–kubernetes-version v1.11.3来更改版本。
(之前使用的是1.10系列)
kubectl version
#Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.3", GitCommit:"a4529464e4629c21224b3d52edfe0ea91b072862", GitTreeState:"clean", BuildDate:"2018-09-09T18:02:47Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
#Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.3", GitCommit:"a4529464e4629c21224b3d52edfe0ea91b072862", GitTreeState:"clean", BuildDate:"2018-09-09T17:53:03Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
看起来正在运行的是1.11.3版本。
我们将使用与上次相同的 Deployment.yml 文件。
确认连通
0s 0s 1 nginx-deployment-54d7b449d9-xwmsf.15588f8e14305452 Pod spec.containers{nginx} Normal Pulled kubelet, minikube Container image "nginx:1.7.9" already present on machine
0s 0s 1 nginx-deployment-54d7b449d9-xwmsf.15588f8e24353f4d Pod spec.containers{nginx} Normal Created kubelet, minikube Created container
0s 0s 1 nginx-deployment-54d7b449d9-xwmsf.15588f8e2f30bd16 Pod spec.containers{nginx} Normal Started kubelet, minikube Started container
0s 0s 1 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 5s 2 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 10s 3 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 15s 4 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 20s 5 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 0s 1 nginx-deployment-54d7b449d9-xwmsf.15588f9607af13d7 Pod spec.containers{nginx} Normal Killing kubelet, minikube Killing container with id docker://nginx:Container failed liveness probe.. Container will be killed and recreated.
0s 34s 2 nginx-deployment-54d7b449d9-xwmsf.15588f8e14305452 Pod spec.containers{nginx} Normal Pulled kubelet, minikube Container image "nginx:1.7.9" already present on machine
0s 34s 2 nginx-deployment-54d7b449d9-xwmsf.15588f8e24353f4d Pod spec.containers{nginx} Normal Created kubelet, minikube Created container
0s 34s 2 nginx-deployment-54d7b449d9-xwmsf.15588f8e2f30bd16 Pod spec.containers{nginx} Normal Started kubelet, minikube Started container
0s 35s 6 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 40s 7 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 45s 8 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 50s 9 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 55s 10 nginx-deployment-54d7b449d9-xwmsf.15588f91418ce085 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 35s 2 nginx-deployment-54d7b449d9-xwmsf.15588f9607af13d7 Pod spec.containers{nginx} Normal Killing kubelet, minikube Killing container with id docker://nginx:Container failed liveness probe.. Container will be killed and recreated.
0s 1m 3 nginx-deployment-54d7b449d9-xwmsf.15588f8e14305452 Pod spec.containers{nginx} Normal Pulled kubelet, minikube Container image "nginx:1.7.9" already present on machine
第二个活动探针的检查次数如预期一样出现了5次。
正如nekop先生所指出的结果一样!
总结
-
- 1.10系での2回目移行のfailureThresholdが1回分少ないのは不具合
- v1.11系で修正済み
「這應該不是故障,應該就是這樣的吧。」這樣在我心中一直這麼想著,但我自己也得好好調查一下才行呢……。
我感覺必須能夠大致知道哪個組件受到了影響。
(即使只是稍微去觸碰一下源代碼……。)
过去[正在调查中] Kubernetes 的 Liveness Probe 的 failureThreshold
首先
当进行Kubernetes健康检查故障阈值(failureThreshold)的验证时,与我预期的不同,所以我做了笔记。
第一次的故障阈值是根据指定值进行容器重新启动的,但重新启动后,似乎是按照故障阈值减1的次数进行重新启动的行为。
顺畅交流的环境
minikube版本为v0.28.2。
部署
对不存在的路径进行每5秒一次的健康检查,并故意让其失败。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /pathnotfound # 存在しないパスのため404
port: 80
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 5
预期行为与实际行为相符
预期的行动
[创建容器]
[启动容器]
[不健康(第一次)]
[不健康(第二次)]
[不健康(第三次)]
[不健康(第四次)]
[不健康(第五次)](失败阈值)
[杀死容器]
[创建容器]
[启动容器]
[不健康(第六次)]
[不健康(第七次)]
[不健康(第八次)]
[不健康(第九次)]
[不健康(第十次)](失败阈值)
[杀死容器]
实际行动
创建容器
启动容器
不健康(第一次)
不健康(第二次)
不健康(第三次)
不健康(第四次)
不健康(第五次)(失败阈值)正常
终止容器
创建容器
启动容器
不健康(第六次)
不健康(第七次)
不健康(第八次)
不健康(第九次)(失败阈值)与预期不符
终止容器
kubectl查看事件的结果
0s 0s 1 nginx-deployment-5cdfc956db-n56dj.155845c2e184ea50 Pod spec.containers{nginx} Normal Pulled kubelet, minikube Container image "nginx:1.7.9" already present on machine
0s 0s 1 nginx-deployment-5cdfc956db-n56dj.155845c2edc3eb4f Pod spec.containers{nginx} Normal Created kubelet, minikube Created container
0s 0s 1 nginx-deployment-5cdfc956db-n56dj.155845c2fa234bdc Pod spec.containers{nginx} Normal Started kubelet, minikube Started container
0s 0s 1 nginx-deployment-5cdfc956db-n56dj.155845c618efd412 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 5s 2 nginx-deployment-5cdfc956db-n56dj.155845c618efd412 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 10s 3 nginx-deployment-5cdfc956db-n56dj.155845c618efd412 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 15s 4 nginx-deployment-5cdfc956db-n56dj.155845c618efd412 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 20s 5 nginx-deployment-5cdfc956db-n56dj.155845c618efd412 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 0s 1 nginx-deployment-5cdfc956db-n56dj.155845cadd2a06c2 Pod spec.containers{nginx} Normal Killing kubelet, minikube Killing container with id docker://nginx:Container failed liveness probe.. Container will be killed and recreated.
0s 34s 2 nginx-deployment-5cdfc956db-n56dj.155845c2e184ea50 Pod spec.containers{nginx} Normal Pulled kubelet, minikube Container image "nginx:1.7.9" already present on machine
0s 34s 2 nginx-deployment-5cdfc956db-n56dj.155845c2edc3eb4f Pod spec.containers{nginx} Normal Created kubelet, minikube Created container
0s 34s 2 nginx-deployment-5cdfc956db-n56dj.155845c2fa234bdc Pod spec.containers{nginx} Normal Started kubelet, minikube Started container
0s 35s 6 nginx-deployment-5cdfc956db-n56dj.155845c618efd412 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 40s 7 nginx-deployment-5cdfc956db-n56dj.155845c618efd412 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 45s 8 nginx-deployment-5cdfc956db-n56dj.155845c618efd412 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 50s 9 nginx-deployment-5cdfc956db-n56dj.155845c618efd412 Pod spec.containers{nginx} Warning Unhealthy kubelet, minikube Liveness probe failed: HTTP probe failed with statuscode: 404
0s 30s 2 nginx-deployment-5cdfc956db-n56dj.155845cadd2a06c2 Pod spec.containers{nginx} Normal Killing kubelet, minikube Killing container with id docker://nginx:Container failed liveness probe.. Container will be killed and recreated.
0s 1m 3 nginx-deployment-5cdfc956db-n56dj.155845c2e184ea50 Pod spec.containers{nginx} Normal Pulled kubelet, minikube Container image "nginx:1.7.9" already present on machine