腾讯云容器集群内核基于 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 并检查 response 的返回码。例如,
wget http://127.0.0.1:80/health-check
。如果返回码在200 - 399的范围,脚本返回0,否则返回-1。注意事项
必须将需要执行的程序放在容器的镜像中,否则会因找不到程序而执行失败。
若执行的命令是一个 shell 脚本,则不能直接指定脚本作为执行命令,需要加上脚本的解释器。例如,脚本是
/data/scripts/health_check.sh
,那么使用执行命令检查时,指定的程序应为:sh
/data/scripts/health_check.sh
操作步骤
设置步骤以通过容器服务控制台创建 Deployment 为例:
1. 登录容器服务控制台,选择左侧导航栏中的 集群。
2. 在集群管理页面,选择需创建服务的集群 ID,进入集群的基本信息页面。
3. 在工作负载 > Deployment页面,单击新建。Deployment 参数设置请参见 Deployment 管理。
4. 在新建 Deployment 页面,单击实例内容器中的显示高级设置。
5. 在容器健康检查中,以选择存活检查为例,设置以下参数。
检查方法:选择“执行命令检查”。
执行命令:输入以下内容。
sh
/data/scripts/health_check.sh
其余公共参数如下:
启动延时:单位秒。指定容器启动后,多久开始探测。例如,启动延时设置为5,那么健康检查将在容器启动5秒后开始。
间隔时间:单位秒。指定健康检查的频率。例如,间隔时间设置成10,那么集群会每隔10s检查一次。
响应超时:单位秒。指定健康探测的超时时间。对应到 TCP 端口探测、HTTP 请求探测、执行命令检查三种方式,分别表示 TCP 连接超时时间、HTTP 请求响应超时时间以及执行命令的超时时间。
健康阈值:单位次。指定健康检查连续成功多少次后,才判定容器是健康的。例如,健康阈值设置成3,则说明只有满足连续3次探测都成功,才认为容器是健康的。
注意
如果健康检查的类型为存活检查,那么健康阈值只能是1,用户设置成其它值将被视为无效。
不健康阈值:单位次。指定健康检查连续失败多少次后,才判定容器是不健康的。例如,不健康阈值设置成3,则说明只有满足连续3次都探测失败,才认为容器是不健康的。
6. 单击创建 Deployment。