# 设置容器健康检查
#### 操作场景
健康检查是指容器运行过程中，根据用户需要，定时检查容器健康状况。若未配置健康检查机制，当容器内的应用程序发生异常时，Pod无法感知该异常，也不会自动执行重启操作进行恢复。这样可能导致Pod状态显示为"运行中"，但实际上容器内的应用已处于不可用或异常状态。
Kubernetes提供了三种健康检查探针，监测容器中应用的运行状态，以确保系统的稳定性和高可用性，具体如下：
- **存活探针** **（livenessProbe）：**用于检测容器是否正常，类似于执行ps命令检查进程是否存在。如果容器的存活检查失败，集群会对该容器执行重启操作，否则不执行任何操作。
- **就绪探针** **（readinessProbe）：**用于判断容器中的业务是否已就绪，以决定是否将流量转发至当前实例。在某些场景中，应用程序虽然进程已启动，但由于需要加载大量磁盘数据或依赖外部服务的初始化，尚未具备对外提供服务的能力。此时，通过就绪检查可以避免将流量路由至尚未就绪的实例。如果容器的就绪检查失败，CCE集群会临时将其从服务端点中移除，屏蔽外部请求的访问。而一旦检查通过，容器即被视为就绪，可正常接收流量。
- **启动探针** **（startupProbe）**：用于检测容器内的应用是否已启动。 启动探针检测通过后，集群才会开始执行存活检查和就绪检查， 从而确保这些检查不会影响应用程序的启动。该探针适用于启动时间较长的容器，能够有效避免容器在初始化尚未完成时被误判为异常，从而被提前终止。
更多信息，请参见[存活、就绪和启动探针](https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/probes/)和[配置存活、就绪和启动探针](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)。
#### 设置存活探针
设置存活探针可以发现容器仍处在运行状态但无法正常响应的问题，例如死锁。
- [控制台配置存活探针]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 在创建工作负载时，配置容器信息，选择"健康检查"。
  
  3. 开启存活探针。 
     图1开启存活探针   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002331989077.png "点击放大")
     
     表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。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | - **检测周期** （periodSeconds）：表示探针的检测周期，单位为秒。 例如，设置为30，表示每30秒检测一次。   - **延迟时间** （initialDelaySeconds）：表示延迟检查时间，是预留给业务程序启动的时间，单位为秒。 例如，设置为30，表明容器启动后30秒开始健康检查。   - **超时时间** （timeoutSeconds）：表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。   - **成功阈值** （successThreshold）：表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。在存活探针和启动探针中，这个值必须为1。 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。   - **最大失败次数** （failureThreshold）：表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints中移除，停止接收新流量，且容器不会被重启。    |
     | **执行命令检查（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**。                 | - **检测周期** （periodSeconds）：表示探针的检测周期，单位为秒。 例如，设置为30，表示每30秒检测一次。   - **延迟时间** （initialDelaySeconds）：表示延迟检查时间，是预留给业务程序启动的时间，单位为秒。 例如，设置为30，表明容器启动后30秒开始健康检查。   - **超时时间** （timeoutSeconds）：表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。   - **成功阈值** （successThreshold）：表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。在存活探针和启动探针中，这个值必须为1。 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。   - **最大失败次数** （failureThreshold）：表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints中移除，停止接收新流量，且容器不会被重启。    |
     | **GRPC检查（grpc）**              | 适用于GRPC应用程序，无需暴露HTTP端口或依赖外部可执行脚本，即可通过标准GRPC接口实现容器的健康检查。                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | **端口**：容器暴露访问的健康检查端口，端口号取值范围为1\~65535。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | - **检测周期** （periodSeconds）：表示探针的检测周期，单位为秒。 例如，设置为30，表示每30秒检测一次。   - **延迟时间** （initialDelaySeconds）：表示延迟检查时间，是预留给业务程序启动的时间，单位为秒。 例如，设置为30，表明容器启动后30秒开始健康检查。   - **超时时间** （timeoutSeconds）：表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。   - **成功阈值** （successThreshold）：表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。在存活探针和启动探针中，这个值必须为1。 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。   - **最大失败次数** （failureThreshold）：表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints中移除，停止接收新流量，且容器不会被重启。    |
        
     
     
  
  4. 其他参数配置完成后，单击右下角"创建工作负载"。待工作负载状态为"运行中"，则说明健康检查成功。
   
