Learn
Kubernetes/11-probes

探针

容器进程"在跑"不等于"能服务"。Kubernetes 用**探针(Probe)**判断容器是否健康、是否就绪接收流量。配置好探针,才能让自愈和滚动更新真正可靠。

1. 三种探针

探针作用失败后果
livenessProbe检测容器是否"活着"失败 → 杀掉并重启容器
readinessProbe检测是否"就绪"接收流量失败 → 从 Service 后端摘掉
startupProbe检测应用是否"启动完成"失败 → 杀掉重启;成功前另两个暂停
ℹ️liveness 与 readiness 的差异

liveness 失败=容器废了,要重启;readiness 失败=容器在但还没好(如还在加载缓存),暂时别发流量。两者失败后果不同,务必区分。

2. 探测方式

三种通用方式:

  • exec:在容器内执行命令,退出码 0 为成功
  • httpGet:对指定路径发 HTTP 请求,2xx/3xx 为成功
  • tcpSocket:探测端口是否可连

3. livenessProbe 示例

spec:
  containers:
    - name: app
      image: myapp:1.0
      livenessProbe:
        httpGet:
          path: /healthz
          port: 8080
        initialDelaySeconds: 10     # 启动后等 10s 再开始探测
        periodSeconds: 5            # 每 5s 探一次
        failureThreshold: 3         # 连续 3 次失败才判定

4. readinessProbe 示例

      readinessProbe:
        httpGet:
          path: /ready
          port: 8080
        periodSeconds: 5
        failureThreshold: 2
💡readiness 保证滚动更新零中断

新版本 Pod 未通过 readiness 前,Service 不会把流量转给它;它变成就绪后才逐步切流,老 Pod 再下线,从而实现平滑发布。

5. startupProbe 示例(慢启动应用)

对启动很慢的应用(如 JVM 预热),用 startupProbe 给足启动时间,避免被 liveness 误杀:

      startupProbe:
        httpGet:
          path: /healthz
          port: 8080
        failureThreshold: 30        # 最多试 30 次
        periodSeconds: 10          # 每次间隔 10s → 最多容忍 300s 启动
⚠️liveness 不要探业务依赖

liveness 应只反映进程存活(如 /healthz 只查自身)。若它去探数据库,数据库抖动会导致容器被反复重启,雪上加霜。

6. 排查探针问题

kubectl describe pod app
# 看 Events 里是否有 Unhealthy / Killing 等信息
kubectl get pod app
# READY 列如果是 0/1,说明 readiness 未通过
🎯练习

给一个 Web 应用加上 /healthz(liveness)和 /ready(readiness)两个端点,并配置对应探针;故意让 /ready 返回 500,观察 READY 状态变为 0/1、Pod 从 Service endpoints 中消失。

小结

  • liveness 失败重启容器,readiness 失败摘流量,startup 给慢启动兜底
  • 探测方式:exec / httpGet / tcpSocket
  • liveness 只探自身存活,readiness 决定是否接流量
  • 下一章学习滚动更新与回滚 →