【问题标题】:What happens when kubernetes liveness-probe return false?当 Kubernetes liveness-probe 返回 false 时会发生什么?
【发布时间】:2022-01-07 23:47:18
【问题描述】:

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

【问题讨论】:

    标签: kubernetes kubernetes-pod livenessprobe


    【解决方案1】:

    首先,请注意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 引起的容器重启它是相似的 - 我将在下面分享我的经验。

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

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

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

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

    【讨论】:

    • PodDisruptionBudgets 怎么样?我猜它与死豆荚有关,并允许留在一些死豆荚
    • 我认为它们之间没有关系,Liveness 探测涉及单个容器,而 Pod Disruption Budgets 则与 Deployment、StatefulSets 等资源工作负载有关...另请参阅 this answer
    猜你喜欢
    • 2022-01-09
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2016-06-12
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多