You need to enable JavaScript to run this app.
导航
VCI Pod 原地重启
最近更新时间:2025.02.14 16:48:08首次发布时间:2024.08.06 14:29:17

弹性容器实例(VCI)基于 OpenKruise 的原地升级功能,支持 VCI Pod 原地重启能力。本文介绍如何使用 Openkruise 对 VCI Pod 进行原地升级。

背景信息

OpenKruise 是基于 Kubernetes 的一个扩展套件,主要聚焦于云原生应用的自动化,例如部署、发布、运维以及可用性防护。通过在 VKE 中部署 OpenKruise,可以实现对工作负载中的 Pod 进行原地升级。详细说明,请参见 OpenKruise 原地升级

使用说明

前提条件

操作步骤

场景一:更新容器的镜像

  1. 在 VCI 业务集群中,安装 OpenKruise(VKE 应用模板名称为 Kruise)。详细操作,请参见 应用模板
    alt
  2. 通过 kubectl 创建一个 OpenKruise 的 Workload,并指定部署到 VCI。示例 YAML 文件vci-openkruise.yaml代码如下:
    apiVersion: apps.kruise.io/v1alpha1
    kind: CloneSet
    metadata:
      labels:
        app: vci-cloneset
      name: vci-cloneset
    spec:
      replicas: 5  # CloneSet 副本数。
      selector:
        matchLabels:
          app: vci-cloneset
      template:
        metadata:
          annotations:
            vke.volcengine.com/burst-to-vci: enforce  # 强制部署到 VCI 上。
          labels:
            app: vci-cloneset
        spec:
          containers:
          - name: nginx
            image: cr-cn-beijing.volces.com/tw/nginx:1.0  # 容器镜像的地址和版本,请配置为您自己的镜像地址。
    
  3. 执行如下命令,创建 OpenKruise 的 Workload(本示例中为 CloneSet)。
    kubectl apply -f <CloneSet 的 YAML 配置文件路径>
    
    本示例中命令如下:
    kubectl apply -f vci-openkruise.yaml
    
  4. 成功创建 Workload 后,查看并记录 Pod 的名称和 VCI 实例 ID。
    1. 执行以下命令获取 CloneSet 下 Pod 的名称。
      kubectl get pods -l <与 CloneSet 相关的标签键>=<标签值>
      
      本示例中命令如下:
      kubectl get pods -l cloneset=vci-cloneset
      
      从返回信息的NAME字段下获取 Pod 的名称。
    2. 执行以下命令,查看 Pod 的详情,获取 VCI 实例 ID。
      kubectl describe pod <Pod 的名称>
      
      本示例中命令如下:
      kubectl describe pod vci-cloneset-79886764b9-fm7tn
      
      从返回信息的 Annotation:vci.vke.volcengine.com/instance-id 中获取 VCI 实例 ID。
  5. 修改 Workload 的 YAML,验证 Pod 原地重启能力。将image字段更新为其他版本的容器镜像。示例 YAML 内容如下:
    apiVersion: apps.kruise.io/v1alpha1
    kind: CloneSet
    metadata:
      labels:
        app: vci-cloneset
      name: vci-cloneset
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: vci-cloneset
      template:
        metadata:
          annotations:
            vke.volcengine.com/burst-to-vci: enforce  # 强制部署到 VCI 上。
          labels:
            app: vci-cloneset
        spec:
          containers:
          - name: nginx
            image: cr-cn-beijing.volces.com/tw/nginx:1.1  # 容器镜像的地址和版本,请配置为您自己的镜像地址。本示例将原先的镜像 tag:1.0 替换为 1.1。
    
  6. 查看 Workload(本示例中为 CloneSet)更新状态,等待 Pod 重启完成。
    kubectl get cloneset -n <CloneSet 所在命名空间> <CloneSet 的名称>
    
    预期输出结果如下,表示 Pod 重启完成:
    NAME           DESIRED   UPDATED    UPDATED_READY   READY   TOTAL   AGE
    vci-cloneset   1         1          0               0       1       2d5h
    
  7. 参考步骤 3 中的命令,再次查看并记录 Workload 中 Pod 的名称、VCI 实例 ID。
    Pod 将会重新拉取镜像,但 Pod 的名称和 VCI 实例 ID 不会发生变化。

场景二:更新容器的 metadata

说明

