无需编写HTTP探针代码,如何为启动耗时15分钟的应用配置合适的readiness、liveness探针?
问题根因分析
- 探针端口不匹配
从事件输出可以看到,系统同时存在对8080、8081两个端口的探测失败记录,而你提供的配置仅配置了8080端口的探测,说明存在残留的旧探针配置、或Deployment滚动更新未完全生效,系统对未监听的8081端口发起探测时直接返回失败,累计达到阈值后触发Pod重启。 - 探测方式与应用运行模式不兼容
你的应用存在5分钟的空闲运行周期,若空闲期间应用临时关闭8080端口的监听,TCP探针会直接探测失败,累计达到failureThreshold阈值后触发系统判定Pod不健康。 - 现有探针参数逻辑不合理
你将periodSeconds设置为2000秒,单次探测间隔超过33分钟,无法及时校验应用状态,偶发的端口不可达会直接累计失败次数,进而触发重启。
最优配置方案
你不想编写HTTP探针代码的前提下,可使用exec类型探针结合系统命令完成探测,同时搭配K8s 1.16及以上版本支持的startupProbe专门处理长启动场景,避免探针误杀启动中的应用,具体配置参考如下:
startupProbe: exec: command: - /bin/sh - -c # 检测应用是否完成启动,可替换为你应用启动完成的标识判断逻辑 - ss -tulpn | grep -q :8080 # 总允许启动时长为 10秒*90次=900秒=15分钟,完全覆盖你的应用启动周期 initialDelaySeconds: 60 periodSeconds: 10 failureThreshold: 90 timeoutSeconds: 3 livenessProbe: exec: command: - /bin/sh - -c # 检测应用最近10分钟是否有日志输出,适配你2-3分钟打印日志+5分钟空闲的运行循环 - [ $(($(date +%s) - $(stat -c %Z /proc/1/fd/1))) -lt 600 ] initialDelaySeconds: 0 periodSeconds: 30 failureThreshold: 5 successThreshold: 1 timeoutSeconds: 5 readinessProbe: exec: command: - /bin/sh - -c # 检测端口是否监听,确认服务可对外承接流量 - ss -tulpn | grep -q :8080 initialDelaySeconds: 0 periodSeconds: 10 failureThreshold: 3 successThreshold: 1 timeoutSeconds: 2
配置上线前需先执行kubectl get deployment [你的部署名] -o yaml 确认所有探针配置中不存在对8081端口的探测规则,清理残留配置后再更新。
内容的提问来源于stack exchange,提问作者bosari
相关产品推荐
相关产品推荐

