# 设置容器健康检查
#### 操作场景
健康检查是指容器运行过程中，根据用户需要，定时检查容器健康状况。若不配置健康检查，如果容器内应用程序异常，Pod将无法感知，也不会自动重启去恢复。最终导致虽然Pod状态显示正常，但Pod中的应用程序异常的情况。
Kubernetes提供了三种健康检查的探针：
- **存活探针** **：**livenessProbe，用于检测容器是否正常，类似于执行ps命令检查进程是否存在。如果容器的存活检查失败，集群会对该容器执行重启操作；若容器的存活检查成功则不执行任何操作。
- **就绪探针** **：**readinessProbe，用于检查用户业务是否就绪，如果未就绪，则不转发流量到当前实例。一些程序的启动时间可能很长，比如要加载磁盘数据或者要依赖外部的某个模块启动完成才能提供服务。这时候程序进程在，但是并不能对外提供服务。这种场景下该检查方式就非常有用。如果容器的就绪检查失败，集群会屏蔽请求访问该容器；若检查成功，则会开放对该容器的访问。
- **启动探针**：startupProbe，用于探测应用程序容器什么时候启动了。 如果配置了这类探测器，就可以控制容器在启动成功后再进行存活性和就绪检查， 确保这些存活、就绪探针不会影响应用程序的启动。 这可以用于对启动慢的容器进行存活性检测，避免它们在启动运行之前就被终止。
 
#### 设置容器健康检查
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 在创建工作负载时，配置容器信息，选择"健康检查"。
3. 请根据实际需求选择并配置合适的探针。三种探针（存活探针、就绪探针和启动探针）所涉及的参数基本一致，**本文以存活探针为例进行说明，其他探针的参数含义相同** 。
   
   图1设置健康检查   
   ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002532595371.png "点击放大")
   
   表1探针参数说明 
   | 参数 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|
   | 检查方式 | 针对不同的业务场景，提供了多种检查方式，您可以根据需求进行选择。每种检查方式的特有参数的详细说明请参见对应链接，**检测周期、延迟时间等公共参数请参见[表6]。** - **[HTTP请求检查]（httpGet）**：适用于提供HTTP/HTTPS服务的容器。进行该配置后，集群将周期性地对该容器发起HTTP/HTTPS GET请求，如果HTTP/HTTPS response返回码属于200\~399范围，则证明探测成功，否则探测失败。使用该方式时，必须指定容器监听的端口。  - **[TCP端口检查]** **（tcpSocket）**：适用于提供TCP协议通信的容器（如数据库、缓存、自定义TCP服务等）。集群会周期性地与该容器建立TCP连接，如果连接成功，则证明探测成功，否则探测失败。使用该方式时，必须指定容器监听的端口。  - **[执行命令检查]（exec）** ：要求用户指定一个容器内的可执行命令，集群会周期性地在容器内执行该命令，如果退出码状态为0则检查成功，否则检查失败。 注意： 在高负载环境中，建议避免使用执行命令检查方式，执行命令会消耗系统资源，如果系统资源紧张（如CPU负载高、文件系统被锁住等）可能导致健康检查超时失败。如果需要使用执行命令检查，您可以参考以下建议： - 增加失败次数和超时时间配置，避免因为突发性的资源竞争导致健康检查超时失败，但是该方式可能会降低业务敏感度，请合理配置。  - 通过合理规划业务容器或者系统插件的CPU Limit配置，避免出现因CPU时间片抢占导致内核锁长期不释放影响同节点其它容器执行exec探测的问题。     - **[GRPC检查]（grpc）**：适用于GRPC应用程序，无需暴露HTTP端口或依赖外部可执行脚本，即可通过标准GRPC接口实现容器的健康检查。   |
      
   
   
4. 其他参数配置完成后，单击右下角"创建工作负载"。待工作负载状态为"运行中"，则说明启动命令执行成功。
 
#### 特有参数说明
- **HTTP请求检查** **（httpGet）**
  HTTP请求检查适用于提供HTTP/HTTPS服务的容器。集群会周期性地向容器发起HTTP/HTTPS GET请求，并根据返回的HTTP状态码判断探测结果，具体如下：
  - 探测成功：返回码为200\~399。
  
  - 探测失败：返回其他值。
  
  
  HTTP请求检查的特有参数说明如下，[表2]中示例表明，集群会周期性地对容器发起请求"GET http://172.16.0.186:80/health-check"，以探测容器的健康状态。
  图2HTTP请求检查   
  ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002343548101.png "点击放大")
  
   表2HTTP请求检查特有参数 
  | 参数   | 示例              | 说明                                   |
  |:---|:---|:---|
  | 路径   | /health-check | 表示HTTP/HTTPS的检查路径。需要使用绝对路径，即以"/"开头。 |
  | 端口  | 80              | 必填项，表示容器监听端口，用于定位Pod的容器。               |
  | 主机地址 | 172.16.0.186  | 表示请求的主机地址，不填时默认为Pod实例的IP地址。         |
  | 协议    | HTTP           | 表示发送请求所使用的协议，需与容器提供的服务类型匹配。          |
     
  