邀测·申请试用】:该部分功能目前处于邀测阶段,如需使用,请提交申请。

  1. 在 VCI 业务集群中,安装 OpenKruise(VKE 应用模板名称为 Kruise)。详细操作,请参见 应用模板

    说明

    如已安装,无需重复安装。

    alt
  2. 通过 kubectl 创建一个 OpenKruise 的 Workload,并指定部署到 VCI。示例 YAML 文件vci-openkruise-demo.yaml代码如下:
    apiVersion: apps.kruise.io/v1alpha1
    kind: CloneSet
    metadata:
      labels:
        app: env001
      name: env001
      namespace: long123
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: env001
      template:
        metadata:
          annotations:
            aaa: ooo
            vci.volcengine.com/tls-enable: "false"  # 不开启日志采集。
            vke.volcengine.com/burst-to-vci: enforce  # 强制部署到 VCI 上。
          labels:
            app: env001
            ccc: hhh
            eee: ggg
        spec:
          containers:
          - env:
            - name: vci-c1
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.annotations['aaa']
            - name: vci-c2
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.labels['ccc']
            image: vci-cn-beijing.cr.volces.com/vci_qa_20220506/debian-long:1.0.4  # 容器镜像的地址和版本,请配置为您自己的镜像地址。
            imagePullPolicy: IfNotPresent
            name: c1
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            args:
            - -c
            - sleep 3000
            command:
            - /bin/bash
          - env:
            - name: vci-c1
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.annotations['aaa']
            - name: vci-c2
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.labels['ccc']
            image: vci-cn-beijing.cr.volces.com/vci_qa_20220506/debian-long:1.0.4  # 容器镜像的地址和版本,请配置为您自己的镜像地址。
            imagePullPolicy: IfNotPresent
            name: c2
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
  3. 执行如下命令,创建 OpenKruise 的 Workload(本示例中为 CloneSet)。
    kubectl apply -f <CloneSet 的 YAML 配置文件路径>
    
    本示例中命令如下:
    kubectl apply -f vci-openkruise-demo.yaml
    
  4. 成功创建 Workload 后,查看并记录 Pod 的名称和 VCI 实例 ID。
    1. 执行以下命令获取 CloneSet 下 Pod 的名称。
      kubectl get pods -l <与 CloneSet 相关的标签键>=<标签值>
      
      本示例中命令如下:
      kubectl get pods -l cloneset=venv001
      
      从返回信息的NAME字段下获取 Pod 的名称。
    2. 执行以下命令,查看 Pod 的详情,获取 VCI 实例 ID。
      kubectl describe pod <Pod 的名称>
      
      本示例中命令如下:
      kubectl describe pod vci-cloneset-98346566b9-a3htn
      
      从返回信息的 Annotation:vci.vke.volcengine.com/instance-id 中获取 VCI 实例 ID。
  5. 修改 Workload 的 YAML,验证 Pod 原地重启能力。按如下示例更新容器metadata下的annotationlabel
    apiVersion: apps.kruise.io/v1alpha1
    kind: CloneSet
    metadata:
      labels:
        app: env001
      name: env001
      namespace: long123
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: env001
      template:
        metadata:
          annotations:
            aaa: abc  # 修改 Label Value(例如将 ooo 改为 abc)。
            vci.volcengine.com/tls-enable: "false"
            vke.volcengine.com/burst-to-vci: enforce
          labels:
            app: env001     
            ccc: def  # 修改 Label Value(例如将 hhh 改为 def)。
            eee: ggg
        spec:
          containers:
          - env:
            - name: vci-c1  # 容器名称。
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.annotations['aaa']
            - name: vci-c2  # 容器名称。
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.labels['ccc']
            image: vci-cn-beijing.cr.volces.com/vci_qa_20220506/debian-long:1.0.4  # 容器镜像的地址和版本,请配置为您自己的镜像地址。
            imagePullPolicy: IfNotPresent
            name: c1
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            args:
            - -c
            - sleep 3000
            command:
            - /bin/bash
          - env:
            - name: vci-c1
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.annotations['aaa']
            - name: vci-c2
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.labels['ccc']
            image: vci-cn-beijing.cr.volces.com/vci_qa_20220506/debian-long:1.0.4  # 容器镜像的地址和版本,请配置为您自己的镜像地址。
            imagePullPolicy: IfNotPresent
            name: c2
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
  6. 查看 Workload(本示例中为 CloneSet)更新状态,等待 Pod 重启完成。
    kubectl get cloneset -n <CloneSet 所在命名空间> <CloneSet 的名称>
    
    预期输出结果如下,表示 Pod 重启完成:
    NAME           DESIRED   UPDATED    UPDATED_READY   READY   TOTAL   AGE
    env001         1         1          0               0       1       1d5h
    
  7. 进入对应的容器,查看容器env信息是否已更新。
    kubectl exec <Pod 的名称> -n <Pod 所属命名空间> -c <容器的名称> --env
    
    容器的 Label Value 已发生变更,但 Pod 的名称和 VCI 实例 ID 不会发生变化。