Kubernetes里,Readiness和Liveness探针,你用对了吗?🤔

2026-04-28 16:582阅读0评论建站教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文将从设计目的、 工作机制、差异、示例、最佳实践、进阶玩法全方位讲解,并结合 Spring Boot 案例给出完整配置。准备好你的咖啡☕,别慌,下面的文字会像坐过山车一样起伏不定,啊这...。

一、为啥要有 Readiness & Liveness 探针?🤔

在没有健康检查之前,K8s 只能盲盲地把 Pod 当作“活着的尸体”。 于是出现了两大天才兄弟:,来日方长。

Kubernetes 中的 Readiness 与 Liveness:别再把探针用反了
  • Readiness Probe判断容器是否已经准备好接受流量,像门卫一样拦住“未成年”请求。
  • Liveness Probe监测容器是否“自杀”,一旦挂掉就立刻叫人把它踢出集群。

简直了。 这俩玩意儿配合得好, 系统就能稳如老狗;配合得烂,整个集群可能瞬间变成“雪崩现场”。

1.1 设计初衷的那些小九九

换个角度。 Readiness 为流量控制服务,Liveness 为自愈保命符。 如果你只开 Liveness, 却不管 Readiness,那流量会直接冲进还在初始化的容器里——这叫流量炸弹。

二、工作机制——到底是怎么“嗅探”的?👃

简单来说... 两种探针本质上都是 kubelet → Pod → /health endpoint 的一次 HTTP/Exec/TCP 检查。 细节如下:

探针类型触发时机常用字段
LivenessPod 启动后 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”, 请先深呼吸,再检查以下几点:,提到这个...

  1. "初始延迟太短",容器还没来得及加载依赖就被踢出。
  2. "Endpoint 返回码不是200",可能是业务代码抛异常或返回了错误信息。
  3. "Period 与 Timeout 配置不合理",导致连续超时触发阈值。

本文将从设计目的、 工作机制、差异、示例、最佳实践、进阶玩法全方位讲解,并结合 Spring Boot 案例给出完整配置。准备好你的咖啡☕,别慌,下面的文字会像坐过山车一样起伏不定,啊这...。

一、为啥要有 Readiness & Liveness 探针?🤔

在没有健康检查之前,K8s 只能盲盲地把 Pod 当作“活着的尸体”。 于是出现了两大天才兄弟:,来日方长。

Kubernetes 中的 Readiness 与 Liveness:别再把探针用反了
  • Readiness Probe判断容器是否已经准备好接受流量,像门卫一样拦住“未成年”请求。
  • Liveness Probe监测容器是否“自杀”,一旦挂掉就立刻叫人把它踢出集群。

简直了。 这俩玩意儿配合得好, 系统就能稳如老狗;配合得烂,整个集群可能瞬间变成“雪崩现场”。

1.1 设计初衷的那些小九九

换个角度。 Readiness 为流量控制服务,Liveness 为自愈保命符。 如果你只开 Liveness, 却不管 Readiness,那流量会直接冲进还在初始化的容器里——这叫流量炸弹。

二、工作机制——到底是怎么“嗅探”的?👃

简单来说... 两种探针本质上都是 kubelet → Pod → /health endpoint 的一次 HTTP/Exec/TCP 检查。 细节如下:

探针类型触发时机常用字段
LivenessPod 启动后 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”, 请先深呼吸,再检查以下几点:,提到这个...

  1. "初始延迟太短",容器还没来得及加载依赖就被踢出。
  2. "Endpoint 返回码不是200",可能是业务代码抛异常或返回了错误信息。
  3. "Period 与 Timeout 配置不合理",导致连续超时触发阈值。