← 中文资源

简体中文版本

Kubernetes 就绪探针失败 — Running 却始终未 Ready

从 Pod 内复现探针请求,核对端口、绑定地址与启动时序,排查 Kubernetes readiness 探针失败导致 Service 无端点的问题。

阅读英文原文

现象

Pod 状态为 Running,但 READY 一直是 0/1;事件反复出现 Readiness probe failed: HTTP probe failed with statuscode: 503;Service 没有端点,访问时报连接失败;手动在容器内访问却正常。

诊断

先确认就绪状态与端点:

kubectl get pod -n app -l app=orders -o wide
kubectl get endpointslices -n app -l kubernetes.io/service-name=orders
kubectl describe pod -n app orders-6b7d9c5f8-hzq4m | grep -A12 -E 'Readiness:|Startup:'

READY 0/1 的 Pod 会被排除在 Service 端点之外,所以进程活着但流量进不来。事件会给出探针使用的端口和返回码。再在容器内复现同一请求:

kubectl exec -n app orders-6b7d9c5f8-hzq4m -- wget -qO- http://127.0.0.1:8080/healthz; echo exit=$?
kubectl logs -n app orders-6b7d9c5f8-hzq4m --tail=100

容器内也返回 503,说明应用确实未就绪,通常是依赖不可用或启动未完成;容器内 200 而探针失败,则重点检查监听地址是否为 0.0.0.0、声明端口是否一致、启动时间是否不足。

修复

为慢启动应用增加 startupProbe,就绪探针指向专门的 /readyz,超时与阈值按真实延迟设置:

startupProbe:
  httpGet:
    path: /healthz
    port: 8080
  periodSeconds: 5
  failureThreshold: 24
readinessProbe:
  httpGet:
    path: /readyz
    port: 8080
  periodSeconds: 5
  timeoutSeconds: 2
  failureThreshold: 3

就绪检查不要强依赖共享数据库,否则一次短暂故障会把所有副本同时摘除;应用必须监听 0.0.0.0,否则 kubelet 通过 Pod IP 无法访问。

验证

确认 READY 变为 1/1,EndpointSlice 中出现该 Pod 的 IP 与端口;通过 Service 发请求能落到该 Pod。再重启一次 Pod,观察它只有在应用真正可服务后才转为 Ready,停止应用后数秒内从端点中移除。