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] |
在默认情况下,镜像启动时会运行默认命令,如果想运行特定命令或重写镜像默认值,需要进行相应设置。设置方法请参见设置容器启动命令。
启动后处理
步骤 1 登录CCE控制台,在创建工作负载时,展开“生命周期”。
步骤 2 在“启动后处理”后,设置启动后处理的参数,如下表。
启动后处理-参数说明
参数 | 说明 |
命令行方式 | 在容器中执行指定的命令,配置为需要执行的命令。命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。 如需要执行的命令如下: exec: 请在执行脚本中填写: /install install_agent。这条命令表示容器创建成功后将执行install.sh。 |
HTTP请求方式 | 发起一个HTTP调用请求。配置参数如下: 路径:请求的URL路径,可选项。 端口:请求的端口,必选项。 主机地址:请求的IP地址,可选项,默认是容器所在的节点IP。 |
步骤 1 登录CCE控制台,在创建工作负载配置生命周期过程中,选择“停止前处理”。
步骤 2 在“停止前处理”后,设置停止前处理的参数,如下表。
停止前处理-参数说明
参数 | 说明 |
命令行方式 | 在容器中执行指定的命令,配置为需要执行的命令。命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。 如需要执行的命令如下: exec: 请在执行脚本中填写: /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操作CCE集群配置kubectl命令,使弹性云主机连接集群。
操作步骤
步骤 1 登录已配置好kubectl命令的弹性云主机。
步骤 2 创建一个名为nginx-deployment.yaml的描述文件。其中,nginx-deployment.yaml为自定义名称,您可以随意命名。
vi nginx-deployment.yaml
在以下配置文件中,您可以看到postStart命令在容器目录/bin/bash下写了个install.sh命令。 preStop执行uninstall.sh命令。
apiVersion: extensions/v1beta1
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