更新时间:2026-03-30 GMT+08:00
分享

设置容器健康检查

操作场景

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

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

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

更多信息,请参见存活、就绪和启动探针配置存活、就绪和启动探针

设置存活探针

设置存活探针可以发现容器仍处在运行状态但无法正常响应的问题,例如死锁。

  1. 登录CCE控制台
  2. 在创建工作负载时,配置容器信息,选择“健康检查”
  3. 开启存活探针。

    图1 开启存活探针

    表1 探针参数说明

    检查方式

    检查方式介绍

    特有参数

    公共参数

    HTTP请求检查(httpGet)

    适用于提供HTTP/HTTPS服务的容器。进行该配置后,集群将周期性地对该容器的访问路径发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败, kubelet会终止这个容器并将其重启。

    • 路径:表示HTTP/HTTPS的检查路径,该路径由容器镜像决定。需要使用绝对路径,即以“/”开头。
    • 端口:容器暴露访问的健康检查端口,端口号取值范围为1~65535。
    • 主机地址:表示请求的主机地址,不填时默认为Pod实例的IP地址。
    • 协议:表示发送请求所使用的协议,需与容器提供的服务类型匹配。
    • 请求头部:发起HTTP/HTTPS请求时携带的请求头,支持键值对。
    • 检测周期(periodSeconds):表示探针的检测周期,单位为秒。

      例如,设置为30,表示每30秒检测一次。

    • 延迟时间(initialDelaySeconds):表示延迟检查时间,是预留给业务程序启动的时间,单位为秒。

      例如,设置为30,表明容器启动后30秒开始健康检查。

    • 超时时间(timeoutSeconds):表示超时时间,单位为秒。若设置为0或不设置,默认超时等待时间为1秒。

      例如,设置为10,表明执行健康检查的超时等待时间为10秒。如果超过这个时间,本次健康检查就被视为失败。

    • 成功阈值(successThreshold):表示探测失败后,容器状态转变为“健康”所需要的最小连续成功次数。该参数的默认值为1,且最小允许值为1。在存活探针和启动探针中,这个值必须为1。

      例如,设置为1时,表明健康检查失败后,仅需连续成功1次,即可将工作负载恢复为正常状态。

    • 最大失败次数(failureThreshold):表示在容器被判定为“不健康”之前,允许连续探测失败的次数。该参数默认值为 3,最小值为 1。

      对于存活探针:当连续失败次数达到该阈值后,容器将被标记为不健康,且kubelet会重启容器。

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

    TCP端口检查(tcpSocket)

    适用于提供TCP协议通信的容器(如数据库、缓存、自定义TCP服务等)。集群会周期性地与该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败,kubelet会终止这个容器并将其重启。

    端口:容器暴露访问的健康检查端口,端口号取值范围为1~65535。

    执行命令检查(exec)

    要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果退出码状态为0则检查成功,否则检查失败,kubelet会终止这个容器并将其重启。

    注意:

    在高负载环境中,建议避免使用执行命令检查方式,执行命令会消耗系统资源,如果系统资源紧张(如CPU负载高、文件系统被锁住等)可能导致健康检查超时失败。如果需要使用执行命令检查,您可以参考以下建议:

    • 增加失败次数和超时时间配置,避免因为突发性的资源竞争导致健康检查超时失败,但是该方式可能会降低业务敏感度,请合理配置。
    • 通过合理规划业务容器或者系统插件的CPU Limit配置,避免出现因CPU时间片抢占导致内核锁长期不释放影响同节点其它容器执行exec探测的问题。

    执行命令:表示在容器内执行的命令,用于判断容器的运行状态。若运行命令有多个,需分行书写。

    说明:
    • 使用该方式时,必须将程序/工具提前打包到容器镜像中。由于集群直接在容器内执行命令,因此无法访问宿主机或其他容器的文件系统。若命令依赖的程序/工具(如curl、nc、自定义脚本)未包含在镜像中,会报错“Command not found”。
    • 如果执行的命令是一个Shell脚本,需明确指定脚本解析器。由于集群执行探针时不处于交互式终端环境中,不能直接将脚本文件作为命令执行,必须通过脚本编辑器调用脚本。例如,如果脚本位于/data/scripts/health_check.sh,使用执行命令检查时,应指定的程序为sh /data/scripts/health_check.sh

    GRPC检查(grpc)

    适用于GRPC应用程序,无需暴露HTTP端口或依赖外部可执行脚本,即可通过标准GRPC接口实现容器的健康检查。

    端口:容器暴露访问的健康检查端口,端口号取值范围为1~65535。

  4. 其他参数配置完成后,单击右下角“创建工作负载”。待工作负载状态为“运行中”,则说明健康检查成功。
  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 执行以下命令,创建YAML文件health_check.yaml,用于配置工作负载,文件名称可自定义。

    vim health_check.yaml

    以HTTP请求检查为例(其余健康检查方式示例请参见配置存活、就绪和启动探针),文件内容如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
          version: v1
      template:
        metadata:
          labels:
            app: nginx
            version: v1
        spec:
          containers:
            - name: container-1
              image: nginx:latest
              livenessProbe:                 # 存活探针
                httpGet:                     # 以HTTP请求检查为例
                  path: /                    # HTTP检查路径
                  port: 80                   # 检查端口为80
                  host: ''                   # 主机地址,默认为实例
                  scheme: HTTP               # 健康检查协议
                  httpHeaders:               # 可选,请求头名称为Custom-Header,对应的值为Awesome
                  - name: Custom-Header
                    value: Awesome
                initialDelaySeconds: 3       # 延迟检查时间,是预留给业务程序启动的时间,单位为秒
                timeoutSeconds: 1            # 表示超时时间,单位为秒
                periodSeconds: 3             # 探针的检测周期,单位为秒
                successThreshold: 1          # 认定为健康检查成功所需要的最小连续成功次数
                failureThreshold: 3          # 认定为健康检查失败所需要的最小连续失败次数
          imagePullSecrets:
            - name: default-secret

  3. 执行以下命令,创建工作负载。

    kubectl create -f health_check.yaml

    回显如下,表示已经开始创建工作负载。

    deployment.apps/nginx created

  4. 执行以下命令,查看工作负载的pod状态。

    kubectl get pod

    回显如下,如果该工作负载Pod的STATUS为Running,则表示创建成功。

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-58cdd4f48d-jcsqn   1/1     Running   0          4m19s

