探针是指Kubelet周期性地检查容器的状况,有三种类型的探针:
- ExecAction:在容器内执行一个指定的命令。如果该命令的退出状态码为0,则成功
- TCPSocketAction:探测容器的指定TCP端口,如果该端口处于open状态,则成功
- HTTPGetAction:探测容器指定端口/路径上的HTTP Get请求,如果HTTP响应状态码在200到400(不包含400)之间,则成功
探针有三种可能的结果:
- Success:容器通过检测
- Failure:容器未通过检测
- Unknown:检测执行失败,此时kubelet不做任何处理
Kubelet可以在两种情况下对运行中的容器执行Probe:
-
就绪检查:确定容器是否已经就绪并接收服务请求。如果就绪检查失败,kubernetes将该Pod的IP地址从所有匹配的Service的资源池中移除掉。
-
健康检查:确定容器是否正在运行。如果健康检查失败,kubelete将结束该容器,并根据重启策略确定是否重启该容器。
合适使用健康检查和就绪检查:
-
如果容器中的进程在碰到问题时可以自己crash,就不需要执行健康检查;kubelet 可以自动的根据Pod的重启策略执行对应的动作
-
如果您希望在容器的进程无响应后,将容器kill掉并重启,则指定一个健康检查liveness probe,并同时指定 重启策略为Always或者OnFailure
-
如果您想在探测Pod确实就绪之后才向其分发服务请求,请指定一个就绪检查readiness probe。此时,就绪检查的内容可能和健康检查相同。就绪检查适合如下几类容器:
- 初始化时需要加载大量的数据、配置文件
- 启动时需要执行迁移任务
- 其他
对此的理解:
容器的进程在出现问题时自己退出了,则我们可以不使用健康检查。SpringBoot项目,Redis、Datasource等出现问题时,是不会自动退出进程的,所以我们需要使用健康检查。
使用健康检查时,当判断到容器此时无响应时,应该只会将容器标记为死亡(或者其他的东西),并不会进行一些其他的处理。稍后,控制器发现这个容器被标记为死亡了,然后根据其重启策略对其进行处理。(我自己猜的,也不知道正确不正确)