现象
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,停止应用后数秒内从端点中移除。