# 设置容器生命周期
容器生命周期函数是Kubernetes提供的核心机制，用于在容器运行的关键阶段插入自定义逻辑。这些函数为容器化应用提供了精细化的过程控制能力，使应用能够更好地适应云原生环境的动态特性。CCE Autopilot提供的生命周期函数如下，更多信息，请参见[Container Lifecycle Hooks](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/)。
- **[启动命令]** ：容器启动时执行的命令，**用于定义容器的主进程。**该进程作为容器启动后的默认执行入口，其运行状态直接决定容器的生命周期。适用于需要指定应用入口、环境变量、挂载点或端口映射等初始化场景。
- **[启动后处理（postStart Hook）]** ：是Kubernetes提供的容器生命周期Hook，**用于在容器主进程启动后立即执行初始化任务（如服务注册、动态配置生成等）**。该Hook由kubelet异步触发，与主进程并行运行，避免阻塞容器启动流程，从而加快容器就绪速度。适用于需要在应用进程启动后，立即进行环境配置或运行初始化逻辑的场景。
- **[停止前处理（preStop Hook）]** ：是Kubernetes提供的容器生命周期Hook，**用于在容器终止前执行预定义清理逻辑**。当Pod被删除或更新时，kubelet会先触发该Hook，执行相关操作（如注销服务、刷新状态等），然后再向容器主进程发送SIGTERM信号，确保应用实现优雅关闭。适用于需安全停机避免数据丢失或服务异常的场景。
 #### 启动命令
启动命令指容器启动时执行的操作，用于定义容器的主进程，其运行状态直接决定容器的生命周期。如果该命令执行失败且未配置重启策略，容器将直接终止。
在默认情况下，镜像启动时会运行默认命令，如果想运行特定命令或重写镜像默认值，需要进行相应设置。默认情况下，容器会执行镜像中预设的启动命令。Docker镜像中包含一组用于定义启动行为的元数据字段，即ENTRYPOINT和CMD。如果未在容器规范中显式指定命令与参数，容器将采用镜像构建时设置的默认值。
如果在创建工作负载时填写了容器的运行命令和参数，将会覆盖镜像构建时的默认命令ENTRYPOINT、CMD，规则如下：
表1容器如何执行命令和参数 
| 镜像ENTRYPOINT | 镜像CMD           | 容器运行命令    | 容器运行参数         | 最终执行                 |
|:---|:---|:---|:---|:---|
| \[touch\]   | \[/root/test\] | 未设置       | 未设置           | \[touch /root/test\] |
| \[touch\]    | \[/root/test\]  | \[mkdir\] | 未设置           | \[mkdir\]            |
| \[touch\]     | \[/root/test\]  | 未设置         | \[/opt/test\] | \[touch /opt/test\] |
| \[touch\]     | \[/root/test\]   | \[mkdir\]  | \[/opt/test\]   | \[mkdir /opt/test\] |
   
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 单击集群名称进入集群，在左侧导航栏单击"工作负载"，右上角单击"创建工作负载"。
3. 创建工作负载时，在"容器配置 \> 容器信息 \> 生命周期"的"启动命令"页签中，输入运行命令和运行参数。 
   图1设置启动命令   
   ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002395236145.png "点击放大")
   表2容器启动命令 
   | 参数    | 示例                                                                                                                                                                                                                                                                      | 说明                                                                                                                                 | YAML示例                                  |
   |:---|:---|:---|:---|
   | 运行命令 | - /bin/sh                                                                                                                                      | 请输入可执行的命令，若运行命令有多个，需分行填写。 说明： 多命令时，运行命令建议用/bin/sh或其他的shell，其他全部命令作为参数传入。 | ``` ... spec: containers: - image: nginx:latest command: - /bin/sh args: - '-c' - sleep 10 ... ``` |
   | 运行参数 | - -c  - sleep 10   | 请输入控制容器运行命令参数，若参数有多个，多个参数以换行分隔。                                                                                                      | ``` ... spec: containers: - image: nginx:latest command: - /bin/sh args: - '-c' - sleep 10 ... ``` |
      
   
   
4. 其他参数配置完成后，单击右下角"创建工作负载"。待工作负载状态为"运行中"，则说明启动命令执行成功。
 
 #### 启动后处理（postStart Hook）
