Pod的生命周期中存在2种健康探测,Readiness和Liveness是保证Pod容器正常运行的关键检测手段。
1、零停机部署, Scale Up 新的Pod作为backend被添加到 Service 的负责均衡中
2、避免无效的Pod导致服务中断
3、更加安全的滚动升级

由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler

默认健康探测

默认是基于容器的dockerfile中的CMD或ENTRYPOINT指定的,容器进程退出代表故障处理方法就是进入重启策略(restartPolicy,默认为Always)

这个阶段还是属于容器自身状态是否正常,在docker中容器启动失败后就一直失败状态

支持三种策略:

  • Always:当容器终止退出后,总是重启容器,默认策略
  • OnFailure:当容器异常退出(退出状态码非0)时,才重启容器
  • Never:当容器终止退出,从不重启容器

Readiness

容器是否启动好并对外提供Service服务

  • Readiness探测成功代表Pod的READY为可用,否则不可用
  • READY可用后,Service会把信息添加映射到IPVS上或者iptables上

Liveness

运行期间容器是否故障,进入重启策略自愈

  • 连续探测3次失败,进入重启策略
  • Pod的RESTARTS状态记录了重启次数

探测的三种方式

  1. ExecAction:在容器内执行指定命令,诊断是否成功,比如cat 一个文件、ps一个进程等等
containers:  #属于容器层级下级
 readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5
#检测是否有/tmp/healthy文件
  1. TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的,基于四层的服务检查
containers:  #属于容器层级下级 
 readinessProbe:
  tcpSocket:
   port: 80
  initialDelaySeconds: 5
  periodSeconds: 5
#检测服务是否有tcp协议80端口
  1. HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于400,则诊断被认为是成功的,基于七层服务检查
containers:  #属于容器层级下级
 readinessProbe:
  httpGet:
   scheme: HTTP  #支持 HTTP(默认值)和 HTTPS
   port: 80
   path: /index.html  
  initialDelaySeconds: 5
  periodSeconds: 5
#检查 http://IP:80/index.html是否返回正常状态码

探测执行规则

failureThreshold 探测几次失败才算失败 默认是连续三次
periodSeconds 每次的多长时间探测一次 默认10s
timeoutSeconds 探测超时的秒数 默认1s
initialDelaySeconds 初始化延迟探测,第一次探测的时候,因为主程序未必启动完成