设置容器生命周期
容器生命周期函数是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,规则如下:
镜像 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] |
- 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”。
- 在“启动命令”页签,输入运行命令和运行参数。
图1 设置启动命令
表2 容器启动命令 参数
示例
说明
YAML示例
运行命令
/run/server
请输入可执行的命令,若运行命令有多个,需分行书写。
说明:多命令时,运行命令建议用/bin/sh或其他的shell,其他全部命令作为参数来传入。
... spec: containers: - image: nginx:latest command: - /run/server args: - '--port=8080' ...
运行参数
--port=8080
请输入控制容器运行命令参数,若参数有多个,多个参数以换行分隔。
- 其他参数配置完成后,单击右下角“创建工作负载”。待工作负载状态为“运行中”,则说明启动命令执行成功。
启动后处理(postStart Hook)
启动后处理(PostStart Hook)是Kubernetes提供的容器生命周期Hook,用于在容器主进程启动后立即执行初始化任务,如服务注册、动态配置生成等。该Hook由Kubelet异步触发,与主进程并行运行。尽管PostStart Hook与容器主进程是异步执行的,但如果其执行时间过长或挂起,可能会阻止容器正式进入Running状态。若执行失败,可能会导致容器启动失败并被终止。
- 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”。
- 在“启动后处理”页签,设置启动后处理的参数。请结合业务选择处理方式,例如:
- 如果需要在容器内部执行初始化逻辑(如运行脚本、配置环境等),请选择命令行脚本方式。
- 如果需要通知容器外部的系统或服务(如服务注册、调用配置中心接口等),请选择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 ...
- 其他参数配置完成后,单击右下角“创建工作负载”。等待一段时间后,工作负载状态为“运行中”。
停止前处理(preStop Hook)
如果容器发生崩溃或异常退出,PreStop Hook将不会被触发。在PreStop Hook执行之前,Pod的终止宽限期(Termination Grace Period)将开始倒计时。无论该Hook处理程序是否成功完成,容器都会在该宽限期内被终止,除非存在终结器(Finalizer)延迟终止流程。在 PreStop Hook执行完成或宽限期结束之前,容器的其他管理操作将被阻塞。
- 登录CCE控制台,在创建工作负载时,配置容器信息,选择“生命周期”。
- 在“停止前处理”页签,请根据业务选择处理方式,并设置相关参数。
图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 ...
- 其他参数配置完成后,单击右下角“创建工作负载”。等待一段时间后,工作负载状态为“运行中”。
YAML样例
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 执行以下命令,创建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
- 执行以下命令,创建工作负载。
kubectl create -f lifecycle.yaml
回显如下,表示已经开始创建工作负载。
deployment.apps/nginx created
- 执行以下命令,查看工作负载状态。
kubectl get deployment
回显如下,如果工作负载创建的Pod皆为可用状态,则表示创建成功。
NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 4m59s
相关文档
- 创建工作负载:了解工作负载的更多参数。
- 管理工作负载:工作负载创建后,您可以对其执行升级、编辑YAML、查看日志等操作。
- 如果工作负载创建失败,请参考工作负载异常问题排查进行处理。