容器健康检查

最近更新时间:2018-12-27 15:05:45

对于Pod的健康检查,可以通过两类探针来检查: LivenessProbe(存活探针)和ReadinessProbe(就绪探针)

  • LivenessProbe(存活探针):用于判断容器是否存活。如果LivenessProbe探针探测到容器不健康,则kubelet将会杀掉该容器,并根据容器的重启策略做相应的处理;若探测到容器健康,则不做任何处理
  • ReadinessProbe(就绪探针):用于判断容器是否已经就绪可以接收流量。一些程序的启动时间可能很长,比如要加载磁盘数据或者要依赖外部的某个模块启动完成才能提供服务。这时候程序进程在,但是并不能对外提供服务。如果ReadinessProbe检测通过,则允许服务将流量发送到该容器;如果ReadinessProbe检测到失败,则集群将会停止向该容器发送流量

健康检查方式

  • TCP端口检查

    对于提供 TCP 通信服务的容器,集群周期性地对该容器建立 TCP 连接,如果连接成功,则证明探测成功,否则探测失败。选择 TCP 端口探测方式,必须指定容器监听的端口。比如我们有一个 nginx 容器,它的服务端口是 80,我们对该容器配置了 TCP 端口探测,指定探测端口为 80,那么集群会周期性地对该容器的 80 端口发起 TCP 连接,如果连接成功则证明检查成功,否则检查失败

  • HTTP请求检查

    HTTP 请求探测针对的是提供 HTTP/HTTPS 服务的容器,通过容器的IP地址、端口号以及以及路径,集群周期性的对该容器发起HTTP/HTTPS Get的请求,如果相应的状态码大于200且小于400,则认为容器状态健康否则探测异常。 例如:提供 HTTP 服务的容器,服务端口为 80,HTTP 检查路径为 /health,那么集群会周期性地对容器发起如下请求: GET http://containerIP:80/health

  • 执行命令检查

    执行命令检查是一种强大的检查方式,该方式要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果命令的返回结果是 0 则检查成功,否则检查失败.

    对于上面提到的 TCP 端口检查和 HTTP 请求检查,都可以通过执行命令检查的方式来替代:

    • 对于 TCP 端口探测,我们可以写一个程序来对容器的端口进行 connect,如果 connect 成 功,脚本返回 0,否则返回 -1。

    • 对于 HTTP 请求探测,我们可以写一个脚本来对容器进行 wget。 wget http://containerIP:80/health 并检查 response 的返回码,如果返回码在 200~399 的范围,脚本返回 0,否则返回 -1。

备注:

  • 必须把要执行的程序放在容器的镜像里面,否则会因找不到程序而执行失败。
  • 如果执行的命令是一个 shell 脚本,由于集群在执行容器里的程序时,不在终端环境下,因此不能直接指定脚本为执行命令,需要加上脚本解决器。比如脚本是 /data/scripts/health.sh,那么我们使用执行命令检查时,指定的程序应该是 sh /data/scripts/health.sh。究其原因是集群在执行容器里的程序时,不在终端环境下。

配置Probe

Probe 中有很多精确和详细的配置,通过它们你能准确的控制liveness和readiness检查:

  • 启动延迟initialDelaySeconds,单位秒。该参数用于设置容器启动后多久开始启动探测。例如设置启动延迟为30s,那么健康检查将在容器启动后30s后开始
  • 间隔时间periodSeconds,单位秒。该参数用于设置健康检查的频率。例如设置间隔时间为10s,则每10s检查一次
  • 响应超时timeoutSeconds,单位秒。该参数用于设置检查探测的超时时间,对应到 TCP 端口探测、HTTP 请求探测、执行命令检查三种方式,分别表示 TCP 连接超时时间、HTTP 请求响应超时时间以及执行命令的超时时间。
  • 健康阈值successThreshold,单位次。该参数用来设定健康检查连续成功多少次后,才判定容器是健康的。例如健康阈值设置成 3,则说明只有满足连续 3 次探测都成功才认为容器是健康的。
  • 不健康阈值failureThreshold,单位次。该参数用来设定健康检查连续失败多少次后,才判定容器是不健康的。例如不健康阈值设置成 3,只有满足连续 3 次都探测失败了,才认为容器是不健康的。

备注: 对于容器的存活检查(Liveness),健康阈值(successThreshold)只能是1,用户设置成其它值将被视为无效。因为只要探测成功一次,我们就能确定容器是存活的。

金山云,开启您的云计算之旅

注册有礼