服务健康检查设置

最近更新时间:2019-04-12 17:56:46

腾讯云容器集群内核基于 kubernetes。kubernetes 支持对容器进行周期性探测,根据探测结果来判断容器的健康状态,并执行额外的操作。

健康检查类别

健康检查分为两大类别:容器存活检查和容器就绪检查。

  • 容器存活检查:该检查方式用于检测容器是否存活,类似于我们执行 ps 命令检查进程是否存在。如果容器的存活检查失败,集群会对该容器执行重启操作;若容器的存活检查成功则不执行任何操作。
  • 容器就绪检查:该检查方式用于检测容器是否准备好开始处理用户请求。一些程序的启动时间可能很长,比如要加载磁盘数据或者要依赖外部的某个模块启动完成才能提供服务。这时候程序进程在,但是并不能对外提供服务。这种场景下该检查方式就非常有用。如果容器的就绪检查失败,集群会屏蔽请求访问该容器;若检查成功,则会开放对该容器的访问。

健康检查方式

TCP 端口探测

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

HTTP 请求探测

HTTP 请求探测针对的是提供 HTTP/HTTPS 服务的容器,集群周期性地对该容器发起 HTTP/HTTPS GET 请求,如果 HTTP/HTTPS response 返回码属于 200~399 范围,则证明探测成功,否则探测失败。使用 HTTP 请求探测必须指定容器监听的端口和 HTTP/HTTPS 的请求路径。
例如:提供 HTTP 服务的容器,服务端口为 80,HTTP 检查路径为 /health-check,那么集群会周期性地对容器发起如下请求:GET http://containerIP:80/health-check

执行命令检查

执行命令检查是一种强大的检查方式,该方式要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果命令的返回结果是 0 则检查成功,否则检查失败。
对于上面提到的 TCP 端口探测和 HTTP 请求探测,都可以通过执行命令检查的方式来替代:

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

注意:

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

其它公共参数

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

    注意:
    如果健康检查的类型为存活检查,那么健康阈值只能是 1,用户设置成其它值将被视为无效。因为只要探测成功一次,我们就能确定容器是存活的。

  • 不健康阈值:单位次。该参数指定了健康检查连续失败多少次后,才判定容器是不健康的。例如不健康阈值设置成 3,只有满足连续 3 次都探测失败了,才认为容器是不健康的。