将管理员集群迁移到高可用性集群

本文档介绍如何从非高可用性管理员集群迁移到高可用性 (HA) 管理员集群。

1.29:预览版
1.28:不可用
1.16:不可用

高可用性管理员集群有三个控制平面节点,但没有插件节点。非高可用性管理员集群有一个控制平面节点和两个插件节点。

过程概览

以下是迁移中涉及的主要步骤:

  1. 修改管理员集群配置文件。

  2. 运行 gkectl update admin。此命令执行以下操作:

    • 启动外部集群 (Kind) 并确保当前的非高可用性管理员集群处于正常运行状态。

    • 使用高可用性规范和新的控制平面 VIP 创建新的管理员集群控制平面。

    • 停用现有的管理员集群控制平面。

    • 截取现有管理员集群的 etcd 快照。

    • 在新的高可用性控制平面中恢复旧的管理员集群数据。

    • 协调恢复的管理员集群,以满足高可用性管理员集群的最终状态。

Notes

  • 在迁移期间,用户集群工作负载不会停机。

  • 在迁移期间,管理员集群控制平面会停机。(根据我们的测试,停机时间不到 18 分钟,但实际时长取决于各个基础架构环境。)

  • 从非高可用性到高可用性的迁移仍然需要满足对高可用性管理员集群的要求。也就是说,如果您将 Seesaw 负载均衡器用于非高可用性管理员集群,则必须先迁移到 MetalLB,然后再迁移到高可用性管理员集群。这是因为高可用性管理员集群不支持 Seesaw。

  • 迁移成功完成后,我们会出于进行故障恢复而有意保留的剩余资源(例如非高可用性管理员主虚拟机)。如果需要,您可以手动清理它们。

迁移前后

以下是集群迁移前后的主要区别:

迁移前迁移后
控制平面节点副本13
插件节点20
控制平面 Pod 副本
(kube-apiserver、kube-etcd 等)
13
数据磁盘大小100GB * 125GB * 3
数据磁盘路径 由管理员集群配置文件中的 vCenter.dataDisk 设置 在目录 /anthos/[ADMIN_CLUSTER_NAME]/default/[MACHINE_NAME]-data.vmdk 下自动生成
用于控制平面 VIP 的负载平衡器 由管理员集群配置文件中的 loadBalancer.kind 设置 keepalived + haproxy
为管理员集群控制平面节点分配 IP 地址 DHCP 或静态方式,具体取决于 network.ipMode.type 3 个静态 IP 地址
kubeception 用户集群控制平面节点分配 IP 地址 DHCP 或静态方式,具体取决于 network.ipMode.type DHCP 或静态方式,具体取决于 network.ipMode.type
检查点文件默认处于启用状态未被使用

修改管理员集群配置文件

您需要指定另外四个 IP 地址:

  • 管理员集群的控制平面节点的三个 IP 地址
  • 用于管理员集群负载均衡器的新控制平面 VIP

您还需要更改管理员集群配置文件中的一些其他字段。

指定 IP 地址

  1. 在管理员集群配置文件中,填写 network.controlPlaneIPBlock 部分。例如:

    controlPlaneIPBlock:
     netmask: "255.255.255.0"
     gateway: "172.16.20.1"
     ips:
     – ip: "172.16.20.50"
       hostname: "admin-cp-node-1"
     – ip: "172.16.20.51"
       hostname: "admin-cp-node-2"
     – ip: "172.16.20.52"
       hostname: "admin-cp-node-3"
    
  2. 填写 hostconfig 部分。如果您的管理员集群使用静态 IP 地址,则此部分已填写。例如:

    hostConfig:
     dnsServers:
     – 203.0.113.1
     – 198.51.100.1
     ntpServers:
     – 216.239.35.12
    
  3. loadBalancer.vips.controlPlaneVIP 的值替换为新的 VIP。例如:

    loadBalancer:
     vips:
       controlPlaneVIP: "172.16.20.59"
    