启动后处理（PostStart Hook）是Kubernetes提供的容器生命周期Hook，用于在容器主进程启动后立即执行初始化任务，如服务注册、动态配置生成等。该Hook由Kubelet异步触发，与主进程并行运行。尽管PostStart Hook与容器主进程是异步执行的，但如果其执行时间过长或挂起，可能会阻止容器正式进入Running状态。若执行失败，可能会导致容器启动失败并被终止。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 单击集群名称进入集群，在左侧导航栏单击"工作负载"，右上角单击"创建工作负载"。
3. 创建工作负载时，在"容器配置 \> 容器信息 \> 生命周期"的"启动后处理"页签中，设置启动后处理的参数。请结合业务选择处理方式，例如： 
   - 如果需要在容器内部执行初始化逻辑（如运行脚本、配置环境等），请选择**命令行脚本**方式。
   
   - 如果需要通知容器外部的系统或服务（如服务注册、调用配置中心接口等），请选择**HTTP请求**方式。
   
   
   图2命令行脚本   
   ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002361882750.png "点击放大")
   表3启动后处理 
   | 处理方式    | 示例                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | YAML示例                                                                 |
   |:---|:---|:---|:---|
   | 命令行脚本  | 输入以下三行命令：在容器的/usr/share目录下写入message文件 - /bin/sh  - -c  - echo Hello from the postStart handler \> /usr/share/message   | 用于在容器中执行指定的命令，需配置"执行命令"。 执行命令的格式为Command Arg\[1\] Arg\[2\] ...，其中Command为系统命令或用户自定义的可执行程序。如果未显式指定路径，系统会在默认的环境路径中查找该命令。若需执行多条命令，建议将其预先写入容器镜像中的脚本文件，并通过该命令调用脚本。**"执行命令"必须** **同步、前台执行** **，不支持以后台或异步方式运行，否则可能导致生命周期钩子执行失败。** 注意： postStart命令行脚本需保证能够正常运行结束并退出，否则将会影响后续Pod状态更新及Pod删除流程。                                                                                                              | ``` ... lifecycle: postStart: exec: command: - /bin/sh - '-c' - echo Hello from the postStart handler > /usr/share/message ... ``` |
   | HTTP请求 | - 路径：/nginx  - 端口：80  - 主机地址：127.0.0.1                                                                                                                                              | 用于发起HTTP调用请求。配置参数如下： - 路径：请求的URL路径，可选项。  - 端口：请求的端口，必选项。  - 主机地址：请求的IP地址，可选项，默认为实例IP。   | ``` lifecycle: postStart: httpGet: path: /nginx port: 80 host: 127.0.0.1 scheme: HTTP ... ```                                      |
      
   
   
4. 其他参数配置完成后，单击右下角"创建工作负载"。待工作负载状态为"运行中"，则说明启动命令执行成功。
 
 #### 停止前处理（preStop Hook）
如果容器发生崩溃或异常退出，PreStop Hook将不会被触发。在PreStop Hook执行之前，Pod的终止宽限期（Termination Grace Period）将开始倒计时。无论该Hook处理程序是否成功完成，容器都会在该宽限期内被终止，除非存在终结器（Finalizer）延迟终止流程。在 PreStop Hook执行完成或宽限期结束之前，容器的其他管理操作将被阻塞。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 单击集群名称进入集群，在左侧导航栏单击"工作负载"，右上角单击"创建工作负载"。
3. 创建工作负载时，在"容器配置 \> 容器信息 \> 生命周期"的"停止前处理"页签中，请根据业务选择处理方式，并设置相关参数。 
   图3停止前处理   
   ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002395403737.png "点击放大")
   表4停止前处理 
   | 参数   | 示例                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | YAML示例                                                           |
   |:---|:---|:---|:---|
   | 命令行脚本 | 输入以下三行命令：优雅地终止nginx服务 - /bin/sh  - -c  - nginx -s quit; while killall -0 nginx; do sleep 1; done   | 用于在容器中执行指定的命令，需配置"执行命令"。 命令的格式为Command Arg\[1\] Arg\[2\]...，其中Command为系统命令或用户自定义的可执行程序。如果未显式指定路径，系统会在默认的环境路径中查找该命令。若需执行多条命令，建议将其预先写入容器镜像中的脚本文件，并通过该命令调用脚本。                                                                                                                                                                                                                                                                                                    | ``` ... lifecycle: preStop: exec: command: - /bin/sh - '-c' - nginx -s quit; while killall -0 nginx; do sleep 1; done ... ``` |
   | HTTP请求 | - 路径：/nginx  - 端口：80  - 主机地址：127.0.0.1                                                                                                                              | 用于发起一个HTTP调用请求。配置参数如下： - 路径：请求的URL路径，可选项。  - 端口：请求的端口，必选项。  - 主机地址：请求的IP地址，可选项，默认为实例IP。   | ``` lifecycle: preStop: httpGet: path: /nginx port: 80 host: 127.0.0.1 scheme: HTTP ... ```                                   |
      
   
   
4. 其他参数配置完成后，单击右下角"创建工作负载"。待工作负载状态为"运行中"，则说明启动命令执行成功。
 
#### YAML样例
本节以nginx为例，说明kubectl命令设置容器生命周期的方法。
在以下配置文件中，您可以看到postStart命令在容器目录/bin/bash下写了个**install.sh** 命令。 preStop执行**uninstall.sh**命令。
```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx 
        command:
        - sleep 3600                        #启动命令
        imagePullPolicy: Always
        lifecycle:
          postStart:
            exec:
              command:
              - /bin/bash
              - install.sh                  #启动后命令
          preStop:
            exec:
              command:
              - /bin/bash
              - uninstall.sh                 #停止前命令
        name: nginx
      imagePullSecrets:
      - name: default-secret
```
#### 相关文档
- [创建工作负载](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)进行处理。
 
