13.容器的检查

探针是指Kubelet周期性地检查容器的状况,有三种类型的探针:

  • ExecAction:在容器内执行一个指定的命令。如果该命令的退出状态码为0,则成功
  • TCPSocketAction:探测容器的指定TCP端口,如果该端口处于open状态,则成功
  • HTTPGetAction:探测容器指定端口/路径上的HTTP Get请求,如果HTTP响应状态码在200到400(不包含400)之间,则成功

探针有三种可能的结果:

  • Success:容器通过检测
  • Failure:容器未通过检测
  • Unknown:检测执行失败,此时kubelet不做任何处理

Kubelet可以在两种情况下对运行中的容器执行Probe:

  • 就绪检查:确定容器是否已经就绪并接收服务请求。如果就绪检查失败,kubernetes将该Pod的IP地址从所有匹配的Service的资源池中移除掉。

  • 健康检查:确定容器是否正在运行。如果健康检查失败,kubelete将结束该容器,并根据重启策略确定是否重启该容器。


合适使用健康检查和就绪检查:

  1. 如果容器中的进程在碰到问题时可以自己crash,就不需要执行健康检查;kubelet 可以自动的根据Pod的重启策略执行对应的动作

  2. 如果您希望在容器的进程无响应后,将容器kill掉并重启,则指定一个健康检查liveness probe,并同时指定 重启策略为Always或者OnFailure

  3. 如果您想在探测Pod确实就绪之后才向其分发服务请求,请指定一个就绪检查readiness probe。此时,就绪检查的内容可能和健康检查相同。就绪检查适合如下几类容器:

    • 初始化时需要加载大量的数据、配置文件
    • 启动时需要执行迁移任务
    • 其他

对此的理解:

容器的进程在出现问题时自己退出了,则我们可以不使用健康检查。SpringBoot项目,Redis、Datasource等出现问题时,是不会自动退出进程的,所以我们需要使用健康检查。

使用健康检查时,当判断到容器此时无响应时,应该只会将容器标记为死亡(或者其他的东西),并不会进行一些其他的处理。稍后,控制器发现这个容器被标记为死亡了,然后根据其重启策略对其进行处理。(我自己猜的,也不知道正确不正确)