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状态记录了重启次数
探测的三种方式
- ExecAction:在容器内执行指定命令,诊断是否成功,比如cat 一个文件、ps一个进程等等
containers: #属于容器层级下级
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
#检测是否有/tmp/healthy文件
- TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的,基于四层的服务检查
containers: #属于容器层级下级
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 5
#检测服务是否有tcp协议80端口
- 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 初始化延迟探测,第一次探测的时候,因为主程序未必启动完成