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 中找到更多信息。
在 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 中找到更多信息。