- **TCP 端口检查** **（tcpSocket）**
  TCP端口检查适用于提供TCP协议通信的容器（如数据库、缓存、自定义TCP服务等）。集群会周期性尝试与容器建立TCP连接，通过连接是否成功来判断容器的健康状态。如果连接成功，则证明探测成功，否则探测失败。选择该检查方式时，必须指定容器监听的端口。
  TCP端口检查的特有参数说明如下，假设一个nginx容器监听端口为80，若为其配置了TCP探针，并指定探测端口为80，则集群将周期性地尝试通过TCP与该端口建立连接。连接成功则表示探测通过，连接失败则视为探测失败。
  图3TCP 端口检查   
  ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002309550366.png "点击放大")
  
  表3TCP端口检查特有参数 
  | 参数     | 示例 | 说明                       |
  |:---|:---|:---|
  | 端口 | 80   | 必填项，表示容器监听端口，用于定位Pod的容器。 |
     
  
- **执行命令检查** **（exec）**
  执行命令检查是一种灵活的健康检查方式，允许用户指定容器内的命令。集群会周期性地在容器内执行该命令，以判断容器的运行状态。若退出码状态为0，则判定为检查成功，否则视为失败。
  对于TCP端口检查和HTTP请求检查，也可以通过指定执行命令的方式实现类似效果，例如[表4]中的示例可以实现HTTP请求检查的效果。
  ![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/caution_3.0-zh-cn.png)
  在高负载环境中，建议避免使用执行命令检查方式，执行命令会消耗系统资源，如果系统资源紧张（如CPU负载高、文件系统被锁住等）可能导致健康检查超时失败。如果需要使用执行命令检查，您可以参考以下建议：
  - 增加失败次数和超时时间配置，避免因为突发性的资源竞争导致健康检查超时失败，但是该方式可能会降低业务敏感度，请合理配置。
  
  - 通过合理规划业务容器或者系统插件的CPU Limit配置，避免出现因CPU时间片抢占导致内核锁长期不释放影响同节点其它容器执行exec探测的问题。
   
  图4执行命令检查   
  ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002500833666.png "点击放大")
   表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检查适用于GRPC应用程序，无需暴露HTTP端口或依赖外部可执行脚本，即可通过标准GRPC接口实现容器的健康检查。使用GRPC检查时需满足以下条件：
  - GRPC检查仅在CCE v1.25及以上版本集群中支持。
  
  - 使用GRPC检查时，您的应用需支持[GRPC健康检查协议](https://github.com/grpc/grpc/blob/master/doc/health-checking.md)。
  
  - 与HTTP请求检查和TCP端口检查类似，如果配置错误，都会被认作是探测失败，例如错误的端口、应用未实现健康检查协议等。
  
  
  图5**GRPC检查**   
  ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002343555845.png "点击放大")
  
  表5GRPC检查特有参数 
  | 参数    | 示例  | 说明                     |
  |:---|:---|:---|
  | 端口 | 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秒开始健康检查。                                                                                                                                                                                                                                                     | 以存活探针的TCP端口检查为例，其他检查方式的配置方法类似。 ``` ... livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 0 timeoutSeconds: 1 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 ... ``` |
| 超时时间（timeoutSeconds）     | 表示超时时间，单位为秒。若设置为0或不设置，默认超时等待时间为1秒。 例如，设置为10，表明执行健康检查的超时等待时间为10秒。如果超过这个时间，本次健康检查就被视为失败。                                                                                                                                                                                                                    | 以存活探针的TCP端口检查为例，其他检查方式的配置方法类似。 ``` ... livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 0 timeoutSeconds: 1 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 ... ``` |
| 成功阈值（successThreshold）   | 表示探测失败后，容器状态转变为"健康"所需要的最小连续成功次数。该参数的默认值为1，且最小允许值为1。**在存活探针和启动探针中，这个值必须为1。** 例如，设置为1时，表明健康检查失败后，仅需连续成功1次，即可将工作负载恢复为正常状态。                                                                                                                                                                                   | 以存活探针的TCP端口检查为例，其他检查方式的配置方法类似。 ``` ... livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 0 timeoutSeconds: 1 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 ... ``` |
| 最大失败次数（failureThreshold） | 表示在容器被判定为"不健康"之前，允许连续探测失败的次数。该参数默认值为 3，最小值为 1。 - 对于存活探针：当连续失败次数达到该阈值后，容器将被标记为不健康，且kubelet会重启容器。  - 对于就绪探针：当连续失败次数达到阈值后，Pod会被标记为未就绪，并从Service的Endpoints 中移除，停止接收新流量，且容器不会被重启。   | 以存活探针的TCP端口检查为例，其他检查方式的配置方法类似。 ``` ... livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 0 timeoutSeconds: 1 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 ... ``` |
   
#### YAML示例
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0107.html)，使用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: nginx:alpine
       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
   ```
   
   
 
#### 相关文档
- [创建工作负载](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0673.html)：了解工作负载的更多参数。
- [管理工作负载](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0007.html)：工作负载创建后，您可以对其执行升级、编辑YAML、查看日志等操作。
- 如果工作负载创建失败，请参考[工作负载异常问题排查](https://support.huaweicloud.com/cce-autopilot_faq/cce_13_0016.html)进行处理。
 
