设置容器健康检查
操作场景
健康检查是指容器运行过程中,根据用户需要,定时检查容器健康状况。若未配置健康检查机制,当容器内的应用程序发生异常时,Pod无法感知该异常,也不会自动执行重启操作进行恢复。这样可能导致Pod状态显示为“运行中”,但实际上容器内的应用已处于不可用或异常状态。
Kubernetes提供了三种健康检查探针,监测容器中应用的运行状态,以确保系统的稳定性和高可用性,具体如下:
- 存活探针(livenessProbe):用于检测容器是否正常,类似于执行ps命令检查进程是否存在。如果容器的存活检查失败,集群会对该容器执行重启操作,否则不执行任何操作。
- 就绪探针(readinessProbe):用于判断容器中的业务是否已就绪,以决定是否将流量转发至当前实例。在某些场景中,应用程序虽然进程已启动,但由于需要加载大量磁盘数据或依赖外部服务的初始化,尚未具备对外提供服务的能力。此时,通过就绪检查可以避免将流量路由至尚未就绪的实例。如果容器的就绪检查失败,CCE集群会临时将其从服务端点中移除,屏蔽外部请求的访问。而一旦检查通过,容器即被视为就绪,可正常接收流量。
- 启动探针(startupProbe):用于检测容器内的应用是否已启动。 启动探针检测通过后,集群才会开始执行存活检查和就绪检查, 从而确保这些检查不会影响应用程序的启动。该探针适用于启动时间较长的容器,能够有效避免容器在初始化尚未完成时被误判为异常,从而被提前终止。
更多信息,请参见Liveness, Readiness, and Startup Probes和Configure Liveness, Readiness and Startup Probes。
设置容器健康检查
- 登录CCE控制台。
- 在创建工作负载时,配置容器信息,选择“健康检查”。
- 请根据实际需求选择并配置合适的探针。三种探针(存活探针、就绪探针和启动探针)所涉及的参数基本一致,本文以存活探针为例进行说明,其他探针的参数含义相同。
图1 设置健康检查
表1 探针参数说明 参数
说明
检查方式
针对不同的业务场景,提供了多种检查方式,您可以根据需求进行选择。每种检查方式的特有参数的详细说明请参见对应链接,检测周期、延迟时间等公共参数请参见公共参数说明。
- HTTP请求检查:适用于提供HTTP/HTTPS服务的容器。进行该配置后,集群将周期性地对该容器发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败。使用该方式时,必须指定容器监听的端口。
- TCP端口检查:适用于提供TCP协议通信的容器(如数据库、缓存、自定义TCP服务等)。集群会周期性地与该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败。使用该方式时,必须指定容器监听的端口。
- 执行命令检查:要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果命令的返回结果是0则检查成功,否则检查失败。
- GRPC检查:适用于GRPC应用程序,无需暴露HTTP端口或依赖外部可执行脚本,即可通过标准GRPC接口实现容器的健康检查。
- 其他参数配置完成后,单击右下角“创建工作负载”。待工作负载状态为“运行中”,则说明启动命令执行成功。
特有参数说明
- HTTP请求检查
HTTP请求检查适用于提供HTTP/HTTPS服务的容器。集群会周期性地向容器发起HTTP/HTTPS GET请求,并根据返回的HTTP状态码判断探测结果,具体如下:
- 探测成功:返回码为200~399。
- 探测失败:返回其他值。
HTTP请求检查的特有参数说明如下,表2中示例表明,集群会周期性地对容器发起请求“GET http://172.16.0.186:80/health-check”,以探测容器的健康状态。
图2 HTTP请求检查特有参数 - TCP端口检查
TCP端口检查适用于提供TCP协议通信的容器(如数据库、缓存、自定义TCP服务等)。集群会周期性尝试与容器建立TCP连接,通过连接是否成功来判断容器的健康状态。如果连接成功,则证明探测成功,否则探测失败。选择该检查方式时,必须指定容器监听的端口。
TCP端口检查的特有参数说明如下,假设一个nginx容器监听端口为80,若为其配置了TCP探针,并指定探测端口为80,则集群将周期性地尝试通过TCP与该端口建立连接。连接成功则表示探测通过,连接失败则视为探测失败。
图3 TCP端口检查特有参数表3 TCP端口检查特有参数 参数
示例
说明
端口
80
必填项,表示容器监听端口,用于定位Pod的容器。
- 执行命令检查
执行命令检查是一种灵活的健康检查方式,允许用户指定容器内的命令。集群会周期性地在容器内执行该命令,以判断容器的运行状态。若命令的返回结果为0,则判定为检查成功,否则视为失败。
对于TCP端口检查和HTTP请求检查,也可以通过指定执行命令的方式实现类似效果,例如表4中的示例可以实现HTTP请求检查的效果。
图4 执行命令检查特有参数表4 执行命令检查特有参数 参数
示例
说明
执行命令
/bin/sh
-c
curl -sf http://172.16.0.186:80/health-check || exit 1
表示在容器内执行的命令,用于判断容器的运行状态。
说明:- 使用该方式时,必须将程序/工具提前打包到容器镜像中。由于集群直接在容器内执行命令,因此无法访问宿主机或其他容器的文件系统。若命令依赖的程序/工具(如curl、nc、自定义脚本)未包含在镜像中,会报错“Command not found”。
- 如果执行的命令是一个Shell脚本,需明确指定脚本解析器。由于集群执行探针时不处于交互式终端环境中,不能直接将脚本文件作为命令执行,必须通过脚本编辑器调用脚本。例如,如果脚本位于/data/scripts/health_check.sh,使用执行命令检查时,应指定的程序为sh /data/scripts/health_check.sh。
- GRPC检查
GRPC检查适用于GRPC应用程序,无需暴露HTTP端口或依赖外部可执行脚本,即可通过标准GRPC接口实现容器的健康检查。使用GRPC检查时需满足以下条件:
- GRPC检查仅在CCE v1.25及以上版本集群中支持。
- 使用GRPC检查时,您的应用需支持GRPC健康检查协议。
- 与HTTP请求检查和TCP端口检查类似,如果配置错误,都会被认作是探测失败,例如错误的端口、应用未实现健康检查协议等。
图5 GRPC检查特有参数表5 GRPC检查特有参数 参数
示例
说明
端口
80
必填项,表示容器监听端口,用于定位Pod的容器。
公共参数说明
参数 |
参数说明 |
YAML示例 |
---|---|---|
检测周期(periodSeconds) |
表示探针的检测周期,单位为秒。 例如,设置为30,表示每30秒检测一次。 |
以存活探针的TCP端口检查为例,其他检查方式的配置方法类似。 ... livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 0 timeoutSeconds: 1 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 ... |
延迟时间(initialDelaySeconds) |
表示延迟检查时间,是预留给业务程序启动的时间,单位为秒。 例如,设置为30,表明容器启动后30秒开始健康检查。 |
|
超时时间(timeoutSeconds) |
表示超时时间,单位为秒。若设置为0或不设置,默认超时等待时间为1秒。 例如,设置为10,表明执行健康检查的超时等待时间为10秒。如果超过这个时间,本次健康检查就被视为失败。 |
|
成功阈值(successThreshold) |
表示探测失败后,容器状态转变为“健康”所需要的最小连续成功次数。该参数的默认值为1,且最小允许值为1。在存活探针和启动探针中,这个值必须为1。 例如,设置为1时,表明健康检查失败后,仅需连续成功1次,即可将工作负载恢复为正常状态。 |
|
最大失败次数(failureThreshold) |
表示在容器被判定为“不健康”之前,允许连续探测失败的次数。该参数默认值为 3,最小值为 1。
|
YAML示例
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 执行以下命令,创建YAML文件health_check.yaml,用于配置Pod,文件名称可自定义。
vim health_check.yaml
文件内容如下:
apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-http spec: containers: - name: liveness image: <image_address> args: - /server livenessProbe: # 存活探针 httpGet: # 以HTTP请求检查为例 path: /healthz # HTTP检查路径为/healthz port: 80 # 检查端口为80 httpHeaders: # 可选,请求头名称为Custom-Header,对应的值为Awesome - name: Custom-Header value: Awesome initialDelaySeconds: 3 periodSeconds: 3 readinessProbe: # 就绪探针 exec: # 以执行命令检查为例 command: # 需要执行的命令 - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5 startupProbe: # 启动探针 httpGet: # 以HTTP请求检查为例 path: /healthz # HTTP检查路径为/healthz port: 80 # 检查端口为80 failureThreshold: 30 periodSeconds: 10
- 执行以下命令,创建Pod。
kubectl create -f health_check.yaml
回显如下,表示已经开始创建Pod。
pod/liveness-http created
- 执行以下命令,查看Pod状态。
kubectl get deployment
回显如下,如果Pod的STATUS为Running,则表示创建成功。
NAME READY STATUS RESTARTS AGE liveness-http 1/1 Running 1 4m59s
相关文档
- 创建工作负载:了解工作负载的更多参数。
- 管理工作负载:工作负载创建后,您可以对其执行升级、编辑YAML、查看日志等操作。
- 如果工作负载创建失败,请参考工作负载异常问题排查进行处理。