【问题标题】:Are healthchecks defined per container or per pod in Kubernetes?在 Kubernetes 中,是否为每个容器或每个 pod 定义了健康检查?
【发布时间】:2021-06-06 17:21:39
【问题描述】:

Google Cloud blog 他们说如果就绪探测失败,那么流量将不会被路由到 pod。如果 Liveliness 探测失败,一个 pod 将被重新启动。

Kubernetes docs 他们说 kubelet 使用 Liveness 探针来了解 容器 是否需要重新启动。 Readiness 探针用于检查容器是否准备好开始接受来自客户端的请求。

我目前的理解是,当 所有 容器都准备好时,Pod 被认为是 Ready and Alive。这反过来意味着如果 pod 中的 3 个容器中有 1 个发生故障,则整个 pod 将被视为失败(未就绪/未激活)。如果重启了 3 个容器中的 1 个,则意味着整个 pod 都被重启了。这是正确的吗?

【问题讨论】:

    标签: kubernetes kubernetes-health-check


    【解决方案1】:

    Pod 只有在其所有容器都准备好时才准备好。 当一个 Pod 准备就绪时,应该将它添加到所有匹配的服务的负载平衡池中,因为这意味着这个 Pod 能够为请求提供服务。
    正如您在Readiness Probe documentation 中看到的:

    kubelet 使用就绪探测来了解容器何时准备好开始接受流量。

    使用readiness probe 可以确保流量不会到达尚未准备好的容器。
    使用liveness probe 可以确保容器在失败时重启(kubelet 只会杀死并重启特定的容器)。

    另外,为了回答你的最后一个问题,我将使用一个例子:

    如果重启了 3 个容器中的 1 个,则意味着整个 pod 都重启了。这是正确的吗?

    让我们为一个总是失败的容器创建一个简单的 Pod 清单文件和 livenessProbe

    ---
    # web-app.yml
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: web-app
      name: web-app
    spec:
      containers:
      - image: nginx
        name: web
    
      - image: redis
        name: failed-container
        livenessProbe:
          httpGet:
            path: /healthz # I don't have this endpoint configured so it will always be failed.
            port: 8080
    

    创建web-app Pod 并等待一段时间后,我们可以检查livenessProbe 的工作原理:

    $ kubectl describe pod web-app
    Name:         web-app
    Namespace:    default
    Containers:
      web:
        ...
        State:          Running
          Started:      Tue, 09 Mar 2021 09:56:59 +0000
        Ready:          True
        Restart Count:  0
        ...
      failed-container:
        ...
        State:          Waiting
          Reason:       CrashLoopBackOff
        Last State:     Terminated
          Reason:       Completed
          Exit Code:    0
        Ready:          False
        Restart Count:  7
        ...
    Events:
      Type     Reason     Age                   From               Message
      ----     ------     ----                  ----               -------
      ...
      Normal   Killing    9m40s (x2 over 10m)   kubelet            Container failed-container failed liveness probe, will be restarted
      ...
    

    如您所见,只有 failed-container 容器被重新启动 (Restart Count: 7)。

    更多信息可以在Liveness, Readiness and Startup Probes documentation找到。

    【讨论】:

      【解决方案2】:

      对于具有多个容器的 Pod,我们确实可以选择仅重启单个容器,条件是应用它需要访问权限。

      命令:

      kubectl exec POD_NAME -c CONTAINER_NAME  "Command used for restarting the container"
      

      这样需要的POD不会被删除,k8s不需要重新创建POD。

      【讨论】:

      • 如果您重新启动 POD 中的任何容器,POD 可能会重新启动。由于 pod 的就绪或活跃性将失败,因此 K8s 将重新启动。
      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2020-04-19
      • 1970-01-01
      相关资源
      最近更新 更多