设置就绪探针

就绪探针用于判断容器中的业务是否已就绪,Pod就绪后才会被添加到Service的服务端点,开始接收流量。

  1. 登录CCE控制台
  2. 在创建工作负载时,配置容器信息,选择“健康检查”
  3. 开启就绪探针。

    图2 开启就绪探针

    表2 探针参数说明

    检查方式

    检查方式介绍

    特有参数

    公共参数

    HTTP请求检查(httpGet)

    适用于提供HTTP/HTTPS服务的容器。进行该配置后,集群将周期性地对该容器的访问路径发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败, kubelet会终止这个容器并将其重启。

    • 路径:表示HTTP/HTTPS的检查路径,该路径由容器镜像决定。需要使用绝对路径,即以“/”开头。
    • 端口:容器暴露访问的健康检查端口,端口号取值范围为1~65535。
    • 主机地址:表示请求的主机地址,不填时默认为Pod实例的IP地址。
    • 协议:表示发送请求所使用的协议,需与容器提供的服务类型匹配。
    • 请求头部:发起HTTP/HTTPS请求时携带的请求头,支持键值对。
    • 检测周期(periodSeconds):表示探针的检测周期,单位为秒。

      例如,设置为30,表示每30秒检测一次。

    • 延迟时间(initialDelaySeconds):表示延迟检查时间,是预留给业务程序启动的时间,单位为秒。

      例如,设置为30,表明容器启动后30秒开始健康检查。

    • 超时时间(timeoutSeconds):表示超时时间,单位为秒。若设置为0或不设置,默认超时等待时间为1秒。

      例如,设置为10,表明执行健康检查的超时等待时间为10秒。如果超过这个时间,本次健康检查就被视为失败。

    • 成功阈值(successThreshold):表示探测失败后,容器状态转变为“健康”所需要的最小连续成功次数。该参数的默认值为1,且最小允许值为1。在存活探针和启动探针中,这个值必须为1。

      例如,设置为1时,表明健康检查失败后,仅需连续成功1次,即可将工作负载恢复为正常状态。

    • 最大失败次数(failureThreshold):表示在容器被判定为“不健康”之前,允许连续探测失败的次数。该参数默认值为 3,最小值为 1。

      对于存活探针:当连续失败次数达到该阈值后,容器将被标记为不健康,且kubelet会重启容器。

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

    TCP端口检查(tcpSocket)

    适用于提供TCP协议通信的容器(如数据库、缓存、自定义TCP服务等)。集群会周期性地与该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败,kubelet会终止这个容器并将其重启。

    端口:容器暴露访问的健康检查端口,端口号取值范围为1~65535。

    执行命令检查(exec)

    要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果退出码状态为0则检查成功,否则检查失败,kubelet会终止这个容器并将其重启。

    注意:

    在高负载环境中,建议避免使用执行命令检查方式,执行命令会消耗系统资源,如果系统资源紧张(如CPU负载高、文件系统被锁住等)可能导致健康检查超时失败。如果需要使用执行命令检查,您可以参考以下建议:

    • 增加失败次数和超时时间配置,避免因为突发性的资源竞争导致健康检查超时失败,但是该方式可能会降低业务敏感度,请合理配置。
    • 通过合理规划业务容器或者系统插件的CPU Limit配置,避免出现因CPU时间片抢占导致内核锁长期不释放影响同节点其它容器执行exec探测的问题。

    执行命令:表示在容器内执行的命令,用于判断容器的运行状态。若运行命令有多个,需分行书写。

    说明:
    • 使用该方式时,必须将程序/工具提前打包到容器镜像中。由于集群直接在容器内执行命令,因此无法访问宿主机或其他容器的文件系统。若命令依赖的程序/工具(如curl、nc、自定义脚本)未包含在镜像中,会报错“Command not found”。
    • 如果执行的命令是一个Shell脚本,需明确指定脚本解析器。由于集群执行探针时不处于交互式终端环境中,不能直接将脚本文件作为命令执行,必须通过脚本编辑器调用脚本。例如,如果脚本位于/data/scripts/health_check.sh,使用执行命令检查时,应指定的程序为sh /data/scripts/health_check.sh

    GRPC检查(grpc)

    适用于GRPC应用程序,无需暴露HTTP端口或依赖外部可执行脚本,即可通过标准GRPC接口实现容器的健康检查。

    端口:容器暴露访问的健康检查端口,端口号取值范围为1~65535。

  4. 其他参数配置完成后,单击右下角“创建工作负载”。待工作负载状态为“运行中”,则说明健康检查成功。
  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 执行以下命令,创建YAML文件health_check.yaml,用于配置工作负载,文件名称可自定义。

    vim health_check.yaml

    以HTTP请求检查为例(其余健康检查方式示例请参见配置存活、就绪和启动探针),文件内容如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
          version: v1
      template:
        metadata:
          labels:
            app: nginx
            version: v1
        spec:
          containers:
            - name: container-1
              image: nginx:latest
              readinessProbe:                # 就绪探针
                httpGet:                     # 以HTTP请求检查为例
                  path: /                    # HTTP检查路径
                  port: 80                   # 检查端口为80
                  host: ''                   # 主机地址,默认为实例
                  scheme: HTTP               # 健康检查协议
                  httpHeaders:               # 可选,请求头名称为Custom-Header,对应的值为Awesome
                  - name: Custom-Header
                    value: Awesome
                initialDelaySeconds: 3       # 延迟检查时间,是预留给业务程序启动的时间,单位为秒
                timeoutSeconds: 1            # 表示超时时间,单位为秒
                periodSeconds: 3             # 探针的检测周期,单位为秒
                successThreshold: 1          # 认定为健康检查成功所需要的最小连续成功次数
                failureThreshold: 3          # 认定为健康检查失败所需要的最小连续失败次数
          imagePullSecrets:
            - name: default-secret

  3. 执行以下命令,创建工作负载。

    kubectl create -f health_check.yaml

    回显如下,表示已经开始创建工作负载。

    deployment.apps/nginx created

  4. 执行以下命令,查看工作负载的pod状态。

    kubectl get pod

    回显如下,如果该工作负载Pod的STATUS为Running,则表示创建成功。

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-58cdd4f48d-jcsqn   1/1     Running   0          4m19s

