健康检查配置
本文分享 K8S 健康检查配置的最佳实践,文末也分享配置不当的案例。
Kubernetes 健康检查介绍
K8S 支持三种健康检查:
- 就绪检查(
readinessProbe
): Pod启动后,如果配了就绪检查,要等就绪检查探测成功,Pod Ready 状态变为 True,允许放流量进来;在运行期间如果突然探测失败,Ready 状态变为 False,摘除流量。 - 存活检查(
livenessProbe
): Pod 在运行时,如果存活检查探测失败,会自动重启容器;值得注意的是,存活探测的结果不影响 Pod 的 Ready 状态,这也是许多同学可能误解的地方。 - 启动检查(
startupProbe
): 作用是让存活检查和就绪检查的开始探测时间延后,等启动检查成功后再开始探测,通常用于避免业务进程启动慢导致存活检查失败而被无限重启。
三种健康检查配置格式都是一样的,以 readinessProbe
为例:
readinessProbe:
successThreshold: 1 # 1 次探测成功就认为健康
failureThreshold: 2 # 连续 2 次探测失败认为不健康
periodSeconds: 3 # 3s 探测一次
timeoutSeconds: 2 # 2s 超时还没返回成功就认为不健康
httpGet: # 使用 http 接口方式探测,GET 请求 80 端口的 "/healthz" 这个 http 接口,响应状态码在200~399之间视为健康,否则不健康。
port: 80
path: "/healthz"
#exec: # 使用脚本探测,执行容器内 "/check-health.sh" 这个脚本文件,退出状态码等于0视为健康,否则不健康。
# command: ["/check-health.sh"]
#tcp: # 使用 TCP 探测,看 9000 端口是否监听。
# port: 9000
探测结果一定要真实反应业务健康状态
首选 HTTP 探测
通常是推荐业务自身提供 http 探测接口,如果业务层面健康就返回 200 状态码;否则,就返回 500。
备选脚本探测
如果业务还不支持 http 探测接口,或者有探测接口但不是 http 协议,也可以将探测逻辑写到脚本文件里,然后配置脚本方式探测。