当 kubernetes liveness-probe 返回 false 时会发生什么?

J.J*_*eam 4 kubernetes kubernetes-pod livenessprobe

当 Kubernetes 返回 false 时会发生什么liveness-probe?Kubernetes 会立即重新启动该 pod 吗?

Mik*_* S. 6

首先,请注意,livenessProbe涉及pod 中的容器,而不是 pod 本身。因此,如果一个 Pod 中有多个容器,则只有受影响的容器才会重新启动。

值得注意的是,有一个参数failureThreshold,默认设置为3。因此,在3次失败的探测后,容器将重新启动:

failureThreshold:当探测失败时,Kubernetes 会尝试 failureThreshold 多次然后放弃。在活性探测的情况下放弃意味着重新启动容器。如果进行就绪探测,Pod 将被标记为“未就绪”。默认为 3。最小值为 1。

好的,我们有信息表明容器在 3 次失败的探测后重新启动- 但这意味着什么?

我找到了一篇关于Kubernetes如何终止 pod 的好文章 - Kubernetes 最佳实践:优雅终止。似乎由活性探针引起的容器重启是类似的 - 我将在下面分享我的经验。

所以基本上,当容器被活性探针终止时,步骤是:

所以...如果容器中的应用程序正确捕获 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 吗?

简短的回答是:默认情况下不会。为什么?

  • Kubernetes 会多次重启 pod 中的容器failureThreshold。默认情况下它是 3 次 - 所以在 3 次失败的探测之后。
  • 根据容器的配置,容器终止所需的时间可能会有很大差异
  • 您可以调整failureThresholdterminationGracePeriodSecondsperiod参数,以便容器将在每次失败的探测后立即重新启动。