可观测性
首先是应用的健康状态上面,可以实时地进行观测;
第二个是可以获取应用的资源使用情况;
第三个是可以拿到应用的实时日志,进行问题的诊断与分析。
Liveness probe 和 Readiness probe
Readness probe 也叫就绪指针,用来判断一个 pod 是否处在就绪状态。当一个 pod 处在就绪状态的时候,它才能够对外提供相应的服务,也就是说接入层的流量才能打到相应的 pod。当这个 pod 不处在就绪状态的时候,接入层会把相应的流量从这个 pod 上面进行摘除(endpoint)。
Liveness 指针是存活指针,用来判断一个 pod 是否处在存活状态。当一个 pod 处在不存活状态的时候,上层的判断机制来判断这个 pod 是否需要被重新拉起。那如果上层配置的重启策略是 restart always 的话,那么此时这个 pod 会直接被重新拉起。
Liveness 指针和 Readiness 指针支持三种不同的探测方式(都在pod的yaml中配置):
第一种是 httpGet。它是通过发送 http Get 请求来进行判断的,当返回码是 200-399 之间的状态码时,标识这个应用是健康的;
第二种探测方式是 Exec。它是通过执行容器中的一个命令来判断当前的服务是否是正常的,当命令行的返回结果是 0,则标识容器是健康的;
第三种探测方式是 tcpSocket。它是通过探测容器的 IP 和 Port 进行 TCP 健康检查,如果这个 TCP 的链接能够正常被建立,那么标识当前这个容器是健康的。
global参数:
第一个参数叫 initialDelaySeconds,它表示的是说这个 pod 启动延迟多久进行一次检查
第二个是 periodSeconds,它表示的是检测的时间间隔,正常默认的这个值是 10 秒;
第三个字段是 timeoutSeconds,它表示的是检测的超时时间,当超时时间之内没有检测成功,那它会认为是失败的一个状态
第四个是 successThreshold,它表示的是:当这个 pod 从探测失败到再一次判断探测成功,所需要的阈值次数,默认情况下是 1 次,表示原本是失败的,那接下来探测这一次成功了,就会认为这个 pod 是处在一个探针状态正常的一个状态;
最后一个参数是 failureThreshold,它表示的是探测失败的重试次数,默认值是 3,表示的是当从一个健康的状态连续探测 3 次失败,那此时会判断当前这个pod的状态处在一个失败的状态。
从探测结果来讲主要分为三种:
第一种是 success,当状态是 success 的时候,表示 container 通过了健康检查,也就是 Liveness probe 或 Readiness probe 是正常的一个状态;
第二种是 Failure,Failure 表示的是这个 container 没有通过健康检查,如果没有通过健康检查的话,那么此时就会进行相应的一个处理,那在 Readiness 处理的一个方式就是通过 service。service 层将没有通过 Readiness 的 pod 进行摘除,而 Liveness 就是将这个 pod 进行重新拉起,或者是删除。
第三种状态是 Unknown,Unknown 是表示说当前的执行的机制没有进行完整的一个执行,可能是因为类似像超时或者像一些脚本没有及时返回,那么此时 Readiness-probe 或 Liveness-probe 会不做任何的一个操作,会等待下一次的机制来进行检验。
在 kubelet 里面有一个叫 ProbeManager 的组件,这个组件里面会包含 Liveness-probe 或 Readiness-probe,这两个 probe 会将相应的 Liveness 诊断和 Readiness 诊断作用在 pod 之上,来实现一个具体的判断。
操作注意:
适当调大超时阈值,防止容器压力大的情况下偶发超时误判
适当调大探测失败的重试次数
exec的shell脚本判断可能调用超时
tcpSocket遇到tls,可能会有影响
问题诊断
K8s 整体的一个状态就是基于类似状态机的一个机制进行转换的,而不同状态之间的转化都会在相应的 K8s对象上面留下来 Status 或者Conditions 的一些字段来进行表示。
Pod 上面有一个字段叫 Status,container 也有一个字段 State,condition 机制:在 K8s 里面有很多这种比较小的这个状态,而这个状态之间的聚合会变成上层的这个 Status
应用远程调试
kubectl exec-it pod-name [-c container-name] bin/bash
进入正在运行的pod
Servic 远程调试
开源组件,Telepresence,它可以将本地的应用代理到远程集群中的一个 service 上面,将远程的一个 deployment swap 到本地的一个 application
如果本地应用需要调用远程集群的服务时候,可以通过 port-forward 的方式将远程的应用调用到本地的端口之上
调试工具
kubectl 的一个插件,叫 kubectl-debug,直接通过 kubectl-debug 这条命令来去诊断远程的一个 pod,可以指定自定义调试工具的image。
依赖于 Linux namespace 的方式,在要诊断的container 的 namespace 挂靠新的容器

浙公网安备 33010602011771号