更新时间:2025-08-11 GMT+08:00
分享

设置容器健康检查

操作场景

健康检查是指容器运行过程中,根据用户需要,定时检查容器健康状况。若未配置健康检查机制,当容器内的应用程序发生异常时,Pod无法感知该异常,也不会自动执行重启操作进行恢复。这样可能导致Pod状态显示为“运行中”,但实际上容器内的应用已处于不可用或异常状态。

Kubernetes提供了三种健康检查探针,监测容器中应用的运行状态,以确保系统的稳定性和高可用性,具体如下:

  • 存活探针livenessProbe):用于检测容器是否正常,类似于执行ps命令检查进程是否存在。如果容器的存活检查失败,集群会对该容器执行重启操作,否则不执行任何操作。
  • 就绪探针readinessProbe):用于判断容器中的业务是否已就绪,以决定是否将流量转发至当前实例。在某些场景中,应用程序虽然进程已启动,但由于需要加载大量磁盘数据或依赖外部服务的初始化,尚未具备对外提供服务的能力。此时,通过就绪检查可以避免将流量路由至尚未就绪的实例。如果容器的就绪检查失败,CCE集群会临时将其从服务端点中移除,屏蔽外部请求的访问。而一旦检查通过,容器即被视为就绪,可正常接收流量。
  • 启动探针startupProbe:用于检测容器内的应用是否已启动。 启动探针检测通过后,集群才会开始执行存活检查和就绪检查, 从而确保这些检查不会影响应用程序的启动。该探针适用于启动时间较长的容器,能够有效避免容器在初始化尚未完成时被误判为异常,从而被提前终止。

更多信息,请参见Liveness, Readiness, and Startup ProbesConfigure Liveness, Readiness and Startup Probes

设置容器健康检查

  1. 登录CCE控制台
  2. 在创建工作负载时,配置容器信息,选择“健康检查”
  3. 请根据实际需求选择并配置合适的探针。三种探针(存活探针、就绪探针和启动探针)所涉及的参数基本一致,本文以存活探针为例进行说明,其他探针的参数含义相同

    图1 设置健康检查

    表1 探针参数说明

    参数

    说明

    检查方式

    针对不同的业务场景,提供了多种检查方式,您可以根据需求进行选择。每种检查方式的特有参数的详细说明请参见对应链接,检测周期、延迟时间等公共参数请参见公共参数说明

    • HTTP请求检查:适用于提供HTTP/HTTPS服务的容器。进行该配置后,集群将周期性地对该容器发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败。使用该方式时,必须指定容器监听的端口。
    • TCP端口检查:适用于提供TCP协议通信的容器(如数据库、缓存、自定义TCP服务等)。集群会周期性地与该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败。使用该方式时,必须指定容器监听的端口。
    • 执行命令检查:要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果命令的返回结果是0则检查成功,否则检查失败。
    • GRPC检查:适用于GRPC应用程序,无需暴露HTTP端口或依赖外部可执行脚本,即可通过标准GRPC接口实现容器的健康检查。

  4. 其他参数配置完成后,单击右下角“创建工作负载”。待工作负载状态为“运行中”,则说明启动命令执行成功。

特有参数说明

  • HTTP请求检查

    HTTP请求检查适用于提供HTTP/HTTPS服务的容器。集群会周期性地向容器发起HTTP/HTTPS GET请求,并根据返回的HTTP状态码判断探测结果,具体如下:

    • 探测成功:返回码为200~399。
    • 探测失败:返回其他值。

    HTTP请求检查的特有参数说明如下,表2中示例表明,集群会周期性地对容器发起请求“GET http://172.16.0.186:80/health-check”,以探测容器的健康状态。

    图2 HTTP请求检查特有参数

    表2 HTTP请求检查特有参数

    参数

    示例

    说明

    路径

    /health-check

    表示HTTP/HTTPS的检查路径。需要使用绝对路径,即以“/”开头。

    端口

    80

    必填项,表示容器监听端口,用于定位Pod的容器。

    主机地址

    172.16.0.186

    表示请求的主机地址,不填时默认为Pod实例的IP地址。

    协议

    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的容器。

公共参数说明

表6 公共参数说明

参数

参数说明

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。

  • 对于存活探针:当连续失败次数达到该阈值后,容器将被标记为不健康,且kubelet会重启容器。
  • 对于就绪探针:当连续失败次数达到阈值后,Pod会被标记为未就绪,并从Service的Endpoints 中移除,停止接收新流量,且容器不会被重启。

YAML示例

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 执行以下命令,创建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

  3. 执行以下命令,创建Pod。

    kubectl create -f health_check.yaml

    回显如下,表示已经开始创建Pod。

    pod/liveness-http created

  4. 执行以下命令,查看Pod状态。

    kubectl get deployment

    回显如下,如果Pod的STATUS为Running,则表示创建成功。

    NAME               READY      STATUS       RESTARTS    AGE
    liveness-http      1/1        Running      1           4m59s

相关文档

相关文档