news 2026/10/13 10:20:39

K8s 探针配置的 3 个反直觉行为:为什么 Pod 一直没就绪

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
K8s 探针配置的 3 个反直觉行为:为什么 Pod 一直没就绪

我不会起名字322· 后端 / 算法 / 数据库

📘 技术栈 | 🧩 力扣 Hot100 | 🐹 Go 项目 | 🟥 Redis | 🐬 MySQL

文章目录

  • K8s 探针配置的 3 个反直觉行为:为什么 Pod 一直没就绪
    • 一、先分清三种探针(很多人混用)
    • 二、反直觉行为 1:startupProbe 与 initialDelaySeconds 的优先级
    • 三、反直觉行为 2:什么时候被杀 = failureThreshold × periodSeconds
    • 四、反直觉行为 3:liveness 打到未就绪的 Pod → 重启风暴
    • 五、探针参数对照表(可带走物)
    • 六、排查没就绪的三步

K8s 探针配置的 3 个反直觉行为:为什么 Pod 一直没就绪

“应用日志明明写着server started on :8080,为什么 Pod 一直是0/1?”

这是个几乎每个上 K8s 的人都会遇到的困惑。你盯着 Pod 状态,READY是0/1,kubectl describe里一堆Readiness probe failed。而应用自己觉得一切正常。

问题几乎总是出在探针配置上。这篇先分清三种探针,再拆 3 个反直觉行为。

一、先分清三种探针(很多人混用)

探针作用失败后果失败的"严重度"
livenessProbe判断容器活着吗重启容器高(会重启)
readinessProbe判断容器能收流量吗从 Service 摘除,不重启中(不接流量)
startupProbe判断容器启动完了吗重启容器高(会重启)

最常见的错误:把 liveness 探针配得太激进去探业务接口,或者用 liveness 代替 readiness,导致"服务没就绪就被杀 → 重启 → 又没就绪"的重启风暴。

二、反直觉行为 1:startupProbe 与 initialDelaySeconds 的优先级

很多人以为配了startupProbe之后,livenessProbe.initialDelaySeconds就无所谓了。基本正确,但有个坑:

  • 配了startupProbe:在 startup 成功之前,liveness 和 readiness 都不会执行。这期间只有 startup 在起作用。
  • 没配startupProbe:liveness 会立即按initialDelaySeconds开始计时。

反直觉点:initialDelaySeconds不是"启动后多久开始探",而是"容器创建后多久开始第一次探测"。如果镜像拉取花了 40 秒,而initialDelaySeconds = 10,那么第一次 liveness 探测发生在应用还没启动时——直接失败。

# ❌ 危险:初始延迟太短livenessProbe:httpGet:{path:/healthz,port:8080}initialDelaySeconds:5# 应用 30 秒才启动完 → 前 5 次全失败periodSeconds:5failureThreshold:3# 15 秒后就被杀 → 重启风暴# ✅ 正确:用 startupProbe 单独兜启动期startupProbe:httpGet:{path:/healthz,port:8080}periodSeconds:5failureThreshold:30# 最多等 150 秒启动livenessProbe:httpGet:{path:/healthz,port:8080}periodSeconds:10failureThreshold:3

记忆点:startupProbe是给"启动慢的应用"用的,配了它,liveness 的initialDelaySeconds就可以设成 0。

三、反直觉行为 2:什么时候被杀 = failureThreshold × periodSeconds

这是最容易被误算的一个。决定"多久被杀"的不是initialDelaySeconds,而是:

最长容忍时间 = failureThreshold × periodSeconds

举例:

livenessProbe:initialDelaySeconds:10# 第一次探测在 10s 后periodSeconds:10# 每 10s 探一次failureThreshold:3# 连续失败 3 次就杀

从容器创建到被杀的最坏时间=initialDelaySeconds + failureThreshold × periodSeconds= 10 + 30 =40 秒。

反直觉点:timeoutSeconds是每次探测的超时,它也算进周期。如果timeoutSeconds = 5、periodSeconds = 10,那实际周期可能变成"探测 5 秒超时 + 等 5 秒",节奏被打乱。

# 完整的时间账livenessProbe:initialDelaySeconds:10periodSeconds:10timeoutSeconds:5# 单次探测超时failureThreshold:3successThreshold:1# liveness 必须为 1# 最坏:10 + 3×(5超时+10间隔) = 55 秒才被杀

readiness 的 successThreshold 可以 > 1(需要连续成功 N 次才算就绪),但liveness 的 successThreshold 只能是 1(这是强制的)。

四、反直觉行为 3:liveness 打到未就绪的 Pod → 重启风暴

这是最惨烈的一种。典型配置错误:

# ❌ liveness 探了一个"依赖就绪"的接口livenessProbe:httpGet:{path:/api/health,port:8080}# 这个接口依赖下游 DB/Redis

