# 设置容器生命周期
容器生命周期函数是Kubernetes提供的核心机制，用于在容器运行的关键阶段插入自定义逻辑。这些函数为容器化应用提供了精细化的过程控制能力，使应用能够更好地适应云原生环境的动态特性。CCE提供的生命周期函数如下，更多信息，请参见[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。如果未在容器规范中显式指定命令与参数，容器将采用镜像构建时设置的默认值。
如果在创建工作负载时填写了容器的运行命令和参数（command和args字段），将会覆盖镜像构建时的默认命令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/zh-cn_image_0000002563183585.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/zh-cn_image_0000002532064204.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/zh-cn_image_0000002532064736.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样例
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 执行以下命令，创建YAML文件lifecycle.yaml，用于配置工作负载，文件名称可自定义。 
   ```
   vim lifecycle.yaml
   ```
   文件内容如下：
   ```
   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:  #启动命令：让当前进程暂停执行10s
           - /bin/sh
           args:
           - '-c'
           - sleep 10
           imagePullPolicy: Always
           lifecycle:
            postStart:   #启动后命令：在容器的/usr/share目录下写入message文件
              exec:
                 command:
                 - /bin/sh
                 - '-c'
                 - echo Hello from the postStart handler > /usr/share/message
            preStop:  #停止前命令：优雅地终止nginx服务
               exec:
                 command:
                 - /bin/sh
                 - '-c'
                 - nginx -s quit; while killall -0 nginx; do sleep 1; done
           name: nginx
         imagePullSecrets:
         - name: default-secret
   ```
   
   
3. 执行以下命令，创建工作负载。 
   ```
   kubectl create -f lifecycle.yaml
   ```
   回显如下，表示已经开始创建工作负载。
   ```
   deployment.apps/nginx created
   ```
   
   
4. 执行以下命令，查看工作负载状态。 
   ```
   kubectl get deployment
   ```
   回显如下，如果工作负载创建的Pod皆为可用状态，则表示创建成功。
   ```
   NAME     READY   UP-TO-DATE   AVAILABLE   AGE
   nginx      1/1     1            1           4m59s
   ```
   
   
 
#### 相关文档
- [创建工作负载](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)进行处理。
 
