Kubernetes 中的健康检查是按容器还是按 pod 定义的?

Are healthchecks defined per container or per pod in Kubernetes?

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

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

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

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

命令:

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

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

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

中看到的

The kubelet uses readiness probes to know when a container is ready to start accepting traffic.

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

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

And if 1 out of 3 containers was restarted, then it means that the entire pod was restarted. Is this correct?

让我们有一个简单的 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 中找到更多信息。