Probe 配置速查
本篇汇总 Kubernetes 三种探针(Probe)的区别、四种探测方式和常用参数,以表格为主,写 Deployment 时随手翻查。探针与健康检查接口设计的完整讨论,见第 4 篇《Workload 工作负载》。
三种探针的区别
| 探针 | 失败后的动作 | 典型用途 | 常见误用 |
|---|---|---|---|
livenessProbe | kubelet 按 restartPolicy 重启容器 | 检测死锁、进程假死等「只有重启才能恢复」的故障 | 拿它当 readiness 用:依赖未就绪就失败,容器被反复重启,陷入 CrashLoopBackOff |
readinessProbe | 把 Pod 从 Service 的 Endpoints 中摘掉,不再接流量;恢复后自动加回 | 启动加载、依赖未就绪、过载时临时摘流量 | 与 liveness 用同一个接口:依赖抖动时既摘流量又重启,故障被放大 |
startupProbe | 成功之前禁用另外两种探针;连续失败超限才重启容器 | 保护慢启动应用(老 Java 服务、要预加载大量数据的应用) | 不配它却给 liveness 堆超长 initialDelaySeconds,运行期故障发现变慢 |
配了 startupProbe 后它先跑,成功之前 livenessProbe 和 readinessProbe 一律不生效;startupProbe 成功一次即永久退场,之后整个容器生命周期由 liveness 和 readiness 接管。
应用在依赖(数据库、下游服务)不可用时,如果让 liveness 接口也返回失败,kubelet 会直接重启容器;依赖没恢复,重启后依旧失败,于是陷入反复重启。判断标准只有一个:这个故障「重启容器能不能恢复」?能,才配进 liveness;不能,走 readiness 摘流量,等依赖恢复。
探测方式
| 方式 | 判定成功 | 适用场景 | 关键字段 |
|---|---|---|---|
httpGet | 返回的 HTTP 状态码在 200–399 之间 | 有 HTTP 端口的应用,首选 | path、port、scheme、httpHeaders |
tcpSocket | 能建立 TCP 连接 | 数据库、MQ 等没有 HTTP 接口的服务 | port |
exec | 容器内命令退出码为 0 | 需要自定义判断逻辑(查文件、跑脚本) | command |
grpc | gRPC 健康检查协议返回 SERVING | gRPC 服务,Kubernetes 1.24+ 原生支持 | port、service |
httpGet
livenessProbe:
httpGet:
path: /healthz
port: 8080 # 数字或容器端口名
scheme: HTTP # 默认 HTTP,可改 HTTPS
httpHeaders: # 可选,自定义请求头
- name: X-Probe
value: kubernetes
tcpSocket
readinessProbe:
tcpSocket:
port: 3306
exec
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
grpc
livenessProbe:
grpc:
port: 50051
service: "" # 可选,留空表示检查整体服务
exec 每次探测都要在容器里起一个新进程,频率高了开销不小;能用 httpGet 或 tcpSocket 解决的就别用 exec。另外 command 直接执行、不经过 shell,需要管道或重定向时自己包一层 sh -c。
参数速查
| 参数 | 默认值 | 含义 |
|---|---|---|
initialDelaySeconds | 0 | 容器启动后等多少秒才开始第一次探测;配了 startupProbe 基本就不再需要它 |
periodSeconds | 10 | 每隔多少秒探测一次,最小值 1 |
timeoutSeconds | 1 | 单次探测多少秒没响应算失败,最小值 1 |
successThreshold | 1 | 从失败转成功需要连续成功几次;liveness 和 startup 只能是 1,只有 readiness 能配大于 1 |
failureThreshold | 3 | 连续失败几次才判定探针失败(readiness 摘流量 / liveness 与 startup 重启容器),最小值 1 |
terminationGracePeriodSeconds | 沿用 Pod 级配置(默认 30) | 探针级宽限期,1.28 起稳定:liveness 判定失败后给容器多少秒优雅退出再强杀;不配则用 Pod 的同名字段 |
慢启动应用不要再给 liveness 堆 initialDelaySeconds,改用 startupProbe,按公式配:
failureThreshold × periodSeconds ≥ 最慢启动时间
例如应用最慢 3 分钟(180 秒)才能起来,可配 periodSeconds: 10、failureThreshold: 18,最多容忍 180 秒;启动成功后 startup 探针退场,运行期的假死检测交给参数正常的 liveness。
常见场景配置片段
Java 慢启动应用(startup 护航)
spec:
containers:
- name: java-app
image: example/java-app:1.0
ports:
- containerPort: 8080
startupProbe: # 启动期护航,成功前禁用另两个探针
httpGet:
path: /actuator/health
port: 8080
periodSeconds: 10
failureThreshold: 18 # 10 × 18 = 180 秒,覆盖最慢启动时间
livenessProbe: # 运行期检测假死,参数保持灵敏
httpGet:
path: /actuator/health/liveness
port: 8080
periodSeconds: 10
failureThreshold: 3
readinessProbe: # 能接流量才算就绪
httpGet:
path: /actuator/health/readiness
port: 8080
periodSeconds: 5
滚动发布:只在就绪时摘流量(readiness 单用)
新副本没就绪就不进 Service、旧副本继续服务,实现「就绪才切流量」;failureThreshold 适当放大,避免瞬时抖动导致流量反复切换。
readinessProbe:
httpGet:
path: /ready
port: 8080
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 3 # 连续 3 次失败(约 15 秒)才摘流量
数据库类重依赖应用:谨慎使用 liveness
数据库、有状态中间件的「假死」大多重启也救不回来,liveness 触发重启反而可能打断复制、丢数据。常见做法是只配 readiness 摘流量,liveness 不配或只检测真正的进程级死锁。
readinessProbe:
tcpSocket:
port: 5432
periodSeconds: 10
failureThreshold: 6
# 不配 liveness;要配也只探进程级死锁,并给极保守的 failureThreshold
对 PostgreSQL、MySQL 这类有状态服务,重启一个实例的代价远高于摘几分钟流量。liveness 要么不配,要么用极保守的参数(很长的 failureThreshold、很低的探测频率),并把探活接口与外部依赖完全解耦。