写点什么

k8s 探测方法总结

作者:Geek_f24c45
  • 2023-03-06
    北京
  • 本文字数:1208 字

    阅读完需:约 4 分钟

一定要:


1. 一定要定义 readiness 保证服务在准备好时,再接收流量 2. 增加一个言简意赅的 endpoint,使用 httpGet 检查 3. 检查一定要是最直接的处理业务的 endpoint,而非管理等 endpoint 4. 服务一定要准备好时,endpoint 才返回 200,加载数据,预热等阶段可以返回 503


不要:


  1. liveness 不要依赖外部服务,否则外部服务问题,会使容器重建

  2. 不要使用相同的 liveness 和 readiness , 如果使用了相同的,那么 liveness 的判定时间一定要比 readiness 长

  3. 尽量避开使用 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, 死锁进程时,就有点小问题;


        livenessProbe:          exec:            command:            - /bin/sh            - -c            - echo livenessProbe; sleep 60s          initialDelaySeconds: 10          periodSeconds: 5          timeoutSeconds: 20
# 比如这种写法,低版本kubelet是不会自动重启POD的;
复制代码


所以以前都尽量避开 exec 模式的用法, 或者自己的探测脚本超时控制小于 probe 的超时时间,尽量返回明确结果; 面对容器内部毫无反应的情况,仍然存在问题;


这也是社区一个多年的问题,1.20 版本 ExecProbeTimeout 该特性 default=true,解决了该问题, 真遇到问题的 可以把该特性关闭; 谨防扰乱应用状态;


修复的新版代码如下

func (pr execProber) Probe(e exec.Cmd) (probe.Result, string, error) {	var dataBuffer bytes.Buffer	writer := ioutils.LimitWriter(&dataBuffer, maxReadLength)
e.SetStderr(writer) e.SetStdout(writer) err := e.Start() if err == nil { err = e.Wait() } data := dataBuffer.Bytes()
klog.V(4).Infof("Exec probe response: %q", string(data)) if err != nil { exit, ok := err.(exec.ExitError) if ok { if exit.ExitStatus() == 0 { return probe.Success, string(data), nil } return probe.Failure, string(data), nil }
timeoutErr, ok := err.(*TimeoutError) if ok { if utilfeature.DefaultFeatureGate.Enabled(features.ExecProbeTimeout) { return probe.Failure, string(data), nil }
klog.Warningf("Exec probe timed out after %s but ExecProbeTimeout feature gate was disabled", timeoutErr.Timeout()) }
return probe.Unknown, "", err } return probe.Success, string(data), nil}
复制代码


用户头像

Geek_f24c45

关注

还未添加个人签名 2018-03-24 加入

还未添加个人简介

评论

发布
暂无评论
k8s 探测方法总结_#k8s_Geek_f24c45_InfoQ写作社区