升级 global 集群

本文档介绍如何升级运行在不可变基础设施上的 global 集群。升级会使用由 Cluster API provider 管理的新 Alauda OS 镜像替换节点;不会执行原地节点升级。

何时使用此路径

在以下情况下选择此升级路径:

  • global 集群最初安装在不可变基础设施上。请参见 安装 global 集群
  • 你的基础设施属于本文档所述的提供方之一:Huawei DCS 或 Huawei Cloud Stack。VMware vSphere 和 global 集群的裸金属支持正在规划中。

对于传统 OS 的 global 集群,请改用 标准升级路径

两阶段升级概述

与业务集群类似,不可变基础设施上的 global 集群采用两阶段升级。

  1. 阶段 1 — Distribution Version:对齐和无关扩展升级到目标 Distribution Version。该操作步骤与业务集群共用;有关阶段 1 的机制,请参见 升级集群
  2. 阶段 2 — Kubernetes 和 OS 镜像:使用包含目标 Kubernetes 版本的新 Alauda OS 镜像替换节点。本文档重点介绍 global 集群的阶段 2。
阶段 1 兼容性

在开始阶段 2 之前,请验证每个业务集群都位于目标 Distribution Version 的兼容版本矩阵范围内。超出范围的业务集群必须先升级。

通用前提条件

  • global 集群已完成阶段 1(Distribution Version 升级)。
  • 已对 global 集群执行并验证 etcd 备份。
  • 平台的 registry 中已提供新的 Alauda OS 镜像以及匹配的 KubeadmControlPlaneMachineDeployment 版本。
  • 已制定考虑到控制平面滚动替换的维护窗口计划。
  • 对于跨越多个 Kubernetes 次版本的跨版本升级,已预先准备中间版本的 Core 镜像和 OS 镜像。请参见 跨版本升级准备

操作步骤

安装完成后,管理 global 集群的 Cluster API controllers 运行在 global 集群自身上。在本操作步骤中的 kubectl 命令请使用 global kubeconfig。

步骤 1 — 更新 global 集群清单

更新 global 集群的 Cluster API manifests,以引用新的 Alauda OS 镜像和 Kubernetes 版本。需要更新的清单字段因提供方而异。

Huawei DCS
VMware vSphere
Huawei Cloud Stack
Bare Metal

对于 DCS,请创建新的不可变基础设施模板,不要编辑已经被运行中的 machine 引用的模板。

更新控制平面资源:

  • 为目标镜像创建新的 DCSMachineTemplate,并将 spec.template.spec.vmTemplateName 设置为与目标 Kubernetes 版本匹配的 Alauda OS template。
  • 将保留的节点本地数据(包括 /var/cpaas)保留在 DCSIpHostnamePool.spec.pool[].persistentDisk 中。不要把保留磁盘移回 DCSMachineTemplate
  • KubeadmControlPlane.spec.version 设置为目标 Kubernetes 版本。
  • KubeadmControlPlane.spec.machineTemplate.infrastructureRef.name 指向新的 DCSMachineTemplate
  • 当集群使用由池管理的持久磁盘时,保持 KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge: 0

更新工作节点资源:

  • 为目标 vmTemplateName 创建新的工作 DCSMachineTemplate
  • 将每个 MachineDeployment.spec.template.spec.version 设置为目标 Kubernetes 版本。
  • 将每个 MachineDeployment.spec.template.spec.infrastructureRef.name 指向新的工作 DCSMachineTemplate
  • 当工作池使用由池管理的持久磁盘时,保持每个 MachineDeployment.spec.strategy.rollingUpdate.maxSurge: 0

由池管理的持久磁盘在 IP 池上声明,而不是在 machine template 上:

apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSIpHostnamePool
metadata:
  name: <global-pool-name>
  namespace: cpaas-system
spec:
  pool:
    - ip: <node-ip>
      hostname: <node-hostname>
      persistentDisk:
        - slot: 0
          quantityGB: 40
          datastoreName: <datastore-name>
          path: /var/cpaas
          format: xfs
          mountOptions:
            - defaults

使用 IP 池状态确认,在滚动替换期间,保留磁盘会从旧 VM 分离并附加到替换 VM。

步骤 2 — 应用更新后的清单

将更新后的清单应用到 global 集群。

kubectl --kubeconfig <global-kubeconfig> apply -f <updated-manifest>

Cluster API provider 会开始使用新镜像替换控制平面和工作节点。当设置 maxSurge: 0 时,在替换节点能够复用相同的固定标识、IP 地址或保留磁盘之前,每个旧节点都会先被排空并删除。

步骤 3 — 监控滚动替换

持续观察滚动替换,直到所有控制平面和工作节点都已被替换。

kubectl --kubeconfig <global-kubeconfig> get machines -A -o wide
kubectl --kubeconfig <global-kubeconfig> get kubeadmcontrolplane -A

当每个 Machine 都报告新的 Kubernetes 版本和 Phase: Running,并且 KubeadmControlPlane 针对新版本报告 Ready: True 时,升级即完成。

验证

滚动替换完成后,验证升级后的 global 集群是否健康。

kubectl --kubeconfig <global-kubeconfig> get nodes -o wide
kubectl --kubeconfig <global-kubeconfig> get clusterversionshadow -o yaml
kubectl --kubeconfig <global-kubeconfig> get pods -n cpaas-system

所有节点都必须报告新的 Kubernetes 版本,ClusterVersionShadow 必须反映目标 Distribution Version,并且核心平台 Pod 必须处于 Running 状态。

回滚注意事项

阶段 2 升级部分完成后的回滚因提供方而异。一般而言:

如果升级尚未替换任何控制平面节点,请将清单回退到之前的镜像并重新应用。如果控制平面节点已经被替换,请先从升级开始前创建的 etcd 备份进行恢复,然后再回退清单。

Huawei DCS
VMware vSphere
Huawei Cloud Stack
Bare Metal

对于使用由池管理的持久磁盘的 DCS 集群,请在回滚前确认磁盘状态:

首先,在删除或重新创建 machine 之前检查 DCSIpHostnamePool.status.persistentDiskStatus。不要删除列在 DCSIpHostnamePool.spec.pool[].persistentDisk 中的保留 DCS volume。

在回退到之前的 machine template 时保持 maxSurge: 0,这样替换就会一次只进行一个节点。如果控制平面已经被替换且集群状态不一致,请先从已验证的 etcd 备份恢复,然后再重新应用之前的清单。

后续步骤

  • 将业务集群升级到相同的 Distribution Version:参见 升级集群
  • 查看随新镜像一起提供的 machine configuration 更改:参见 Machine Configuration