You need to enable JavaScript to run this app.
导航
设置容器启动和退出顺序
最近更新时间:2024.08.06 14:29:17首次发布时间:2024.08.06 14:29:17

弹性容器实例(VCI)支持设置同一个 Pod 内多个容器的启动和退出顺序。

背景信息

默认情况下,VCI 实例内的各个容器是并发启动和退出的,没有固定的先后顺序。在某些场景下,一个实例内的多个容器之间可能存在依赖关系,某一容器需要在另一容器启动后再启动,或者某一容器需要在另一容器退出后再退出。比如在采集容器日志时,需要保证在业务容器产生日志前,日志容器已经启动完成,处于 Ready 状态;在业务容器退出后,日志容器才退出。针对此类场景,需要实现 Pod 内各个容器按照指定优先级启动和退出的功能。

本特性针对的是同一个 Pod 内的应用容器(App Container),不包括 Init 容器和临时容器,下文中无特殊说明时,容器均指应用容器。

前提条件

配置容器启动顺序

当需要同一个实例内各个容器按顺序启动时,设置 Pod 内容器启动优先级,其中优先级高的容器会在优先级低的容器启动之前启动,相同优先级的容器不保证其启动先后顺序(并发启动)。

参数说明

VCI 支持通过环境变量配置容器启动顺序,环境变量说明,如下表所示。

配置项环境变量名称配置说明

容器启动优先级

VCI_CONTAINER_LAUNCH_PRIORITY

  • 取值范围为:-1000~1000,默认值为:0。数值越大,启动优先级越高。
  • 优先级高的容器保证会在优先级低的容器启动之前启动,相同优先级的容器不保证启动顺序(并发启动)。
  • 如果某个容器依赖其他容器提供服务,则需要在依赖容器中配置就绪探针(Readiness Probe)。例如:B 容器依赖 A 容器提供服务,则在设置 A 容器的启动优先级高于 B 容器的同时,还需要为 A 容器配置 Readiness Probe,确保 A 容器准备就绪后才启动 B 容器。

示例

下文以创建一个 VCI Deployment,且 Deployment 下的 Pod 中包含 2 个应用容器为例,分别设置各个容器的启动优先级,查看各个容器的启动(started)时间,预期优先级高的容器最先被 started。创建 VCI 实例相关说明,请参见 创建实例

  1. 通过 kubectl 创建 VCI Deployment 的 YAML 文件。示例 YAML 文件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
    
  2. 执行以下命令,创建 Deployment。
    kubectl apply -f <Deployment 的 YAML 配置文件路径>
    
    本示例中命令如下:
    kubectl create -f vci-nginx-deployment.yaml
    
  3. 完成 Deployment 的创建后,验证容器启动顺序。
    1. 执行以下命令获取 VCI Deployment 下 Pod 的名称。
      kubectl get pods -l app=<Deployment 的名称>
      
      本示例中命令如下:
      kubectl get pods -l app=vci-nginx-deployment
      
      从返回信息的NAME字段下获取 Pod 的名称。
    2. 执行以下命令,获取 Pod 详细信息,观察 Pod 的Events字段中各个容器的启动时间。
      kubectl describe pod <Pod 的名称>
      
      本示例中命令如下:
      kubectl describe pod vci-nginx-deployment-79886764b9-fm7tn
      

配置容器退出顺序

当需要同一个实例内各个容器按顺序退出时,设置 Pod 内容器退出优先级,其中优先级高的容器会在优先级低的容器退出之前退出,相同优先级的容器不保证其退出先后顺序(并发退出)。

说明

若设置了容器退出顺序,在删除 Pod 时可能会导致整个 Pod 的删除时间大于设定的优雅删除时间。

参数说明

VCI 支持通过环境变量配置容器退出顺序,环境变量说明,如下表所示。

配置项环境变量名称配置说明

容器退出优先级

VCI_CONTAINER_EXIT_PRIORITY

  • 取值范围为:-1000~1000,默认值为:0。数值越大,退出优先级越高。
  • 优先级高的容器保证会在优先级低的容器退出之前退出,相同优先级的容器不保证退出顺序(并发退出)。

示例

下文以创建一个 VCI Deployment,且 Deployment 下的 Pod 中包含 2 个应用容器为例,分别设置各个容器的退出优先级,同时设置 Pod 优雅删除时间为 90 秒, 查看各个容器的退出(killed)时间,预期优先级高的 容器最先被 killed。创建 VCI 实例相关说明,请参见 创建实例

  1. 通过 kubectl 创建 VCI Deployment 的 YAML 文件。示例 YAML 文件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
    
  2. 执行以下命令,创建 Deployment。
    kubectl apply -f <Deployment 的 YAML 配置文件路径>
    
    本示例中命令如下:
    kubectl create -f vci-nginx-deployment.yaml
    
  3. 完成 Deployment 的创建后,验证容器退出顺序。
    1. 执行以下命令获取 VCI Deployment 下 Pod 的名称。
      kubectl get pods -l app=<Deployment 的名称>
      
      本示例中命令如下:
      kubectl get pods -l app=vci-nginx-deployment
      
      从返回信息的NAME字段下获取 Pod 的名称。
    2. 执行以下命令,删除 Pod,然后快速获取 Pod 详细信息,观察 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