date: 2020-06-22title: pod健康检查之liveness和readiness #标题
tags: pod健康检查 #标签
categories: k8s # 分类

记录下Liveness 指针和 Readiness 指针的具体的用法。

探测方式

Liveness 指针和 Readiness 指针支持三种不同的探测方式:

  • 第一种是 httpGet。它是通过发送 http Get 请求来进行判断的,当返回码是 200-399 之间的状态码时,标识这个应用是健康的;
  • 第二种探测方式是 Exec。它是通过执行容器中的一个命令来判断当前的服务是否是正常的,当命令行的返回结果是 0,则标识容器是健康的;
  • 第三种探测方式是 tcpSocket 。它是通过探测容器的 IP 和 Port 进行 TCP 健康检查,如果这个 TCP 的链接能够正常被建立,那么标识当前这个容器是健康的。

探测结果

从探测结果来讲主要分为三种:

  • 第一种是 success,当状态是 success 的时候,表示 container 通过了健康检查,也就是 Liveness probe 或 Readiness probe 是正常的一个状态;
  • 第二种是 Failure,Failure 表示的是这个 container 没有通过健康检查,如果没有通过健康检查的话,那么此时就会进行相应的一个处理,那在 Readiness 处理的一个方式就是通过service。service 层将没有通过 Readiness 的 pod 进行摘除,而 Liveness 就是将这个 pod 进行重新拉起,或者是删除。
  • 第三种状态是 Unknown,Unknown 是表示说当前的执行的机制没有进行完整的一个执行,可能是因为类似像超时或者像一些脚本没有及时返回,那么此时 Readiness-probe 或
    Liveness-probe 会不做任何的一个操作,会等待下一次的机制来进行检验。

liveness与readiness总结

Liveness(存活探针) Readiness(就绪探针)
描述 用于判断容器是否存活,即Pod状态是否为Running,如果Liveness探针判断容器不健康,则会触发kubelet杀掉容器,并根据配置的策略判断容器是否重启,如果默认不配置liveness探针,则认为返回值默认为成功 用于判断容器是否启动完成,即pod的condition是否为Ready,如果探测结果不成功,则会将Pod从Endpoint中移除,直至下次判断成功,再将pod挂回到Endpoint上。
检测失败 杀掉Pod 切断上层流量到Pod
使用场景 支持重新拉起的应用 启动后无法立即对外服务的应用

注意事项

不论是liveness还是Readness探针,选择合适的探测方式可以防止被误操作:

  • 调大判断的超时阈值,防止在容器压力较高的情况下出现偶发超时。
  • 调整判断的次数阈值,3此的默认值不一定是最佳的。
  • exec的方式如果执行的是shell脚本判断,在容器中可能调用时间会很长。
  • 使用topSocket的方式遇到TLS的场景,需要业务层判断是否有影响。

配置liveness和readness探针

一般我们不用手动去编写yaml文件,只需要在web管理页面进行配置即可,k8s的管理平台有很多,比如官方的dashboard,和开源的kuboard,个人喜欢用kuboard(国人开发,更易于使用):

kuboard配置探针的方式如下:

在创建或编辑deployment等资源对象时,都可以选择配置不同的探针,如下:

pod健康检查之liveness和readiness - 图1

pod健康检查之liveness和readiness - 图2

我这里配置好两种指针后,生成的探针相关yaml文件内容如下:

  1. livenessProbe: # 存活探针
  2. failureThreshold: 3 # 探测3次失败则将pod标记为不存活
  3. httpGet: # 探针检测方式为httpget
  4. path: / # 请求路径为 /
  5. port: 80 # 请求端口为80,相当于访问的是: http://pod_ip:80
  6. scheme: HTTP # 访问所用协议为http
  7. initialDelaySeconds: 10 # 初次探测时间在容器启动10s后
  8. periodSeconds: 10 # 探测频率为10s
  9. successThreshold: 1 # 探测1次成功则将pod标记为健康
  10. timeoutSeconds: 1 # 超时时间为1s
  11. readinessProbe: # 就绪探针
  12. failureThreshold: 3 # 检测失败3次则标记为未就绪
  13. initialDelaySeconds: 10 # 初次探测时间在容器启动10s后
  14. periodSeconds: 20 # 探测频率为20s
  15. successThreshold: 1 # 探测1次成功则将pod标记为已就绪
  16. tcpSocket: # 与pod的80端口发起tcp连接
  17. port: 80
  18. timeoutSeconds: 1 # 超时时间为1s