弹性容器实例(VCI)基于 OpenKruise 的原地升级功能,支持 VCI Pod 原地重启能力。本文介绍如何使用 Openkruise 对 VCI Pod 进行原地升级。
OpenKruise 是基于 Kubernetes 的一个扩展套件,主要聚焦于云原生应用的自动化,例如部署、发布、运维以及可用性防护。通过在 VKE 中部署 OpenKruise,可以实现对工作负载中的 Pod 进行原地升级。详细说明,请参见 OpenKruise 原地升级。
metadata
(如annotation
、label
)的功能。说明
【邀测·申请试用】:其中,更新metadata
并原地重启 VCI Pod 的能力处于邀测阶段,如需使用,请提交申请。
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 # 容器镜像的地址和版本,请配置为您自己的镜像地址。
本示例中命令如下:kubectl apply -f <CloneSet 的 YAML 配置文件路径>
kubectl apply -f vci-openkruise.yaml
本示例中命令如下:kubectl get pods -l <与 CloneSet 相关的标签键>=<标签值>
从返回信息的kubectl get pods -l cloneset=vci-cloneset
NAME
字段下获取 Pod 的名称。本示例中命令如下:kubectl describe pod <Pod 的名称>
从返回信息的 Annotation:kubectl describe pod vci-cloneset-79886764b9-fm7tn
vci.vke.volcengine.com/instance-id
中获取 VCI 实例 ID。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。
预期输出结果如下,表示 Pod 重启完成:kubectl get cloneset -n <CloneSet 所在命名空间> <CloneSet 的名称>
NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE vci-cloneset 1 1 0 0 1 2d5h
说明
【邀测·申请试用】:该部分功能目前处于邀测阶段,如需使用,请提交申请。
说明
如已安装,无需重复安装。
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
本示例中命令如下:kubectl apply -f <CloneSet 的 YAML 配置文件路径>
kubectl apply -f vci-openkruise-demo.yaml
本示例中命令如下:kubectl get pods -l <与 CloneSet 相关的标签键>=<标签值>
从返回信息的kubectl get pods -l cloneset=venv001
NAME
字段下获取 Pod 的名称。本示例中命令如下:kubectl describe pod <Pod 的名称>
从返回信息的 Annotation:kubectl describe pod vci-cloneset-98346566b9-a3htn
vci.vke.volcengine.com/instance-id
中获取 VCI 实例 ID。metadata
下的annotation
和label
。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
预期输出结果如下,表示 Pod 重启完成:kubectl get cloneset -n <CloneSet 所在命名空间> <CloneSet 的名称>
NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE env001 1 1 0 0 1 1d5h
env
信息是否已更新。容器的 Label Value 已发生变更,但 Pod 的名称和 VCI 实例 ID 不会发生变化。kubectl exec <Pod 的名称> -n <Pod 所属命名空间> -c <容器的名称> --env