问题链:

  1. 服务启动,但下游 DB 还没连上(或者自己还没热身完);
  2. /api/health因为依赖未就绪返回 500;
  3. liveness 判定失败 → 重启容器;
  4. 重启后又没连上下游 → 又失败 → 又重启;
  5. 重启风暴——Pod 永远起不来,还拖垮了下游。

正确原则:

探针该探什么不该探什么
liveness进程是否卡死(一个不依赖任何外部组件的轻量端点)业务接口、依赖下游的接口
readiness是否具备处理请求的能力(可以含依赖检查)会触发重活的接口
# ✅ liveness 只探进程健康livenessProbe:httpGet:{path:/healthz,port:8080}# 只返回 200,不查依赖# ✅ readiness 探业务就绪(可含依赖)readinessProbe:httpGet:{path:/readyz,port:8080}# 检查 DB 连接等

Go 实现示例:

// 健康端点分离mux.HandleFunc("/healthz",func(w http.ResponseWriter,r*http.Request){// liveness:只要进程活着就返回 200,不查任何依赖w.WriteHeader(http.StatusOK)w.Write([]byte("ok"))})mux.HandleFunc("/readyz",func(w http.ResponseWriter,r*http.Request){// readiness:检查下游依赖ctx,cancel:=context.WithTimeout(r.Context(),1*time.Second)defercancel()iferr:=db.PingContext(ctx);err!=nil{w.WriteHeader(http.StatusServiceUnavailable)w.Write([]byte("db not ready"))return}w.WriteHeader(http.StatusOK)w.Write([]byte("ready"))})

五、探针参数对照表(可带走物)

参数含义推荐值常见错误
initialDelaySeconds创建后多久首次探测liveness: 配了 startup 可设 0设太短→启动期被杀
periodSeconds探测间隔10(readiness 可 5)太小→频繁探测耗资源
timeoutSeconds单次超时2~5大于 period→节奏乱
failureThreshold连续失败几次算失败liveness: 3;readiness: 3设 1→一次抖动就摘
successThreshold连续成功几次算成功readiness: 1~2;liveness: 必须 1readiness 设太高→恢复慢

六、排查没就绪的三步

顺序动作命令
1看具体失败原因kubectl describe pod <pod>找Probe failed那行
2手动模拟探测kubectl exec -it <pod> -- curl -v localhost:8080/readyz
3核对端口和路径探针的port是容器端口,不是 Service 端口

第 3 条特别常错:探针的port必须写容器内监听的端口。如果写了 Service 的端口或 hostPort,探测必然失败。

留个问题给你:你们的 liveness 探针是探/healthz这种纯进程健康端点,还是探业务接口?initialDelaySeconds现在配的是多少?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 10:19:00

电梯电源干扰消除方案

电梯作为高层建筑核心垂直交通设备&#xff0c;其控制系统、变频驱动系统、门禁及监控系统均为精密弱电设备&#xff0c;对供电电源的稳定性、纯净度要求极高。现场电网存在的谐波干扰、电压浪涌、尖峰脉冲、电磁辐射、零线干扰等电源问题&#xff0c;极易导致电梯出现主板死机…

作者头像 李华
网站建设 2026/10/13 10:18:55

Agent开发核心组件进阶全总结:从理论到代码实战

引言掌握Agent的核心组件&#xff0c;是区分“调用接口的程序员”与“Agent工程师”的关键分水岭。调用API只是入门&#xff0c;真正理解核心循环、记忆系统、RAG、工具调用和规划范式的工程细节&#xff0c;才能构建出稳定、可用的Agent系统。本文把Agent开发的五大核心组件拆…

作者头像 李华
网站建设 2026/10/13 10:18:47

深圳机器人零件厂家推荐:源头直供机器人零件加工更省心

在机器人零部件制造、机器人零件 CNC 加工行业&#xff0c;很多研发与采购团队长期被供应链乱象困扰&#xff1a;图纸对接层层转手、报价模糊虚高、交期层层延误、品质问题互相推诿。想要做好机器人零部件精密加工、机器人结构件加工、机器人关节零件加工&#xff0c;选对直供源…

作者头像 李华
网站建设 2026/10/13 10:17:15

Conda换源配置全攻略:解决下载慢与连接失败问题

1. 为什么conda换源这件事值得单独拿出来说如果你用Anaconda或者Miniconda管理过Python环境&#xff0c;大概率经历过这样的场景&#xff1a;敲下conda install numpy&#xff0c;终端里光标转了半天&#xff0c;进度条纹丝不动&#xff0c;最后甩给你一个CondaHTTPError: HTTP…

作者头像 李华
网站建设 2026/10/13 10:16:23

大模型面试避坑指南:小白程序员如何通过真实项目斩获Offer(收藏版)

本文基于作者上百场大模型面试经验&#xff0c;提炼出2026年大模型面试的核心考察点&#xff0c;包括Agent方向岗位增多、简历价值变化、准备时机等。文章强调“为可靠付钱”的行业趋势&#xff0c;建议候选人关注Agentic与推理能力、业务链路闭环、项目深度和评价维度变化。此…

作者头像 李华