共计 2102 个字符,预计需要花费 6 分钟才能阅读完成。
概述
Kubernetes 对 Pod 的健康状态可以通过两类探针来检查,kubelet 定期执行这两类探针来诊断容器的健康状况。
- LivenessProbe 探针:用于判断容器是否存活(Running 状态),如果 LivenessProbe 探针检测到容器不健康,则 kubelet 会杀掉该容器并且根据容器的重启策略执行相应处理。如果一个容器不包含 LivenessProbe 探针,那么 kubelet 认为该容器的 LivenessProbe 探针返回的值永远是 Success。
- ReadinessProbe 探针:用于判断容器服务是否可用(Ready 状态),达到 Ready 状态的 Pod 才可以接受请求。对于被 Service 管理的 Pod,Service 和 Pod Endpoint 的关联关系也将基于 Pod 是否能被 Ready 进行设置。如果运行过程中 Ready 状态变为 Flase,则系统将其自动从 Service 的后端 Endpoint 列表中隔离出去,后续再把恢复到 Ready 状态的 Pod 加回后端 Endpoint 列表。这样就能保证客户端在访问 Service 时不回被转发到服务不可用的 Pod 实例上。
实现方式
LivenessProbe 探针和 ReadinessProbe 探针都可以配置以下三种实现方式:
ExecAction
在容器内部执行一个命令,如果该命令的返回码为 0,则表明容器健康。
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 // 启动容器后进行首次检查的等待时间
periodSeconds: 5 // 监控检查发送请求后等待响应的超时时间。当超时发生时,kubelet 会认为容器已经无法提供服务,将会重启该容器。
为了执行探测,kubelet cat /tmp/healthy
在目标容器中执行命令,如果命令成功,则返回 0,并且 kubelet 认为该容器是活动的且健康的。
容器启动时,它将执行以下命令
/bin/sh -c "touchu /tmp/healthy;sleep 30;rm -rf /temp/healthy;sleep 600
在容器寿命的前 30s 内,有一个 /tmp/healthy
文件。因此在前 30s 内,该命令 cat /tmp/healthy
将返回成功代码,30s 后,cat /tmp/healthy
将返回失败代码。
TCPGetAction
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3 // 每三秒执行一个活动探测
为了执行探测,kubelet 将 HTTP GET 请求发送到在容器中运行并且正在侦听端口 8080 的服务器。如果服务器 /healthz
路径的处理程序返回成功代码,则 kubelet 会认为该容器处于活动状态且运行状态良好。
任何大于等于 200 且小于 400 的状态码均表示成功。
TCPSocketAction
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: k8s.gcr.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
TCP 检查的配置与 HTTP 检查非常相似。本示例同时使用了就绪和活跃度探针。容器启动 5 秒后,kubelet 将发送第一个就绪探测器。这将尝试连接到 goproxy
端口 8080 上的容器。如果探测成功,则 Pod 将标记为就绪。kubelet 将继续每 10 秒运行一次此检查。
除了就绪探针之外,此配置还包括活动探针。容器启动后,kubelet 将运行第一个活动探针 15 秒。就像就绪探针一样,这将尝试 goproxy
在端口 8080 上连接到 容器。如果活动探针失败,则将重新启动容器。