更新时间:2025-06-19 GMT+08:00
分享

设置容器生命周期

容器生命周期函数是Kubernetes提供的核心机制,用于在容器运行的关键阶段插入自定义逻辑。这些函数为容器化应用提供了精细化的过程控制能力,使应用能够更好地适应云原生环境的动态特性。CCE提供的生命周期函数如下,更多信息,请参见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控制台,在创建工作负载时,配置容器信息,选择“生命周期”
  2. “启动命令”页签,输入运行命令和运行参数

    图1 设置启动命令

    表2 容器启动命令

    参数

    示例

    说明

    YAML示例

    运行命令

    /run/server

    请输入可执行的命令,若运行命令有多个,需分行书写。

    说明:

    多命令时,运行命令建议用/bin/sh或其他的shell,其他全部命令作为参数来传入。

    ...
    spec:
      containers:
      - image: nginx:latest 
        command:
          - /run/server
         args:
           - '--port=8080' 
    ...

    运行参数

    --port=8080

    请输入控制容器运行命令参数,若参数有多个,多个参数以换行分隔。

  3. 其他参数配置完成后,单击右下角“创建工作负载”。待工作负载状态为“运行中”,则说明启动命令执行成功。

启动后处理(postStart Hook)

启动后处理(PostStart Hook)是Kubernetes提供的容器生命周期Hook,用于在容器主进程启动后立即执行初始化任务,如服务注册、动态配置生成等。该Hook由Kubelet异步触发,与主进程并行运行。尽管PostStart Hook与容器主进程是异步执行的,但如果其执行时间过长或挂起,可能会阻止容器正式进入Running状态。若执行失败,可能会导致容器启动失败并被终止。

  1. 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”
  2. “启动后处理”页签,设置启动后处理的参数。请结合业务选择处理方式,例如:

    • 如果需要在容器内部执行初始化逻辑(如运行脚本、配置环境等),请选择命令行脚本方式。
    • 如果需要通知容器外部的系统或服务(如服务注册、调用配置中心接口等),请选择HTTP请求方式。
    图2 命令行脚本

    表3 启动后处理

    处理方式

    示例

    说明

    YAML示例

    命令行脚本

    /install.sh

    install_agent

    用于在容器中执行指定的命令,需配置“执行命令”

    执行命令的格式为Command Arg[1] Arg[2] ...,其中Command为系统命令或用户自定义的可执行程序。如果未显式指定路径,系统会在默认的环境路径中查找该命令。若需执行多条命令,建议将其预先写入容器镜像中的脚本文件,并通过该命令调用脚本。“执行命令”必须同步、前台执行,不支持以后台或异步方式运行,否则可能导致生命周期钩子执行失败。

    ...
    lifecycle:
      postStart:
        exec:
          command:
          - /install.sh
          - install_agent   
    ...

    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
    ...

  3. 其他参数配置完成后,单击右下角“创建工作负载”。等待一段时间后,工作负载状态为“运行中”。

停止前处理(preStop Hook)

如果容器发生崩溃或异常退出,PreStop Hook将不会被触发。在PreStop Hook执行之前,Pod的终止宽限期(Termination Grace Period)将开始倒计时。无论该Hook处理程序是否成功完成,容器都会在该宽限期内被终止,除非存在终结器(Finalizer)延迟终止流程。在 PreStop Hook执行完成或宽限期结束之前,容器的其他管理操作将被阻塞。

  1. 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”
  2. “停止前处理”页签,请根据业务选择处理方式,并设置相关参数。

    图3 停止前处理

    表4 停止前处理

    参数

    示例

    说明

    YAML示例

    命令行脚本

    /uninstall.sh

    uninstall_agent

    用于在容器中执行指定的命令,需配置“执行命令”

    命令的格式为Command Arg[1] Arg[2]…,其中Command为系统命令或用户自定义的可执行程序。如果未显式指定路径,系统会在默认的环境路径中查找该命令。若需执行多条命令,建议将其预先写入容器镜像中的脚本文件,并通过该命令调用脚本。

    ...
    lifecycle:
      preStop:
        exec:
          command:
          - /uninstall.sh
          - uninstall_agent   
    ...

    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
    ...

  3. 其他参数配置完成后,单击右下角“创建工作负载”。等待一段时间后,工作负载状态为“运行中”。

YAML样例

  1. 请参见通过kubectl连接集群,使用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:
            - sleep 3600                        #启动命令:让当前进程暂停执行3600s
            imagePullPolicy: Always
            lifecycle:
             postStart:
               exec:
                  command:
                  - /bin/bash
                  - install.sh                  #启动后命令在/bin/bash执行install.sh命令
             preStop:
                exec:
                  command:
                  - /bin/bash
                  - uninstall.sh                 #停止前命令在/bin/bash执行uninstall.sh命令
            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

相关文档

相关文档