当 Kubernetesliveness-probe
返回 false 时会发生什么?Kubernetes 是否会立即重启该 pod?
1 回答
首先,请注意livenessProbe
涉及pod 中的容器,而不是 pod 本身。因此,如果您在一个 pod 中有多个容器,则只会重新启动受影响的容器。
值得注意的是,有一个参数failureThreshold
,默认设置为3。因此,在3次失败的探测后,将重新启动容器:
failureThreshold
:当一次探测失败时,Kubernetes 会尝试failureThreshold
多次,然后放弃。在 liveness probe 的情况下放弃意味着重新启动容器。在就绪探测的情况下,Pod 将被标记为未就绪。默认为 3。最小值为 1。
好的,我们有信息表明容器在 3 次失败的探测后重新启动 - 但是重新启动意味着什么?
我找到了一篇关于Kubernetes如何终止 Pod的好文章——Kubernetes 最佳实践:以优雅方式终止。似乎由活性探针引起的容器重启是相似的 - 我将在下面分享我的经验。
所以基本上当容器被活性探测终止时,步骤是:
- 如果有
PreStop
钩子,它将被执行 - SIGTERM 信号被发送到容器
- Kubernetes 等待宽限期
- 宽限期过后,SIGKILL 信号被发送到 Pod
所以......如果容器中的应用程序正确捕获 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
当然没有/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
因此,大约 30 秒后,容器已经重新启动了几次,并且它的状态是CrashLoopBackOff,正如预期的那样。我在没有 livenessProbe 的情况下创建了同一个 pod,并测量了关闭它所需的时间:
user@shell:~/liveness-test-short $ time kubectl delete pod liveness-exec
pod "liveness-exec" deleted
real 0m1.474s
所以它非常快。
类似的例子,但我添加了sleep 3000
命令:
...
image: nginx
args:
- /bin/sh
- -c
- sleep 3000
...
让我们应用它并检查...
user@shell:~/liveness-test-short $ kubectl get pods
NAME READY STATUS RESTARTS AGE
liveness-exec 1/1 Running 5 3m37s
所以大约 4 分钟后只有 5 次重新启动。为什么?因为每次重启都需要等待完整的terminationGracePeriodSeconds
时间(默认为 30 秒)。让我们测量关闭所需的时间:
user@shell:~/liveness-test-short $ time kubectl delete pod liveness-exec
pod "liveness-exec" deleted
real 0m42.418s
它要长得多。
总结一下:
当 Kubernetes liveness-probe 返回 false 时会发生什么?Kubernetes 是否会立即重启该 pod?
简短的回答是:默认情况下没有。为什么?
- Kubernetes 将在一段
failureThreshold
时间后重新启动 pod 中的容器。默认情况下它是 3 次 - 所以在 3 次失败的探测之后。 - 取决于您的容器配置,容器终止所需的时间可能非常不同
- 您可以调整这两个参数
failureThreshold
和terminationGracePeriodSeconds
周期参数,以便在每次失败的探测后立即重新启动容器。