更新其他配置字段

  1. adminMaster.replicas 设置为 3

    adminMaster:
     replicas: 3
     cpus: 4
     memoryMB: 8192
    
  2. 移除 vCenter.dataDisk 字段。这是因为对于高可用性管理员集群,控制平面节点使用的三个数据磁盘的路径将在数据存储区中的根目录 anthos 下自动生成。

  3. 如果 loadBalancer.manualLB.controlPlaneNodePort 具有非零值,请将其设置为 0

调整手动负载均衡器配置

如果您的管理员集群使用手动负载均衡,请执行本部分中的步骤。 否则,请跳过此部分。

对于您在 network.controlPlaneIPBlock 部分中指定的三个新控制平面节点 IP 地址,每个地址均在负载均衡器中配置以下映射:

(旧 controlPlaneVIP:443)-> (NEW_NODE_IP_ADDRESS:旧 controlPlaneNodePort)

这样,旧控制平面 VIP 便可以在迁移期间正常运行。

更新管理员集群

  1. 开始迁移:

    gkectl update admin --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config ADMIN_CLUSTER_CONFIG
    

    请替换以下内容:

    • ADMIN_CLUSTER_KUBECONFIG:管理员集群 kubeconfig 文件的路径。

    • ADMIN_CLUSTER_CONFIG:管理员集群配置文件的路径

  2. 该命令会显示迁移进度。

    出现提示时,输入 Y 以继续。

  3. 迁移完成后,管理员集群 kubeconfig 文件会自动更新以使用新的控制平面 VIP。同时,旧的控制平面 VIP 仍可正常运行,并且可用于访问新的高可用性管理员集群。

根据需要手动清理剩余资源

在迁移期间,gkectl 不会删除管理员集群控制平面虚拟机。只会关闭虚拟机,而不是从 vSphere 中删除。如果要在成功迁移后删除旧的控制平面虚拟机,则必须手动进行删除。

如需手动删除旧的控制平面虚拟机和相关资源,请执行以下操作:

  1. 确保非高可用性管理员主虚拟机 gke-admin-master-xxx 已关停。
  2. 从 vSphere 删除非高可用性管理员主虚拟机 gke-admin-master-xxx
  3. 从 vSphere 中删除非高可用性管理员主虚拟机模板 gke-admin-master-xxx-tmpl
  4. 删除非 HA 管理员数据磁盘和管理员检查点文件。
  5. 清理保存在 /home/ubuntu/admin-ha-migration/[ADMIN_CLUSTER_NAME]/ 中的临时文件。

如果首选使用 cli,请参考以下 govc 命令:

  // Configure govc credentials
  export GOVC_INSECURE=1
  export GOVC_URL=VCENTER_URL
  export GOVC_DATACENTER=DATACENTER
  export GOVC_DATASTORE=DATASTORE
  export GOVC_USERNAME=USERNAME
  export GOVC_PASSWORD=PASSWORD

  // Configure admin master VM name (you can find the master VM name from the "[HA Migration]" logs)
  export ADMIN_MASTER_VM=ADMIN_MASTER_VM_NAME

  // Configure datadisk path (remove ".vmdk" suffix)
  export DATA_DISK_PATH=DATADISK_PATH_WITHOUT_VMDK

  // Check whether admin master is in "poweredOff" state:
  govc vm.info $ADMIN_MASTER_VM | grep Power

  // Delete admin master VM
  govc vm.destroy $ADMIN_MASTER_VM

  // Delete admin master VM template
  govc vm.destroy "$ADMIN_MASTER_VM"-tmpl

  // Delete data disk
  govc datastore.ls $DATA_DISK_PATH
  govc datastore.rm $DATA_DISK_PATH

  // Delete admin checkpoint file
  govc datastore.ls "$DATA_DISK_PATH"-checkpoint.yaml
  govc datastore.rm "$DATA_DISK_PATH"-checkpoint.yaml