J.J*_*eam 4 kubernetes kubernetes-pod livenessprobe
当 Kubernetes 返回 false 时会发生什么liveness-probe?Kubernetes 会立即重新启动该 pod 吗?
首先,请注意,livenessProbe涉及pod 中的容器,而不是 pod 本身。因此,如果一个 Pod 中有多个容器,则只有受影响的容器才会重新启动。
值得注意的是,有一个参数failureThreshold,默认设置为3。因此,在3次失败的探测后,容器将重新启动:
failureThreshold:当探测失败时,Kubernetes 会尝试failureThreshold多次然后放弃。在活性探测的情况下放弃意味着重新启动容器。如果进行就绪探测,Pod 将被标记为“未就绪”。默认为 3。最小值为 1。
好的,我们有信息表明容器在 3 次失败的探测后重新启动- 但这意味着什么?
我找到了一篇关于Kubernetes如何终止 pod 的好文章 - Kubernetes 最佳实践:优雅终止。似乎由活性探针引起的容器重启是类似的 - 我将在下面分享我的经验。
所以基本上,当容器被活性探针终止时,步骤是:
PreStop,就会执行所以...如果容器中的应用程序正确捕获 SIGTERM 信号,那么容器将关闭并再次启动。通常情况下,它发生得相当快(正如我对 NGINX 映像进行的测试)——几乎立即发生。
当您的应用程序不支持 SIGTERM 时,情况会有所不同。意思是在发送SIGKILL信号之后terminationGracePeriodSeconds,容器将被强制移除。
下面的示例(此文档的修改示例)+我设置failureThreshold: 1
我有以下 pod 定义:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: nginx
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
periodSeconds: 10
failureThreshold: 1
Run Code Online (Sandbox Code Playgroud)
当然没有/tmp/healthy文件,所以livenessProbe会失败。NGINX 映像正确捕获 SIGTERM 信号,因此容器几乎会立即重新启动(对于每个失败的探测)。让我们检查一下:
user@shell:~/liveness-test-short $ kubectl get pods
NAME READY STATUS RESTARTS AGE
liveness-exec 0/1 CrashLoopBackOff 3 36s
Run Code Online (Sandbox Code Playgroud)
因此,大约 30 秒后,容器已重新启动几次,并且其状态为预期的CrashLoopBackOff。我在没有 livenessProbe 的情况下创建了相同的 pod,并测量了关闭它所需的时间:
user@shell:~/liveness-test-short $ time kubectl delete pod liveness-exec
pod "liveness-exec" deleted
real 0m1.474s
Run Code Online (Sandbox Code Playgroud)
所以速度相当快。
类似的例子,但我添加了sleep 3000命令:
user@shell:~/liveness-test-short $ kubectl get pods
NAME READY STATUS RESTARTS AGE
liveness-exec 0/1 CrashLoopBackOff 3 36s
Run Code Online (Sandbox Code Playgroud)
让我们应用它并检查...
user@shell:~/liveness-test-short $ kubectl get pods
NAME READY STATUS RESTARTS AGE
liveness-exec 1/1 Running 5 3m37s
Run Code Online (Sandbox Code Playgroud)
因此,大约 4 分钟后,只有 5 次重新启动。为什么?terminationGracePeriodSeconds因为每次重启我们都需要等待完整的时间(默认是30秒)。让我们测量一下关闭所需的时间:
user@shell:~/liveness-test-short $ time kubectl delete pod liveness-exec
pod "liveness-exec" deleted
real 0m42.418s
Run Code Online (Sandbox Code Playgroud)
它更长了。
总结:
当 Kubernetes liveness-probe 返回 false 时会发生什么?Kubernetes 会立即重新启动该 pod 吗?
简短的回答是:默认情况下不会。为什么?
failureThreshold。默认情况下它是 3 次 - 所以在 3 次失败的探测之后。failureThreshold和terminationGracePeriodSecondsperiod参数,以便容器将在每次失败的探测后立即重新启动。| 归档时间: |
|
| 查看次数: |
6095 次 |
| 最近记录: |