Kubernetes里,Readiness和Liveness探针,你用对了吗?🤔
- 内容介绍
- 文章标签
- 相关推荐
本文将从设计目的、 工作机制、差异、示例、最佳实践、进阶玩法全方位讲解,并结合 Spring Boot 案例给出完整配置。准备好你的咖啡☕,别慌,下面的文字会像坐过山车一样起伏不定,啊这...。
一、为啥要有 Readiness & Liveness 探针?🤔
在没有健康检查之前,K8s 只能盲盲地把 Pod 当作“活着的尸体”。 于是出现了两大天才兄弟:,来日方长。

- Readiness Probe判断容器是否已经准备好接受流量,像门卫一样拦住“未成年”请求。
- Liveness Probe监测容器是否“自杀”,一旦挂掉就立刻叫人把它踢出集群。
简直了。 这俩玩意儿配合得好, 系统就能稳如老狗;配合得烂,整个集群可能瞬间变成“雪崩现场”。
1.1 设计初衷的那些小九九
换个角度。 Readiness 为流量控制服务,Liveness 为自愈保命符。 如果你只开 Liveness, 却不管 Readiness,那流量会直接冲进还在初始化的容器里——这叫流量炸弹。
二、工作机制——到底是怎么“嗅探”的?👃
简单来说... 两种探针本质上都是 kubelet → Pod → /health endpoint 的一次 HTTP/Exec/TCP 检查。 细节如下:
| 探针类型 | 触发时机 | 常用字段 |
|---|---|---|
| Liveness | Pod 启动后 initialDelaySeconds 后开始循环检测 | periodSeconds / timeoutSeconds / failureThreshold |
| Readiness | 同上,但成功后会把 Pod 加入 Service 的 Endpoints 列表 | successThreshold / failureThreshold / timeoutSeconds |
| Startup | 专门给慢启动容器准备的 “预热” 探针 | initialDelaySeconds 可设得更久 |
2.1 参数调优——别让探针自己先挂掉!⚠️
我们都... 很多新人把 initialDelaySeconds=5, periodSeconds=10, timeoutSeconds=1 全部硬塞进去。后来啊呢?容器刚起步就被 Kubelet 判定为“不活”,立刻重启……简直是自残。
经验之谈:
- Liveness: 给足启动时间, 一般
initialDelaySeconds=60~120秒 - Readiness: 可以稍微短点,但要确保依赖服务已就绪,一般
initialDelaySeconds=30~60秒 - Tolerate Failures:
failureThreshold=3~5次才算真的挂掉。 - Simplify: 如果业务不需要精细控制,就直接用 HTTP GET + 简单返回码 200/302。
三、差异大比拼——到底谁更重要?🏆🏅🥉
| 维度\探针 | Readiness | Liveness |
|---|---|---|
| 决定是否加入 Service 流量池 | ✅ | ❌ |
| POD 重启触发条件 | ❌ | ✅ |
| COLD START 场景适用性 | ✅ | ❌ |
| 对外依赖可用性检测 | ✅ | ❌ |
| 配置复杂度 | 稍高, 需要业务感知 | 相对低,只要进程存活即可 |
| 典型错误场景 | 流量提前进入未初始化实例 → 错误率激增 | 频繁重启导致资源浪费 & 容器抖动 |
四、实战示例——Spring Boot + Kubernetes 小案例 🚀🚀🚀
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-springboot
spec:
replicas: 3
selector:
matchLabels:
app: demo-springboot
template:
metadata:
labels:
app: demo-springboot
spec:
containers:
- name: springboot
image: myrepo/demo-springboot:latest
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 90 # 给 JVM 热身时间
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 4
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 30 # DB/Cache 已经能连通了吧?
periodSeconds: 10
timeoutSeconds: 3
successThreshold: 1
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "200m"
memory: "256Mi"
env:
- name: SPRING_PROFILES_ACTIVE
valueFrom:
configMapKeyRef:
name: app-config
key: profile
restartPolicy: Always
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: demo-springboot-svc
spec:
selector:
app: demo-springboot
ports:
- protocol : TCP
port :80
targetPort :8080
# ^^^^ 随便写的端口,好歹能被访问吧?
# configmap.yaml
apiVersion : v1
kind : ConfigMap
metadata :
name : app-config
data :
profile : prod
# 注意, 这里一定不能写空格,否则会报错…真的很坑!
五、 最佳实践清单 📋📋📋:
- - ✅ 把业务关键路径放到 Readiness 检查里比方说数据库连通性或缓存预热。
- - ✅ Liveness 用最轻量级的 “process alive” 检查,比如 `pgrep java` 或者 `/healthz` 返回 `200` 即可。
- ✅ 不要在 Liveness 中做耗时计算,否则会导致超时频繁重启。
- ✅ 在 Production 环境开启 `failureThreshold` 大一点,以防抖动误报。
- ❎ 禁止把两者完全写成同一个 endpoint,这样根本分不清职责!
- ⚡️ 如果你的服务是批处理或长连接,请考虑使用 `StartupProbe` 防止 “启动阶段误判”。
- - 🔥 用 `preStop` Hook 实现优雅下线,让 Service 在 pod 被驱逐前先把流量剔除。
六、进阶玩法—玩转探针组合拳 🥊🥊🥊 :
* **组合使用**:先用 StartupProbe 给容器一次宽限期;Startup 成功后再交棒给 Readiness;再说说让 Liveness 持续监控存活状态。这样可以最大程度避免“冷启动流量炸裂”。*,这家伙...
* **Exec 探针**:当你想检查内部文件是否生成或某个 极度舒适。 脚本是否返回特定字符时用 exec+shell 命令。比方说:
# exec 示例
livenessProbe:
exec:
command:
- cat
- /tmp/app.pid
initialDelaySeconds :120
periodSeconds :20
timeoutseconds :5
failurethreshold :2
* **TCP Socket 探针**:对那些没有 HTTP 接口但暴露端口的服务非常有用, 我可是吃过亏的。 如 Redis、MySQL 等。但记住它只能判断端口打开,不代表业务可用。
七、 市场上常见的探针管理工具对比表 :
产品名称 🔧 支持 Probe 类型 易用性评分 收费模式
Kube‑Health‑Watcher All 7.8 😊 ✈️
︎
🤐💥🐱👤
K8s‑Probe‑Operator HTTP + Exec + Custom Script 🌟 🛠️ ⠀⟐ ⠀ ⟐⟐ ⟐ ⠀⠀ ⠀ ⠀ ⟐⟐⬅︎⟐⠀ ⟐ ⟐⟐⠀⠀⠀⠀ 🪙 💰$99/月) 6.4 😓 ⃝✖️💤 ⠀ ⠀
⌚ 🕛 🏁.
Astra‑Health‑Dashboard HTTP only 🔎🧭🔍️🙃 ; 🚀🚀🚀💸💸💸︎︎︎︎︽︾𒍏𒍏𒍏𒍏.
八、——别再把两根探针拧成一根了 🙅♂️🙅♀️ 🙃🙃 🙈🙉🙊.
Kubernetes 的健康检查看似小功能,却是生产级系统可靠性的基石。如果你今天看到一条日志说 “Liveness probe failed”, 请先深呼吸,再检查以下几点:,提到这个...
- "初始延迟太短",容器还没来得及加载依赖就被踢出。
- "Endpoint 返回码不是200",可能是业务代码抛异常或返回了错误信息。
- "Period 与 Timeout 配置不合理",导致连续超时触发阈值。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-springboot
spec:
replicas: 3
selector:
matchLabels:
app: demo-springboot
template:
metadata:
labels:
app: demo-springboot
spec:
containers:
- name: springboot
image: myrepo/demo-springboot:latest
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 90 # 给 JVM 热身时间
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 4
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 30 # DB/Cache 已经能连通了吧?
periodSeconds: 10
timeoutSeconds: 3
successThreshold: 1
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "200m"
memory: "256Mi"
env:
- name: SPRING_PROFILES_ACTIVE
valueFrom:
configMapKeyRef:
name: app-config
key: profile
restartPolicy: Always
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: demo-springboot-svc
spec:
selector:
app: demo-springboot
ports:
- protocol : TCP
port :80
targetPort :8080
# ^^^^ 随便写的端口,好歹能被访问吧?
# configmap.yaml
apiVersion : v1
kind : ConfigMap
metadata :
name : app-config
data :
profile : prod
# 注意, 这里一定不能写空格,否则会报错…真的很坑!
五、 最佳实践清单 📋📋📋:
- - ✅ 把业务关键路径放到 Readiness 检查里比方说数据库连通性或缓存预热。
- - ✅ Liveness 用最轻量级的 “process alive” 检查,比如 `pgrep java` 或者 `/healthz` 返回 `200` 即可。
- ✅ 不要在 Liveness 中做耗时计算,否则会导致超时频繁重启。
- ✅ 在 Production 环境开启 `failureThreshold` 大一点,以防抖动误报。
- ❎ 禁止把两者完全写成同一个 endpoint,这样根本分不清职责!
- ⚡️ 如果你的服务是批处理或长连接,请考虑使用 `StartupProbe` 防止 “启动阶段误判”。
- - 🔥 用 `preStop` Hook 实现优雅下线,让 Service 在 pod 被驱逐前先把流量剔除。
六、进阶玩法—玩转探针组合拳 🥊🥊🥊 :
* **组合使用**:先用 StartupProbe 给容器一次宽限期;Startup 成功后再交棒给 Readiness;再说说让 Liveness 持续监控存活状态。这样可以最大程度避免“冷启动流量炸裂”。*,这家伙...
* **Exec 探针**:当你想检查内部文件是否生成或某个 极度舒适。 脚本是否返回特定字符时用 exec+shell 命令。比方说:
# exec 示例
livenessProbe:
exec:
command:
- cat
- /tmp/app.pid
initialDelaySeconds :120
periodSeconds :20
timeoutseconds :5
failurethreshold :2
* **TCP Socket 探针**:对那些没有 HTTP 接口但暴露端口的服务非常有用, 我可是吃过亏的。 如 Redis、MySQL 等。但记住它只能判断端口打开,不代表业务可用。
七、 市场上常见的探针管理工具对比表 :
产品名称 🔧 支持 Probe 类型 易用性评分 收费模式
Kube‑Health‑Watcher All 7.8 😊 ✈️
︎
🤐💥🐱👤
K8s‑Probe‑Operator HTTP + Exec + Custom Script 🌟 🛠️ ⠀⟐ ⠀ ⟐⟐ ⟐ ⠀⠀ ⠀ ⠀ ⟐⟐⬅︎⟐⠀ ⟐ ⟐⟐⠀⠀⠀⠀ 🪙 💰$99/月) 6.4 😓 ⃝✖️💤 ⠀ ⠀
⌚ 🕛 🏁.
Astra‑Health‑Dashboard HTTP only 🔎🧭🔍️🙃 ; 🚀🚀🚀💸💸💸︎︎︎︎︽︾𒍏𒍏𒍏𒍏.
八、——别再把两根探针拧成一根了 🙅♂️🙅♀️ 🙃🙃 🙈🙉🙊.
Kubernetes 的健康检查看似小功能,却是生产级系统可靠性的基石。如果你今天看到一条日志说 “Liveness probe failed”, 请先深呼吸,再检查以下几点:,提到这个...
- "初始延迟太短",容器还没来得及加载依赖就被踢出。
- "Endpoint 返回码不是200",可能是业务代码抛异常或返回了错误信息。
- "Period 与 Timeout 配置不合理",导致连续超时触发阈值。
本文将从设计目的、 工作机制、差异、示例、最佳实践、进阶玩法全方位讲解,并结合 Spring Boot 案例给出完整配置。准备好你的咖啡☕,别慌,下面的文字会像坐过山车一样起伏不定,啊这...。
一、为啥要有 Readiness & Liveness 探针?🤔
在没有健康检查之前,K8s 只能盲盲地把 Pod 当作“活着的尸体”。 于是出现了两大天才兄弟:,来日方长。

