在 Kubernetes 中,Pod 探针(Probe) 是用于监控容器健康状态的重要机制。它允许 Kubernetes 判断容器是否健康运行,并根据探针结果决定是否重启容器、终止 Pod 或从 Service 后端移除该 Pod。探针主要分为三种类型:
[[服务健康检测]]
0.1 1. 探针的三种类型
(1) Liveness Probe(存活探针)
<font color="#9bbb59">健康状态检查,周期性检查服务是否存活,检查结果失败,将"重启"容器(删除源容器并重新创建新容器)。</font>
<font color="#9bbb59">- 作用:检查容器是否仍在运行。如果探测失败,Kubernetes 会重启容器(认为容器可能卡死或僵死)。</font>
<font color="#9bbb59">- 典型场景:</font>
<font color="#9bbb59"> – 检查应用主进程是否崩溃(如 Java 应用的 PID 1
是否存活)。</font>
<font color="#9bbb59"> – 检测应用是否进入无响应状态(如 HTTP 服务是否卡死)。</font>
(2) Readiness Probe(就绪探针)
<font color="#9bbb59">可用性检查,周期性检查服务是否可用,从而判断容器是否就绪</font>
<font color="#9bbb59">- 作用:检查容器是否已准备好接收流量。如果探测失败,Kubernetes 会从 Service 的 Endpoints 中移除该 Pod(暂时不转发流量给它),直到探测成功。</font>
<font color="#9bbb59">- 典型场景:</font>
<font color="#9bbb59"> – 应用启动后需要完成初始化(如加载缓存、连接数据库)。</font>
<font color="#9bbb59"> – 应用依赖的外部服务(如数据库)是否可用。</font>
(3) Startup Probe(启动探针)(Kubernetes 1.16+ 引入)
如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止。
如果启动探测失败,kubelet将杀死容器,而容器依其重启策略进行重启。
如果容器没有提供启动探测,则默认状态为 Success
- 典型场景:
- 应用启动时间较长(如 Java 应用需要加载大量依赖)。
- 避免因启动慢导致 Liveness Probe 过早判定容器死亡。
0.2 2. 探针的探测方式
每种探针支持以下三种探测方式:
探测方式 | 说明 | 适用场景 |
---|---|---|
exec |
在容器内执行命令,根据命令退出码判断健康状态(0 表示成功)。 |
检查文件是否存在、自定义脚本验证等。 |
httpGet |
向容器内的指定端口和路径发送 HTTP GET 请求,根据状态码判断健康状态(2xx 或 3xx 表示成功)。>=400表示失败 |
HTTP 服务(如 REST API)。 |
tcpSocket |
尝试与容器的指定端口建立 TCP 连接,如果连接成功则认为健康。 | 数据库、Redis 等基于 TCP 的服务。 |
0.3 3. 探针的配置参数
每种探针支持以下关键参数:
参数 | 说明 | 默认值 |
---|---|---|
initialDelaySeconds |
容器启动后等待多少秒再开始第一次探测。 | 0 |
periodSeconds |
探测间隔时间(单位:秒)。 | 10 |
timeoutSeconds |
探测超时时间(单位:秒)。 | 1 |
successThreshold |
连续多少次探测成功才认为容器健康。 | 1 |
failureThreshold |
连续多少次探测失败才认为容器不健康。 | 3 |
0.4 4. 探针配置示例
示例 1:HTTP 服务的探针配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
selector:
matchLabels:
apps: xiuxian
template:
metadata:
labels:
apps: xiuxian
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: / # 检查根路径
port: 80
initialDelaySeconds: 5 # 容器启动 5 秒后开始探测
periodSeconds: 10 # 每 10 秒探测一次
readinessProbe:
httpGet:
path: /index.html # 检查自定义健康检查路径
port: 80
initialDelaySeconds: 3
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: svc-xiuxian
spec:
type: ClusterIP
clusterIP: 10.200.0.200
selector:
apps: xiuxian
ports:
- port: 80
targetPort: 80
示例 2:TCP 服务的探针配置(如 Redis)
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
template:
spec:
containers:
- name: redis
image: redis
ports:
- containerPort: 6379
livenessProbe:
tcpSocket:
port: 6379
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
tcpSocket:
port: 6379
initialDelaySeconds: 5
periodSeconds: 5
示例 3:启动探针(避免启动慢导致误杀)
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30 # 等待 30 秒后再开始 Liveness 探测
periodSeconds: 10
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30 # 最多失败 30 次(约 5 分钟,假设 periodSeconds=10)
periodSeconds: 10
0.5 5. 探针的最佳实践
- 合理设置
initialDelaySeconds
:- 避免应用还未启动完成就被探测(如 Java 应用可能需要几十秒初始化)。
- 区分 Liveness 和 Readiness 探针:
- Liveness 探针应简单快速(如检查端口是否存活)。
- Readiness 探针可以更严格(如检查数据库连接是否正常)。
- 避免过于频繁的探测:
periodSeconds
不宜过小(默认 10 秒是合理值),否则会增加系统负载。
- 启动探针用于长启动应用:
- 如 Java 应用、大数据服务(避免 Liveness Probe 因启动慢误判容器死亡)。
0.6 6. 探针与 Pod 生命周期的关系
-
Pod 状态流转:
Pending → (容器启动) → Running → (Liveness Probe 失败) → Restarting ↓ (Readiness Probe 失败) → 从 Service Endpoints 移除
-
关键行为:
- Liveness Probe 失败 → 重启容器(
kubectl get pods
会显示Restart Count
增加)。 - Readiness Probe 失败 → 流量被移除(Pod 仍在运行,但不再接收请求)。
- Liveness Probe 失败 → 重启容器(
0.7 总结
探针类型 | 作用 | 触发行为 |
---|---|---|
Liveness Probe | 检查容器是否存活 | 失败时重启容器 |
Readiness Probe | 检查容器是否就绪 | 失败时从 Service 移除流量 |
Startup Probe | 检查容器是否启动完成 | 失败时不断重试(不触发其他探针) |
通过合理配置探针,可以显著提高 Kubernetes 集群的稳定性和可靠性! 🚀