一,前言
上一篇,介绍了 k8s 滚动更新的实现;
本篇,介绍 k8s 服务探针;
二,健康度检查
当 Pod 的状态为 Running 时,即 Pod 能够被访问到,就可以被分配流量了;
但是,一个后端容器启动成功,不一定代表服务启动成功了;
比如:mysql 数据库的容器,mysql 容器成功启动后,还需要启动 mysql服 务,而 mysql 服务的启动需要 1 分钟以上的时间,有可能启动成功也有可能启动失败;
所以,mysql 的容器启动成功并不代表 mysql 服务最终可以被访问;
类似这种“容器活着,但服务已经死掉了”的情况,需要如何才能判断容器中的服务是否正常呢?
可以使用服务探针(古代试毒,用银针往碗里一插,变黑了就是有毒),探针就是指通过探测的手段,查看服务是否存活;
三,服务探针
服务探针共有三种:
- 存活探针 LivenessProbe:探测服务是否活着;
- 可用探针 ReadinessProbe 探测服务是否或者且能正常工作;
- 启动探针 StartupProbe 探测启动成功;
探针不是容器,探针是容器的属性,是被植入到容器内部的
1,存活探针 LivenessProbe
存活探针:可以用来检测正在运行中的服务是否发生崩溃、中途出现退出或无响应现象;
当探针探测到错误时, Kubernetes 就会杀掉这个 Pod;否则,将不会进行任何处理;
备注:如果默认没有配置这个探针, Pod 不会被杀死;
2,可用探针 ReadinessProbe
可用探针:可以用来检测 Pod 是否允许被访问到(是否准备好接受流量)。
如果服务加载数据较多,或有要求需要在特定情况下不被分配到流量,可以用这个可用探针;
当探针检测失败时,流量就不会分配给该 Pod;探针检测失败,Pod 不会被杀死;
备注:在没有配置该探针的情况下,会一直将流量分配给 Pod;
3,启动探针 StartupProbe
- 第三种是启动探针。作用是用来检测 Pod 是否已经启动成功。如果你的服务启动需要一些加载时长(例如初始化日志,等待其他调用的服务启动成功)才代表服务启动成功,则可以用这个探针。
- 如果探针检测失败,该 Pod 就会被杀死重启。在没有配置该探针的情况下,默认不会杀死 Pod 。在启动探针运行时,其他所有的探针检测都会失效
四、三种探针的对比
探针名称 | 在哪个环节触发 | 作用 | 检测失败对Pod的反应 |
启动探针 | Pod 运行时 | 检测服务是否启动成功 | 杀死 Pod 并重启 |
存活探针 | Pod 运行时 | 检测服务是否崩溃,是否需要重启服务 | 杀死 Pod 并重启 |
可用探针 | Pod 运行时 | 检测服务是不是允许被访问到 | 停止Pod的访问调度,不会被杀死重启 |
五,结尾
下一篇,服务探针的实现;