设置启动探针

在容器启动时执行,检测容器是否启动成功,适用于启动时需要较长的初始化时间的应用。

  1. 登录CCE控制台
  2. 在创建工作负载时,配置容器信息,选择“健康检查”
  3. 开启启动探针。

    图3 开启启动探针

    表3 探针参数说明

    检查方式

    检查方式介绍

    特有参数

    公共参数

    HTTP请求检查(httpGet)

    适用于提供HTTP/HTTPS服务的容器。进行该配置后,集群将周期性地对该容器的访问路径发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败, kubelet会终止这个容器并将其重启。

    • 路径:表示HTTP/HTTPS的检查路径,该路径由容器镜像决定。需要使用绝对路径,即以“/”开头。
    • 端口:容器暴露访问的健康检查端口,端口号取值范围为1~65535。
    • 主机地址:表示请求的主机地址,不填时默认为Pod实例的IP地址。
    • 协议:表示发送请求所使用的协议,需与容器提供的服务类型匹配。
    • 请求头部:发起HTTP/HTTPS请求时携带的请求头,支持键值对。
    • 检测周期(periodSeconds):表示探针的检测周期,单位为秒。

      例如,设置为30,表示每30秒检测一次。

    • 延迟时间(initialDelaySeconds):表示延迟检查时间,是预留给业务程序启动的时间,单位为秒。

      例如,设置为30,表明容器启动后30秒开始健康检查。

    • 超时时间(timeoutSeconds):表示超时时间,单位为秒。若设置为0或不设置,默认超时等待时间为1秒。

      例如,设置为10,表明执行健康检查的超时等待时间为10秒。如果超过这个时间,本次健康检查就被视为失败。

    • 成功阈值(successThreshold):表示探测失败后,容器状态转变为“健康”所需要的最小连续成功次数。该参数的默认值为1,且最小允许值为1。在存活探针和启动探针中,这个值必须为1。

      例如,设置为1时,表明健康检查失败后,仅需连续成功1次,即可将工作负载恢复为正常状态。

    • 最大失败次数(failureThreshold):表示在容器被判定为“不健康”之前,允许连续探测失败的次数。该参数默认值为 3,最小值为 1。

      对于存活探针:当连续失败次数达到该阈值后,容器将被标记为不健康,且kubelet会重启容器。

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

    TCP端口检查(tcpSocket)

    适用于提供TCP协议通信的容器(如数据库、缓存、自定义TCP服务等)。集群会周期性地与该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败,kubelet会终止这个容器并将其重启。

    端口:容器暴露访问的健康检查端口,端口号取值范围为1~65535。

    执行命令检查(exec)

    要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果退出码状态为0则检查成功,否则检查失败,kubelet会终止这个容器并将其重启。

    注意:

    在高负载环境中,建议避免使用执行命令检查方式,执行命令会消耗系统资源,如果系统资源紧张(如CPU负载高、文件系统被锁住等)可能导致健康检查超时失败。如果需要使用执行命令检查,您可以参考以下建议:

    • 增加失败次数和超时时间配置,避免因为突发性的资源竞争导致健康检查超时失败,但是该方式可能会降低业务敏感度,请合理配置。
    • 通过合理规划业务容器或者系统插件的CPU Limit配置,避免出现因CPU时间片抢占导致内核锁长期不释放影响同节点其它容器执行exec探测的问题。

    执行命令:表示在容器内执行的命令,用于判断容器的运行状态。若运行命令有多个,需分行书写。

    说明:
    • 使用该方式时,必须将程序/工具提前打包到容器镜像中。由于集群直接在容器内执行命令,因此无法访问宿主机或其他容器的文件系统。若命令依赖的程序/工具(如curl、nc、自定义脚本)未包含在镜像中,会报错“Command not found”。
    • 如果执行的命令是一个Shell脚本,需明确指定脚本解析器。由于集群执行探针时不处于交互式终端环境中,不能直接将脚本文件作为命令执行,必须通过脚本编辑器调用脚本。例如,如果脚本位于/data/scripts/health_check.sh,使用执行命令检查时,应指定的程序为sh /data/scripts/health_check.sh

    GRPC检查(grpc)

    适用于GRPC应用程序,无需暴露HTTP端口或依赖外部可执行脚本,即可通过标准GRPC接口实现容器的健康检查。

    端口:容器暴露访问的健康检查端口,端口号取值范围为1~65535。

  4. 其他参数配置完成后,单击右下角“创建工作负载”。待工作负载状态为“运行中”,则说明健康检查成功。
  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 执行以下命令,创建YAML文件health_check.yaml,用于配置工作负载,文件名称可自定义。

    vim health_check.yaml

    以HTTP请求检查为例(其余健康检查方式示例请参见配置存活、就绪和启动探针),文件内容如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
          version: v1
      template:
        metadata:
          labels:
            app: nginx
            version: v1
        spec:
          containers:
            - name: container-1
              image: nginx:latest
              startupProbe:                  # 启动探针
                httpGet:                     # 以HTTP请求检查为例
                  path: /                    # HTTP检查路径
                  port: 80                   # 检查端口为80
                  host: ''                   # 主机地址,默认为实例
                  scheme: HTTP               # 健康检查协议
                  httpHeaders:               # 可选,请求头名称为Custom-Header,对应的值为Awesome
                  - name: Custom-Header
                    value: Awesome
                initialDelaySeconds: 3       # 延迟检查时间,是预留给业务程序启动的时间,单位为秒
                timeoutSeconds: 1            # 表示超时时间,单位为秒
                periodSeconds: 3             # 探针的检测周期,单位为秒
                successThreshold: 1          # 认定为健康检查成功所需要的最小连续成功次数
                failureThreshold: 3          # 认定为健康检查失败所需要的最小连续失败次数
          imagePullSecrets:
            - name: default-secret

  3. 执行以下命令,创建工作负载。

    kubectl create -f health_check.yaml

    回显如下,表示已经开始创建工作负载。

    deployment.apps/nginx created

  4. 执行以下命令,查看工作负载的pod状态。

    kubectl get pod

    回显如下,如果该工作负载Pod的STATUS为Running,则表示创建成功。

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-58cdd4f48d-jcsqn   1/1     Running   0          4m19s

相关文档

相关文档