欢迎光临
我们一直在努力

K8s 三大探针(livenessProbe_readinessProbe_startupProbe)详解

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 > podstartup.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: podstartup
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 > podliveness.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: podliveness
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 > podreadness.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: podreadiness
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: mysqltcpsocket
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: redisexec
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(文件 / 自定义脚本) 无合适备选
赞(0)
未经允许不得转载:171主机测评 » K8s 三大探针(livenessProbe_readinessProbe_startupProbe)详解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址