1

当 Kubernetesliveness-probe返回 false 时会发生什么?Kubernetes 是否会立即重启该 pod?

4

1 回答 1

1

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

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

failureThreshold:当一次探测失败时,Kubernetes 会尝试 failureThreshold 多次,然后放弃。在 liveness probe 的情况下放弃意味着重新启动容器。在就绪探测的情况下,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

当然没有/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 次失败的探测之后。
  • 取决于您的容器配置,容器终止所需的时间可能非常不同
  • 您可以调整这两个参数failureThresholdterminationGracePeriodSeconds周期参数,以便在每次失败的探测后立即重新启动容器。
于 2021-12-01T16:34:28.637 回答