- Readiness Probe判断容器是否已经准备好接受流量,像门卫一样拦住“未成年”请求。
- Liveness Probe监测容器是否“自杀”,一旦挂掉就立刻叫人把它踢出集群。
简直了。 这俩玩意儿配合得好, 系统就能稳如老狗;配合得烂,整个集群可能瞬间变成“雪崩现场”。
1.1 设计初衷的那些小九九
换个角度。 Readiness 为流量控制服务,Liveness 为自愈保命符。 如果你只开 Liveness, 却不管 Readiness,那流量会直接冲进还在初始化的容器里——这叫流量炸弹。
二、工作机制——到底是怎么“嗅探”的?👃
简单来说... 两种探针本质上都是 kubelet → Pod → /health endpoint 的一次 HTTP/Exec/TCP 检查。 细节如下:
| 探针类型 | 触发时机 | 常用字段 |
|---|---|---|
| Liveness | Pod 启动后 initialDelaySeconds 后开始循环检测 | periodSeconds / timeoutSeconds / failureThreshold |
| Readiness | 同上,但成功后会把 Pod 加入 Service 的 Endpoints 列表 | successThreshold / failureThreshold / timeoutSeconds |
| Startup | 专门给慢启动容器准备的 “预热” 探针 | initialDelaySeconds 可设得更久 |
2.1 参数调优——别让探针自己先挂掉!⚠️
我们都... 很多新人把 initialDelaySeconds=5, periodSeconds=10, timeoutSeconds=1 全部硬塞进去。后来啊呢?容器刚起步就被 Kubelet 判定为“不活”,立刻重启……简直是自残。
经验之谈:
- Liveness: 给足启动时间, 一般
initialDelaySeconds=60~120秒 - Readiness: 可以稍微短点,但要确保依赖服务已就绪,一般
initialDelaySeconds=30~60秒 - Tolerate Failures:
failureThreshold=3~5次才算真的挂掉。 - Simplify: 如果业务不需要精细控制,就直接用 HTTP GET + 简单返回码 200/302。
三、差异大比拼——到底谁更重要?🏆🏅🥉
| 维度\探针 | Readiness | Liveness |
|---|---|---|
| 决定是否加入 Service 流量池 | ✅ | ❌ |
| POD 重启触发条件 | ❌ | ✅ |
| COLD START 场景适用性 | ✅ | ❌ |
| 对外依赖可用性检测 | ✅ | ❌ |
| 配置复杂度 | 稍高, 需要业务感知 | 相对低,只要进程存活即可 |
| 典型错误场景 | 流量提前进入未初始化实例 → 错误率激增 | 频繁重启导致资源浪费 & 容器抖动 |
四、实战示例——Spring Boot + Kubernetes 小案例 🚀🚀🚀
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-springboot
spec:
replicas: 3
selector:
matchLabels:
app: demo-springboot
template:
metadata:
labels:
app: demo-springboot
spec:
containers:
- name: springboot
image: myrepo/demo-springboot:latest
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 90 # 给 JVM 热身时间
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 4
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 30 # DB/Cache 已经能连通了吧?
periodSeconds: 10
timeoutSeconds: 3
successThreshold: 1
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "200m"
memory: "256Mi"
env:
- name: SPRING_PROFILES_ACTIVE
valueFrom:
configMapKeyRef:
name: app-config
key: profile
restartPolicy: Always
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: demo-springboot-svc
spec:
selector:
app: demo-springboot
ports:
- protocol : TCP
port :80
targetPort :8080
# ^^^^ 随便写的端口,好歹能被访问吧?
# configmap.yaml
apiVersion : v1
kind : ConfigMap
metadata :
name : app-config
data :
profile : prod
# 注意, 这里一定不能写空格,否则会报错…真的很坑!
五、 最佳实践清单 📋📋📋:
- - ✅ 把业务关键路径放到 Readiness 检查里比方说数据库连通性或缓存预热。
- - ✅ Liveness 用最轻量级的 “process alive” 检查,比如 `pgrep java` 或者 `/healthz` 返回 `200` 即可。
- ✅ 不要在 Liveness 中做耗时计算,否则会导致超时频繁重启。
- ✅ 在 Production 环境开启 `failureThreshold` 大一点,以防抖动误报。
- ❎ 禁止把两者完全写成同一个 endpoint,这样根本分不清职责!
- ⚡️ 如果你的服务是批处理或长连接,请考虑使用 `StartupProbe` 防止 “启动阶段误判”。
- - 🔥 用 `preStop` Hook 实现优雅下线,让 Service 在 pod 被驱逐前先把流量剔除。
六、进阶玩法—玩转探针组合拳 🥊🥊🥊 :
* **组合使用**:先用 StartupProbe 给容器一次宽限期;Startup 成功后再交棒给 Readiness;再说说让 Liveness 持续监控存活状态。这样可以最大程度避免“冷启动流量炸裂”。*,这家伙...
* **Exec 探针**:当你想检查内部文件是否生成或某个 极度舒适。 脚本是否返回特定字符时用 exec+shell 命令。比方说:
# exec 示例
livenessProbe:
exec:
command:
- cat
- /tmp/app.pid
initialDelaySeconds :120
periodSeconds :20
timeoutseconds :5
failurethreshold :2
* **TCP Socket 探针**:对那些没有 HTTP 接口但暴露端口的服务非常有用, 我可是吃过亏的。 如 Redis、MySQL 等。但记住它只能判断端口打开,不代表业务可用。
七、 市场上常见的探针管理工具对比表 :
产品名称 🔧 支持 Probe 类型 易用性评分 收费模式
Kube‑Health‑Watcher All 7.8 😊 ✈️
︎
🤐💥🐱👤
K8s‑Probe‑Operator HTTP + Exec + Custom Script 🌟 🛠️ ⠀⟐ ⠀ ⟐⟐ ⟐ ⠀⠀ ⠀ ⠀ ⟐⟐⬅︎⟐⠀ ⟐ ⟐⟐⠀⠀⠀⠀ 🪙 💰$99/月) 6.4 😓 ⃝✖️💤 ⠀ ⠀
⌚ 🕛 🏁.
Astra‑Health‑Dashboard HTTP only 🔎🧭🔍️🙃 ; 🚀🚀🚀💸💸💸︎︎︎︎︽︾𒍏𒍏𒍏𒍏.
八、——别再把两根探针拧成一根了 🙅♂️🙅♀️ 🙃🙃 🙈🙉🙊.
Kubernetes 的健康检查看似小功能,却是生产级系统可靠性的基石。如果你今天看到一条日志说 “Liveness probe failed”, 请先深呼吸,再检查以下几点:,提到这个...
- "初始延迟太短",容器还没来得及加载依赖就被踢出。
- "Endpoint 返回码不是200",可能是业务代码抛异常或返回了错误信息。
- "Period 与 Timeout 配置不合理",导致连续超时触发阈值。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-springboot
spec:
replicas: 3
selector:
matchLabels:
app: demo-springboot
template:
metadata:
labels:
app: demo-springboot
spec:
containers:
- name: springboot
image: myrepo/demo-springboot:latest
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 90 # 给 JVM 热身时间
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 4
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 30 # DB/Cache 已经能连通了吧?
periodSeconds: 10
timeoutSeconds: 3
successThreshold: 1
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "200m"
memory: "256Mi"
env:
- name: SPRING_PROFILES_ACTIVE
valueFrom:
configMapKeyRef:
name: app-config
key: profile
restartPolicy: Always
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: demo-springboot-svc
spec:
selector:
app: demo-springboot
ports:
- protocol : TCP
port :80
targetPort :8080
# ^^^^ 随便写的端口,好歹能被访问吧?
# configmap.yaml
apiVersion : v1
kind : ConfigMap
metadata :
name : app-config
data :
profile : prod
# 注意, 这里一定不能写空格,否则会报错…真的很坑!
五、 最佳实践清单 📋📋📋:
- - ✅ 把业务关键路径放到 Readiness 检查里比方说数据库连通性或缓存预热。
- - ✅ Liveness 用最轻量级的 “process alive” 检查,比如 `pgrep java` 或者 `/healthz` 返回 `200` 即可。
- ✅ 不要在 Liveness 中做耗时计算,否则会导致超时频繁重启。
- ✅ 在 Production 环境开启 `failureThreshold` 大一点,以防抖动误报。
- ❎ 禁止把两者完全写成同一个 endpoint,这样根本分不清职责!
- ⚡️ 如果你的服务是批处理或长连接,请考虑使用 `StartupProbe` 防止 “启动阶段误判”。
- - 🔥 用 `preStop` Hook 实现优雅下线,让 Service 在 pod 被驱逐前先把流量剔除。
六、进阶玩法—玩转探针组合拳 🥊🥊🥊 :
* **组合使用**:先用 StartupProbe 给容器一次宽限期;Startup 成功后再交棒给 Readiness;再说说让 Liveness 持续监控存活状态。这样可以最大程度避免“冷启动流量炸裂”。*,这家伙...
* **Exec 探针**:当你想检查内部文件是否生成或某个 极度舒适。 脚本是否返回特定字符时用 exec+shell 命令。比方说:
# exec 示例
livenessProbe:
exec:
command:
- cat
- /tmp/app.pid
initialDelaySeconds :120
periodSeconds :20
timeoutseconds :5
failurethreshold :2
* **TCP Socket 探针**:对那些没有 HTTP 接口但暴露端口的服务非常有用, 我可是吃过亏的。 如 Redis、MySQL 等。但记住它只能判断端口打开,不代表业务可用。
七、 市场上常见的探针管理工具对比表 :
产品名称 🔧 支持 Probe 类型 易用性评分 收费模式
Kube‑Health‑Watcher All 7.8 😊 ✈️
︎
🤐💥🐱👤
K8s‑Probe‑Operator HTTP + Exec + Custom Script 🌟 🛠️ ⠀⟐ ⠀ ⟐⟐ ⟐ ⠀⠀ ⠀ ⠀ ⟐⟐⬅︎⟐⠀ ⟐ ⟐⟐⠀⠀⠀⠀ 🪙 💰$99/月) 6.4 😓 ⃝✖️💤 ⠀ ⠀
⌚ 🕛 🏁.
Astra‑Health‑Dashboard HTTP only 🔎🧭🔍️🙃 ; 🚀🚀🚀💸💸💸︎︎︎︎︽︾𒍏𒍏𒍏𒍏.
八、——别再把两根探针拧成一根了 🙅♂️🙅♀️ 🙃🙃 🙈🙉🙊.
Kubernetes 的健康检查看似小功能,却是生产级系统可靠性的基石。如果你今天看到一条日志说 “Liveness probe failed”, 请先深呼吸,再检查以下几点:,提到这个...
- "初始延迟太短",容器还没来得及加载依赖就被踢出。
- "Endpoint 返回码不是200",可能是业务代码抛异常或返回了错误信息。
- "Period 与 Timeout 配置不合理",导致连续超时触发阈值。

