如何解决Kubernetes 中的健康检查是按容器还是按 Pod 定义的?
在 Google Cloud blog 中,他们说如果 Readiness 探测失败,那么流量将不会被路由到 pod。如果 Liveliness 探测失败,一个 pod 将重新启动。
Kubernetes docs 他们说 kubelet 使用 Liveness 探测器来了解 容器 是否需要重新启动。 Readiness 探针用于检查容器是否准备好开始接受来自客户端的请求。
我目前的理解是,当 Pod 的所有容器都准备就绪时,它就被认为是就绪和活动的。这反过来意味着如果一个 pod 中的 3 个容器中有 1 个失败,那么整个 pod 将被视为失败(未就绪/未存活)。如果 3 个容器中有 1 个重新启动,则意味着整个 pod 都重新启动了。这是正确的吗?
解决方法
A 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 中找到更多信息。
,对于具有多个容器的 Pod,我们可以选择仅重启单个容器,条件是它需要访问权限。
命令:
kubectl exec POD_NAME -c CONTAINER_NAME "Command used for restarting the container"
这样需要的 POD 不会被删除,k8s 也不需要重新创建 POD。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。