K8s 三大探针(livenessProbe/readinessProbe/startupProbe)详解
一、介绍
K8s 三大探针是容器健康检查的核心机制,用来保证 Pod 稳定运行、流量精准分发、启动安全。
- StartupProbe (启动探针):容器刚启动时检查
- LivenessProbe (存活探针):容器运行中是否卡死
- ReadinessProbe (就绪探针):容器是否准备好接收流量
三个探针功能不一样,但探测方法完全一样,都有三种探测方式:
- httpGet:发 HTTP 请求(网页 / 接口)
- tcpSocket:连接端口(数据库 / Redis)
- exec:执行命令(自定义检查)
二、探针通用参数
| initialDelaySeconds | 容器启动后等待多久开始第一次检查 | 根据业务定 |
| periodSeconds | 每隔多久检查一次 | 10 |
| timeoutSeconds | 检查超时时间 | 1 |
| successThreshold | 连续成功几次才算正常 | 1(存活 / 启动必须 = 1) |
| failureThreshold | 连续失败几次才算异常 | 3 |
三、httpGet探针配置方式
1.启动探针(startupProbe)
**作用:**针对慢启动服务(如 Java 应用、大数据组件、需要加载大量依赖的服务),避免 livenessProbe 因 “启动中未响应” 误判为失败而重启。启动探针成功前,liveness 和 readiness 探针不会执行;启动探针失败则直接重启容器。
主要使用场景:
- Java 应用(JVM 加载类、初始化 Spring 上下文需 30-120 秒)
- 大数据组件(如 Elasticsearch、Kafka,启动需初始化集群)
- 依赖多服务的应用(如同时依赖 DB、缓存、消息队列,启动校验耗时久)
(1)创建启动探针
cat > pod–startup.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: pod–startup
namespace: probe
spec:
containers:
– name: nginx
image: nginx
ports:
– containerPort: 80
startupProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 20
timeoutSeconds: 1
EOF
(2)创建pod
kubectl apply -f pod-startup.yaml
(3)查看pod
kubectl get pod -n probe
看到 READY 1/1 = 启动探针成功!
2.存活探针(livenessProbe)
**作用:**当容器进程崩溃、死锁、无响应时,触发重启,避免 “僵尸实例” 占用资源(如 Java 应用 OOM 后进程未退出,但无法提供服务)。
(1)创建存活探针
cat > pod–liveness.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: pod–liveness
namespace: probe
spec:
containers:
– name: nginx
image: nginx
ports:
– containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3
EOF
(2)创建pod
kubectl apply -f pod-liveness.yaml
(3)测试:让它失败,触发重启
进入容器
kubectl exec -it pod-liveness -n probe — bash
关闭nginx
nginx -s stop
然后观察pod状态可以看到RESTARTS 1,pod已经自动重启,说明存活探针生效!
3.就绪探针(readinessProbe)
**作用:**实例启动后,需等待依赖(如 DB、缓存)就绪或初始化完成(如加载配置、预热缓存),此时虽进程存活,但无法处理流量,readinessProbe 会将其移出 Service 端点,直到探测成功才接收流量。
(1)创建就绪探针
cat > pod–readness.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: pod–readiness
namespace: probe
spec:
containers:
– name: nginx
image: nginx
ports:
– containerPort: 80
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5
periodSeconds: 5
EOF
(2)创建pod
kubectl apply -f pod-readiness.yaml
(3)测试:让它失败
进入容器
kubectl exec -it pod-readiness -n probe — bash
删除主页:让nginx无法提供服务
rm /usr/share/nginx/html/index.html
退出查看pod状态,会看到 READY 0/1 ,就绪探针生效,流量被摘除!
(4)恢复
进入容器
kubectl exec -it pod-readiness -n probe — bash
创建index.html
touch /usr/share/nginx/html/index.html
四、tcpsocket探针配置方式
**作用:**只要端口能连通,就认为成功
**适合:**MySQL、Redis、MQ、gRPC、所有带端口的程序
1.创建一个mysql pod
#mysql-tcpsocket.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql–tcpsocket
namespace: probe
spec:
containers:
– name: mysql
image: mysql:8.0
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
value: "123456"
#启动探针:tcpSocket
startupProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 30
#存活探针:tcpSocket
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 20
periodSeconds: 10
failureThreshold: 3
#就绪探针:tcpSocket
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 15
periodSeconds: 5
应用配置
kubectl apply -f mysql-tcpsocket.yaml
查看探针是否生效
kubectl describe pod mysql-tcpsocket -n probe

2.测试探针
(1)测试存活探针(失败 → 自动重启)
进入容器
kubectl exec -it mysql-tcpsocket -n probe — bash
杀死MySQL进程
kill 1
然后查看pod状态:会看到 RESTARTS 从 0 变成 1,存活探针生效,自动重启 MySQL!
kubectl get pod -n probe -w

(2)测试就绪探针(失败 → READY 0/1)
MySQL 启动时,你会看到:
READY 0/1
等 MySQL 完全启动后 → 变成
READY 1/1
就绪探针生效,没准备好不收流量!
五、exec探针配置方式
**作用:**在容器内部执行自定义命令,命令退出码 = 0 代表探测成功,非 0 代表探测失败;不只看端口通不通,校验服务真实可用性
**适合:**MySQL、Redis、PostgreSQL、MongoDB、RabbitMQ、各类中间件、无 HTTP 接口的自研二进制程序、需要脚本校验的业务容器
1.创建一个redis pod
apiVersion: v1
kind: Pod
metadata:
name: redis–exec
namespace: probe
spec:
containers:
– name: redis
image: redis:7
ports:
– containerPort: 6379
# 启动探针 exec
startupProbe:
exec:
command: ["redis-cli", "ping"]
initialDelaySeconds: 5
periodSeconds: 3
failureThreshold: 20
# 存活探针 exec
livenessProbe:
exec:
command: ["redis-cli", "ping"]
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 3
# 就绪探针 exec
readinessProbe:
exec:
command: ["redis-cli", "ping"]
initialDelaySeconds: 5
periodSeconds: 3
2.进入pod
kubectl exec -it redis-exec -n probe — bash
3.重命名 redis-cli,让探针命令失效
mv /usr/local/bin/redis-cli /usr/local/bin/redis-cli.bak
4.退出查看状态
kubectl get pod -n probe -w

六、探针在不同应用场景的配置
| SpringBoot/Nginx/Go Web | httpGet | tcpSocket(临时) |
| MySQL/PG/Redis/MQ | exec(生产必选) | tcpSocket(测试环境) |
| 自研无 http 无 cli 程序 | exec(文件 / 自定义脚本) | 无合适备选 |





