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等资源对象时,都可以选择配置不同的探针,如下:
我这里配置好两种指针后,生成的探针相关yaml文件内容如下:
livenessProbe: # 存活探针
failureThreshold: 3 # 探测3次失败则将pod标记为不存活
httpGet: # 探针检测方式为httpget
path: / # 请求路径为 /
port: 80 # 请求端口为80,相当于访问的是: http://pod_ip:80
scheme: HTTP # 访问所用协议为http
initialDelaySeconds: 10 # 初次探测时间在容器启动10s后
periodSeconds: 10 # 探测频率为10s
successThreshold: 1 # 探测1次成功则将pod标记为健康
timeoutSeconds: 1 # 超时时间为1s
readinessProbe: # 就绪探针
failureThreshold: 3 # 检测失败3次则标记为未就绪
initialDelaySeconds: 10 # 初次探测时间在容器启动10s后
periodSeconds: 20 # 探测频率为20s
successThreshold: 1 # 探测1次成功则将pod标记为已就绪
tcpSocket: # 与pod的80端口发起tcp连接
port: 80
timeoutSeconds: 1 # 超时时间为1s