根据你的描述(Pod 状态为 Running
但 READY=0/1
),结合你提供的配置和现象(可通过 curl
访问),以下是详细的排查思路和解决方案:
📌 核心结论先行
你的 readinessProbe
配置与实际应用行为存在偏差,导致 Kubernetes 认为该 Pod 尚未就绪。典型原因包括:
- 探针路径/端口不匹配 → Nginx 未在指定路径返回成功响应
- 探针触发时机过早 → 应用未完全初始化时就尝试探测
- 探针判定逻辑过于严格 → 偶发性超时被计为失败
🔍 逐步排查指南
1. 查看详细事件日志(定位根本原因)
kubectl describe pod busybox5
重点关注 Events
部分是否有类似以下错误:
Readiness probe failed: HTTP probe failed with statuscode: 5xx
如果有具体错误码,可直接跳转到对应解决方案。
2. 进入容器验证真实响应(关键步骤!)
# 进入容器后执行以下命令
kubectl exec -it busybox5 -c loader -- curl -v http://localhost:80/
观察输出结果:
- 如果返回
200 OK
+ HTML 内容 → 证明应用正常工作,问题出在探针配置 - 如果返回
404 Not Found
→ 路径不存在,需调整readinessProbe.httpGet.path
- 如果连接超时或拒绝 → 端口未监听/应用未启动
3. 对比探针配置 vs 实际行为
配置项 | 当前值 | 要求 | 常见问题 |
---|---|---|---|
path | / | Nginx 根目录必须存在 | 若 Nginx 重定向到其他路径会失败 |
port | 80 | Nginx 默认端口 | 若容器改端口必同步修改 |
initialDelaySeconds | ❌ 未设置 | 至少留够应用启动时间 | Nginx 启动较慢时易误判 |
periodSeconds | ❌ 未设置 | 默认 10s | 频繁探测加重负载 |
successThreshold | ❌ 未设置 | 默认 1 次成功即标记为就绪 | 适合快速启动场景 |
failureThreshold | ❌ 未设置 | 默认 3 次失败才标记为不可用 | 你的配置中只有 startupProbe 设置了 |
4. 优化后的探针配置建议(更新 Deployment/Pod)
spec:
containers:
- name: loader
image: nginx:latest
# ✅ 增加初始延迟(给 Nginx 足够启动时间)
readinessProbe:
httpGet:
path: / # 确保此路径有响应
port: 80
initialDelaySeconds: 15 # Nginx 启动约需 5-10s
periodSeconds: 20 # 降低探测频率
timeoutSeconds: 5 # 避免网络抖动导致超时
successThreshold: 1 # 一次成功即可
startupProbe:
exec:
command: ["sh", "-c", "test -f /var/ready"]
failureThreshold: 30
periodSeconds: 5
5. 验证修改效果
# 删除旧 Pod(触发重新调度)
kubectl delete pod busybox5
# 观察新 Pod 状态变化
watch kubectl get po busybox5
当看到 READY=1/1
时,表示探针已成功。
💡 为什么能 curl 访问但探针失败?
场景 | 原因 | 解决方案 |
---|---|---|
Web界面可访问 | 浏览器自动重定向到非 / 路径 | 将探针路径改为重定向后的路径 |
首次启动慢 | Nginx 加载配置文件耗时较长 | 增大 initialDelaySeconds |
间歇性超时 | 集群网络波动导致偶发性超时 | 增大 timeoutSeconds |
静态资源缺失 | Nginx 根目录无索引文件(index.html) | 添加默认索引文件或改探针路径 |
🛠️ 终极排查命令组合
# 1. 实时查看探针检测结果
kubectl get events --namespace=default | grep busybox5
# 2. 查看容器内部网络监听状态
kubectl exec busybox5 -c loader -- netstat -tulnp | grep :80
# 3. 导出完整审计日志分析
kubectl describe pod busybox5 > pod_diagnosis.txt
✅ 最终建议方案
- 显式设置探针参数(参考上面的优化配置)
- 验证 Nginx 根目录内容:确保
/
路径有有效响应(可临时添加index.html
测试) - 监控启动流程:通过日志确认 Nginx 完全启动后再进行探针检测
注意:Nginx 官方镜像默认的根目录是
/usr/share/nginx/html
,如果你的应用使用自定义根目录,必须同时满足两个条件:
readinessProbe.path
指向正确的相对路径- Nginx 配置中明确定义了该路径的权限和内容