k8s 探测方法总结
一定要:
1. 一定要定义 readiness 保证服务在准备好时,再接收流量 2. 增加一个言简意赅的 endpoint,使用 httpGet 检查 3. 检查一定要是最直接的处理业务的 endpoint,而非管理等 endpoint 4. 服务一定要准备好时,endpoint 才返回 200,加载数据,预热等阶段可以返回 503
不要:
liveness 不要依赖外部服务,否则外部服务问题,会使容器重建
不要使用相同的 liveness 和 readiness , 如果使用了相同的,那么 liveness 的判定时间一定要比 readiness 长
尽量避开使用 exec 模式, kubelet 低版本会忽略 timeout 参数,对僵尸,死锁超时等反应不正确
参考链接: https://srcco.de/posts/kubernetes-liveness-probes-are-dangerous.html
这里说明下 exec 探测模式关于 timeoutSeconds 参数;
该参数指定了 probe 动作的超时时间, 超时认为失败,采取相应的动作; 但是在 kubelet 1.20 版本以前,exec 模式 和 http,tcp 等其他模式处理是有差别的; exec 模式忽略了 timeout 的错误, 不作为有效的判断结果, 所以重启,下线等 动作都是不会做的, 这在应对 hang, 死锁进程时,就有点小问题;
所以以前都尽量避开 exec 模式的用法, 或者自己的探测脚本超时控制小于 probe 的超时时间,尽量返回明确结果; 面对容器内部毫无反应的情况,仍然存在问题;
这也是社区一个多年的问题,1.20 版本 ExecProbeTimeout
该特性 default=true,解决了该问题, 真遇到问题的 可以把该特性关闭; 谨防扰乱应用状态;
修复的新版代码如下
评论