弹性容器实例(VCI)支持设置同一个 Pod 内多个容器的启动和退出顺序。
默认情况下,VCI 实例内的各个容器是并发启动和退出的,没有固定的先后顺序。在某些场景下,一个实例内的多个容器之间可能存在依赖关系,某一容器需要在另一容器启动后再启动,或者某一容器需要在另一容器退出后再退出。比如在采集容器日志时,需要保证在业务容器产生日志前,日志容器已经启动完成,处于 Ready 状态;在业务容器退出后,日志容器才退出。针对此类场景,需要实现 Pod 内各个容器按照指定优先级启动和退出的功能。
本特性针对的是同一个 Pod 内的应用容器(App Container),不包括 Init 容器和临时容器,下文中无特殊说明时,容器均指应用容器。
当需要同一个实例内各个容器按顺序启动时,设置 Pod 内容器启动优先级,其中优先级高的容器会在优先级低的容器启动之前启动,相同优先级的容器不保证其启动先后顺序(并发启动)。
VCI 支持通过环境变量配置容器启动顺序,环境变量说明,如下表所示。
配置项 | 环境变量名称 | 配置说明 |
---|---|---|
容器启动优先级 | VCI_CONTAINER_LAUNCH_PRIORITY |
|
下文以创建一个 VCI Deployment,且 Deployment 下的 Pod 中包含 2 个应用容器为例,分别设置各个容器的启动优先级,查看各个容器的启动(started)时间,预期优先级高的容器最先被 started。创建 VCI 实例相关说明,请参见 创建实例。
vci-nginx-deployment.yaml
代码如下:apiVersion: apps/v1 kind: Deployment metadata: name: vci-nginx-deployment # Deployment 名称。 spec: replicas: 1 # Deployment 副本数。 selector: matchLabels: app: vci-nginx-deployment template: metadata: annotations: vke.volcengine.com/burst-to-vci: enforce # 将 Pod 强制部署到 VCI 上。 labels: app: vci-nginx-deployment spec: containers: - name: nginx-v1 # 容器名称。 image: cr-cn-beijing.volces.com/tw/nginx:1.0 # 容器镜像的地址和版本,请配置为您自己的镜像地址。 ports: - containerPort: 80 env: - name: VCI_CONTAINER_LAUNCH_PRIORITY # 容器启动优先级配置。 value: "1000" # 当前容器的启动优先级为 1000(优先级最高)。 readinessProbe: # 为高优先级的容器配置 Readiness Probe。 httpGet: path: / port: 80 initialDelaySeconds: 30 periodSeconds: 3 - name: nginx-v2 # 容器名称。 image: cr-cn-beijing.volces.com/tw/nginx:1.0 # 容器镜像的地址和版本,请配置为您自己的镜像地址。 env: - name: VCI_CONTAINER_LAUNCH_PRIORITY # 容器启动优先级配置。 value: "0" # 当前容器的启动优先级为 0。 args: - /bin/sh - -c - sleep 3600s
本示例中命令如下:kubectl apply -f <Deployment 的 YAML 配置文件路径>
kubectl create -f vci-nginx-deployment.yaml
本示例中命令如下:kubectl get pods -l app=<Deployment 的名称>
从返回信息的kubectl get pods -l app=vci-nginx-deployment
NAME
字段下获取 Pod 的名称。Events
字段中各个容器的启动时间。本示例中命令如下:kubectl describe pod <Pod 的名称>
kubectl describe pod vci-nginx-deployment-79886764b9-fm7tn
当需要同一个实例内各个容器按顺序退出时,设置 Pod 内容器退出优先级,其中优先级高的容器会在优先级低的容器退出之前退出,相同优先级的容器不保证其退出先后顺序(并发退出)。
说明
若设置了容器退出顺序,在删除 Pod 时可能会导致整个 Pod 的删除时间大于设定的优雅删除时间。
VCI 支持通过环境变量配置容器退出顺序,环境变量说明,如下表所示。
配置项 | 环境变量名称 | 配置说明 |
---|---|---|
容器退出优先级 | VCI_CONTAINER_EXIT_PRIORITY |
|
下文以创建一个 VCI Deployment,且 Deployment 下的 Pod 中包含 2 个应用容器为例,分别设置各个容器的退出优先级,同时设置 Pod 优雅删除时间为 90 秒, 查看各个容器的退出(killed)时间,预期优先级高的 容器最先被 killed。创建 VCI 实例相关说明,请参见 创建实例。
vci-nginx-deployment.yaml
代码如下:apiVersion: apps/v1 kind: Deployment metadata: name: vci-nginx-deployment # Deployment 名称。 spec: replicas: 1 # Deployment 副本数。 selector: matchLabels: app: vci-nginx-deployment template: metadata: annotations: vke.volcengine.com/burst-to-vci: enforce # 将 Pod 强制部署到 VCI 上。 labels: app: vci-nginx-deployment spec: containers: - name: nginx-v1 # 容器名称。 image: cr-cn-beijing.volces.com/tw/nginx:1.0 # 容器镜像的地址和版本,请配置为您自己的镜像地址。 ports: - containerPort: 80 env: - name: VCI_CONTAINER_EXIT_PRIORITY # 容器退出优先级配置。 value: "1000" # 当前容器的退出优先级为 1000(优先级最高)。 httpGet: path: / port: 80 initialDelaySeconds: 30 periodSeconds: 3 - name: nginx-v2 # 容器名称。 image: cr-cn-beijing.volces.com/tw/nginx:1.0 # 容器镜像的地址和版本,请配置为您自己的镜像地址。 env: - name: VCI_CONTAINER_EXIT_PRIORITY # 容器退出优先级配置。 value: "0" # 当前容器的退出优先级为 0。 args: - /bin/sh - -c - sleep 3600s
本示例中命令如下:kubectl apply -f <Deployment 的 YAML 配置文件路径>
kubectl create -f vci-nginx-deployment.yaml
本示例中命令如下:kubectl get pods -l app=<Deployment 的名称>
从返回信息的kubectl get pods -l app=vci-nginx-deployment
NAME
字段下获取 Pod 的名称。Events
字段中各个容器 Killing 事件的顺序。本示例中命令如下:kubectl delete pod <Pod 的名称> kubectl describe pod <Pod 的名称>
kubectl delete pod vci-nginx-deployment-79886764b9-fm7tn kubectl describe pod vci-nginx-deployment-79886764b9-fm7tn