当 kubernetes liveness-probe return false 时会发生什么?
What happens when kubernetes liveness-probe return false?
当 Kubernetes liveness-probe
returns 错误时会发生什么?
Kubernetes 会立即重启那个 pod 吗?
首先,请注意 livenessProbe
涉及 pod 中的 containers,而不是 pod 本身。因此,如果您在一个 pod 中有多个容器,则只会重新启动受影响的容器。
值得注意的是,有parameter failureThreshold
,默认设置为3。因此,在3次探测失败后,容器将重新启动:
failureThreshold
: When a probe fails, Kubernetes will try failureThreshold
times before giving up. Giving up in case of liveness probe means restarting the container. In case of readiness probe the Pod will be marked Unready. Defaults to 3. Minimum value is 1.
好的,我们有信息表明容器在 3 次失败的探测后重新启动 - 但是 重新启动 意味着什么?
我找到了一篇关于 如何 Kubernetes 终止 pods - Kubernetes best practices: terminating with grace 的好文章。似乎由 liveness probe 引起的容器重启是类似的-我将在下面分享我的经验。
所以基本上当容器被活性探测步骤终止时:
- 如果有
PreStop
hook,就会执行
- SIGTERM signal发送到容器
- Kubernetes 等待宽限期
- 宽限期后,SIGKILL signal 被发送到 pod
所以...如果容器中的某个应用程序正确捕获 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
它更长。
总结一下:
What happens when Kubernetes liveness-probe return false? Does Kubernetes restart that pod immediately?
简短的回答是:默认情况下没有。为什么?
- Kubernetes 将在
failureThreshold
次后重启 pod 中的容器。默认情况下是 3 次 - 所以在 3 次失败的探测之后。
- 根据您的容器配置,容器终止所需的时间可能会有很大差异
- 您可以同时调整
failureThreshold
和terminationGracePeriodSeconds
period参数,因此容器将在每次探测失败后立即重新启动。
当 Kubernetes liveness-probe
returns 错误时会发生什么?
Kubernetes 会立即重启那个 pod 吗?
首先,请注意 livenessProbe
涉及 pod 中的 containers,而不是 pod 本身。因此,如果您在一个 pod 中有多个容器,则只会重新启动受影响的容器。
值得注意的是,有parameter failureThreshold
,默认设置为3。因此,在3次探测失败后,容器将重新启动:
failureThreshold
: When a probe fails, Kubernetes will tryfailureThreshold
times before giving up. Giving up in case of liveness probe means restarting the container. In case of readiness probe the Pod will be marked Unready. Defaults to 3. Minimum value is 1.
好的,我们有信息表明容器在 3 次失败的探测后重新启动 - 但是 重新启动 意味着什么?
我找到了一篇关于 如何 Kubernetes 终止 pods - Kubernetes best practices: terminating with grace 的好文章。似乎由 liveness probe 引起的容器重启是类似的-我将在下面分享我的经验。
所以基本上当容器被活性探测步骤终止时:
- 如果有
PreStop
hook,就会执行 - SIGTERM signal发送到容器
- Kubernetes 等待宽限期
- 宽限期后,SIGKILL signal 被发送到 pod
所以...如果容器中的某个应用程序正确捕获 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
它更长。
总结一下:
What happens when Kubernetes liveness-probe return false? Does Kubernetes restart that pod immediately?
简短的回答是:默认情况下没有。为什么?
- Kubernetes 将在
failureThreshold
次后重启 pod 中的容器。默认情况下是 3 次 - 所以在 3 次失败的探测之后。 - 根据您的容器配置,容器终止所需的时间可能会有很大差异
- 您可以同时调整
failureThreshold
和terminationGracePeriodSeconds
period参数,因此容器将在每次探测失败后立即重新启动。