- [YAML配置存活探针]
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
  
  2. 执行以下命令，创建YAML文件health_check.yaml，用于配置工作负载，文件名称可自定义。 
     ```
     vim health_check.yaml
     ```
     以HTTP请求检查为例（其余健康检查方式示例请参见[配置存活、就绪和启动探针](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)），文件内容如下：
     ```
     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控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 在创建工作负载时，配置容器信息，选择"健康检查"。
  
  3. 开启就绪探针。 
     图2开启就绪探针   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002563130935.png "点击放大")
     
     表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。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | - **检测周期** （periodSeconds）：表示探针的检测周期，单位为秒。 例如，设置为30，表示每30秒检测一次。   - **延迟时间** （initialDelaySeconds）：表示延迟检查时间，是预留给业务程序启动的时间，单位为秒。 例如，设置为30，表明容器启动后30秒开始健康检查。   - **超时时间** （timeoutSeconds）：表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。   - **成功阈值** （successThreshold）：表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。在存活探针和启动探针中，这个值必须为1。 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。   - **最大失败次数** （failureThreshold）：表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints中移除，停止接收新流量，且容器不会被重启。    |
     | **执行命令检查（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**。                                                                             | - **检测周期** （periodSeconds）：表示探针的检测周期，单位为秒。 例如，设置为30，表示每30秒检测一次。   - **延迟时间** （initialDelaySeconds）：表示延迟检查时间，是预留给业务程序启动的时间，单位为秒。 例如，设置为30，表明容器启动后30秒开始健康检查。   - **超时时间** （timeoutSeconds）：表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。   - **成功阈值** （successThreshold）：表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。在存活探针和启动探针中，这个值必须为1。 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。   - **最大失败次数** （failureThreshold）：表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints中移除，停止接收新流量，且容器不会被重启。    |
     | **GRPC检查（grpc）**              | 适用于GRPC应用程序，无需暴露HTTP端口或依赖外部可执行脚本，即可通过标准GRPC接口实现容器的健康检查。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | **端口**：容器暴露访问的健康检查端口，端口号取值范围为1\~65535。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | - **检测周期** （periodSeconds）：表示探针的检测周期，单位为秒。 例如，设置为30，表示每30秒检测一次。   - **延迟时间** （initialDelaySeconds）：表示延迟检查时间，是预留给业务程序启动的时间，单位为秒。 例如，设置为30，表明容器启动后30秒开始健康检查。   - **超时时间** （timeoutSeconds）：表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。   - **成功阈值** （successThreshold）：表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。在存活探针和启动探针中，这个值必须为1。 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。   - **最大失败次数** （failureThreshold）：表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints中移除，停止接收新流量，且容器不会被重启。    |
        
     
     
  
  4. 其他参数配置完成后，单击右下角"创建工作负载"。待工作负载状态为"运行中"，则说明健康检查成功。
   
- [YAML配置就绪探针]
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
  
  2. 执行以下命令，创建YAML文件health_check.yaml，用于配置工作负载，文件名称可自定义。 
     ```
     vim health_check.yaml
     ```
     以HTTP请求检查为例（其余健康检查方式示例请参见[配置存活、就绪和启动探针](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)），文件内容如下：
     ```
     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控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 在创建工作负载时，配置容器信息，选择"健康检查"。
  
  3. 开启"启动探针"。 
     图3开启"启动探针"   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002532251514.png "点击放大")
     
     表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。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | - **检测周期** （periodSeconds）：表示探针的检测周期，单位为秒。 例如，设置为30，表示每30秒检测一次。   - **延迟时间** （initialDelaySeconds）：表示延迟检查时间，是预留给业务程序启动的时间，单位为秒。 例如，设置为30，表明容器启动后30秒开始健康检查。   - **超时时间** （timeoutSeconds）：表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。   - **成功阈值** （successThreshold）：表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。在存活探针和启动探针中，这个值必须为1。 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。   - **最大失败次数** （failureThreshold）：表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints中移除，停止接收新流量，且容器不会被重启。    |
     | **执行命令检查（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**。                                                                                       | - **检测周期** （periodSeconds）：表示探针的检测周期，单位为秒。 例如，设置为30，表示每30秒检测一次。   - **延迟时间** （initialDelaySeconds）：表示延迟检查时间，是预留给业务程序启动的时间，单位为秒。 例如，设置为30，表明容器启动后30秒开始健康检查。   - **超时时间** （timeoutSeconds）：表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。   - **成功阈值** （successThreshold）：表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。在存活探针和启动探针中，这个值必须为1。 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。   - **最大失败次数** （failureThreshold）：表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints中移除，停止接收新流量，且容器不会被重启。    |
     | **GRPC检查（grpc）**              | 适用于GRPC应用程序，无需暴露HTTP端口或依赖外部可执行脚本，即可通过标准GRPC接口实现容器的健康检查。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | **端口**：容器暴露访问的健康检查端口，端口号取值范围为1\~65535。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | - **检测周期** （periodSeconds）：表示探针的检测周期，单位为秒。 例如，设置为30，表示每30秒检测一次。   - **延迟时间** （initialDelaySeconds）：表示延迟检查时间，是预留给业务程序启动的时间，单位为秒。 例如，设置为30，表明容器启动后30秒开始健康检查。   - **超时时间** （timeoutSeconds）：表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。   - **成功阈值** （successThreshold）：表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。在存活探针和启动探针中，这个值必须为1。 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。   - **最大失败次数** （failureThreshold）：表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints中移除，停止接收新流量，且容器不会被重启。    |
        
     
     
  
  4. 其他参数配置完成后，单击右下角"创建工作负载"。待工作负载状态为"运行中"，则说明健康检查成功。
   
- [YAML配置启动探针]
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
  
  2. 执行以下命令，创建YAML文件health_check.yaml，用于配置工作负载，文件名称可自定义。 
     ```
     vim health_check.yaml
     ```
     以HTTP请求检查为例（其余健康检查方式示例请参见[配置存活、就绪和启动探针](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)），文件内容如下：
     ```
     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
     ```
     
     
   
#### 相关文档
- [创建工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0673.html)：了解工作负载的更多参数。
- [管理工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0007.html)：工作负载创建后，您可以对其执行升级、编辑YAML、查看日志等操作。
- 如果工作负载创建失败，请参考[工作负载异常问题排查](https://support.huaweicloud.com/cce_faq/cce_faq_00029.html)进行处理。
 
