设置容器生命周期
操作场景
CCE提供了回调函数,在容器的生命周期的特定阶段执行调用,比如容器在停止前希望执行某项操作,就可以注册相应的钩子函数。
目前提供的生命周期回调函数如下所示:
容器如何执行命令和参数
Docker的镜像拥有存储镜像信息的相关元数据,如果不设置生命周期命令和参数,容器运行时将运行镜像制作时提供的默认的命令和参数,Docker将这两个字段定义为“Entrypoint”和 "CMD"。
如果在创建工作负载时填写了容器的运行命令和参数,将会覆盖镜像构建时的默认命令 "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控制台,在创建工作负载时,展开“生命周期”。
- 在“启动后处理”后,设置启动后处理的参数,如表2。
表2 启动后处理-参数说明 参数
说明
命令行方式
在容器中执行指定的命令,配置为需要执行的命令。命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。
如需要执行的命令如下:
exec: command: - /install.sh - install_agent
请在执行脚本中填写: /install install_agent。这条命令表示容器创建成功后将执行install.sh。
HTTP请求方式
发起一个HTTP调用请求。配置参数如下:
- 路径:请求的URL路径,可选项。
- 端口:请求的端口,必选项。
- 主机地址:请求的IP地址,可选项,默认是容器所在的节点IP。
停止前处理
- 登录CCE控制台,在创建工作负载配置生命周期过程中,选择“停止前处理”。
- 在“停止前处理”后,设置停止前处理的参数,如表2。
表3 停止前处理-参数说明 参数
说明
命令行方式
在容器中执行指定的命令,配置为需要执行的命令。命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。
如需要执行的命令如下:
exec: command: - /uninstall.sh - uninstall_agent
请在执行脚本中填写: /uninstall uninstall_agent。这条命令表示容器结束前将执行uninstall.sh。
HTTP请求方式
发起一个HTTP调用请求。配置参数如下:
- 路径:请求的URL路径,可选项。
- 端口:请求的端口,必选项。
- 主机地址:请求的IP地址,可选项,默认是容器所在的节点IP。
容器重启策略
Pod通过restartPolicy字段指定重启策略,重启策略类型为:Always、OnFailure和Never,默认为 Always。
restartPolicy仅指通过同一节点上的kubelet重新启动容器。
重启策略 |
说明 |
---|---|
Always |
当容器失效时,由kubelet自动重启该容器。 |
OnFailure |
当容器终止运行且退出码不为0时,由kubelet自动重启该容器。 |
Never |
不论容器运行状态如何,kubelet都不会重启该容器。 |

可以管理Pod的控制器有ReplicaSet Controller,Job,DaemonSet,及kubelet(静态Pod)。
- RS和DaemonSet:必须设置为Always,需要保证该容器持续运行。
- Job:OnFailure或Never,确保容器执行完后不再重启。
- kubelet:在Pod失效的时候重启它,不论RestartPolicy设置为什么值,并且不会对Pod进行健康检查。
设置容器生命周期-YAML样例
本节以nginx为例,说明kubectl命令设置容器生命周期的方法。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建一个名为nginx-deployment.yaml的描述文件。其中,nginx-deployment.yaml为自定义名称,您可以随意命名。
vi nginx-deployment.yaml
在以下配置文件中,您可以看到postStart命令在容器目录/bin/bash下写了个install.sh命令。 preStop执行uninstall.sh命令。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx strategy: type: RollingUpdate template: metadata: labels: app: nginx spec: restartPolicy: Always #重启策略 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
