【发布时间】:2022-01-07 23:47:18
【问题描述】:
当 Kubernetes liveness-probe 返回 false 时会发生什么?
Kubernetes 是否会立即重启该 pod?
【问题讨论】:
标签: kubernetes kubernetes-pod livenessprobe
当 Kubernetes liveness-probe 返回 false 时会发生什么?
Kubernetes 是否会立即重启该 pod?
【问题讨论】:
标签: kubernetes kubernetes-pod livenessprobe
首先,请注意livenessProbe 关注的是 pod 中的容器,而不是 pod 本身。因此,如果您在一个 pod 中有多个容器,则只会重新启动受影响的容器。
值得注意的是,有parameter failureThreshold,默认设置为3。因此,在3次失败的探测后,容器将被重新启动:
failureThreshold:当一次探测失败时,Kubernetes 会尝试failureThreshold次才放弃。在 liveness probe 的情况下放弃意味着重新启动容器。在就绪探测的情况下,Pod 将被标记为未就绪。默认为 3。最小值为 1。
好的,我们有信息表明容器在 3 次失败的探测后重新启动 - 但 重新启动 意味着什么?
我发现一篇关于 Kubernetes 如何终止 pod - Kubernetes best practices: terminating with grace 的好文章。似乎对于由 liveness probe 引起的容器重启它是相似的 - 我将在下面分享我的经验。
所以基本上当容器被活性探测步骤终止时:
PreStop hook,就会被执行所以...如果您的容器中的应用程序正确捕获 SIGTERM 信号,则容器将关闭并重新启动。通常它发生得非常快(正如我对 NGINX 映像的测试)——几乎是立即发生的。
当您的应用程序不支持 SIGTERM 时,情况会有所不同。表示terminationGracePeriodSeconds period发出SIGKILL信号后,容器将被强制移除。
下面的例子(从this doc修改的例子)+我设置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?
简短的回答是:默认情况下没有。为什么?
failureThreshold 次之后重新启动 Pod 中的容器。默认情况下是 3 次 - 所以在 3 次失败的探测之后。failureThreshold 和terminationGracePeriodSeconds period 参数,以便在每次探测失败后立即重新启动容器。【讨论】:
PodDisruptionBudgets 怎么样?我猜它与死豆荚有关,并允许留在一些死豆荚