一,前言

上一篇,介绍了 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的访问调度,不会被杀死重启


五,结尾

下一篇,服务探针的实现;