将用户集群迁移到 Controlplane V2

本文档介绍了如何使用 kubeception 将 1.29 版用户集群迁移到 Controlplane V2。如果您的集群为 1.30 版或更高版本,我们建议您按照规划将集群迁移到推荐功能中的说明操作。

1.29:预览版
1.28:不可用

关于用户集群控制平面

在 Google Distributed Cloud 1.13 版之前,用户集群的控制平面在管理员集群中的一个或多个节点上运行。这种控制平面称为 kubeception。在 1.13 版中,我们为新用户集群引入了 Controlplane V2。启用 Controlplane V2 后,用户集群的控制平面在用户集群本身中运行。

Controlplane V2 的优势包括:

  • 故障隔离。管理员集群故障不会影响用户集群。

  • 运维分离。管理员集群升级不会导致用户集群停机。

  • 部署分离。您可以将管理员集群和用户集群放在不同的故障域或地理站点中。例如,边缘位置中的用户集群可能与管理员集群位于不同的地理站点。

要求

如需将用户集群迁移到 Controlplane V2,用户集群必须满足以下要求:

  • 用户集群必须为 1.29 版或更高版本。管理员集群和节点池可以比用户集群低一个或两个次要版本。如果需要,请升级集群

  • 用户集群必须启用 Dataplane V2。此字段不可变,因此如果集群未启用 Dataplane V2,您无法将其迁移到 Controlplane V2。

  • 用户集群必须配置为使用 MetalLB 或手动负载均衡器。如果用户集群使用 SeeSaw 负载均衡器,您可以将其迁移到 MetalLB

  • 查看 IP 地址规划文档,并确保您有足够的 IP 地址可供用户集群的控制平面节点使用。控制平面节点需要静态 IP 地址,您将需要为新的控制平面虚拟 IP (VIP) 提供一个额外的 IP 地址。

迁移准备工作

如果您在用户集群上启用了始终开启的 Secret 加密,则必须先执行停用始终开启的 Secret 加密并解密 Secret 中的步骤,然后才能开始迁移。否则,新的 Controlplane V2 集群将无法解密 Secret。

在开始迁移之前,请运行以下命令,看看是否曾在某个时间点启用过始终开启的 Secret 加密:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
  get onpremusercluster USER_CLUSTER_NAME \
  -n USER_CLUSTER_NAME-gke-onprem-mgmt \
  -o jsonpath={.spec.secretsEncryption}

如果上述命令的输出为空,则表示始终开启的 Secret 加密从未启用。您可以开始迁移。

如果上述命令的输出不为空,则表示始终开启的 Secret 加密之前已启用。在迁移之前,您必须执行下一部分中的步骤,以确保新的 ControlPlane V2 集群可以解密 Secret。

以下示例显示了非空输出:

{"generatedKeyVersions":{"keyVersions":[1]}}

停用始终开启的 Secret 加密,在需要时解密 Secret

如需停用始终开启的 Secret 加密并解密 Secret,请执行以下步骤:

  1. 在用户集群配置文件中,如需停用始终开启的 Secret 加密,请将 disabled: true 字段添加到 secretsEncryption 部分:

    secretsEncryption:
        mode: GeneratedKey
        generatedKey:
            keyVersion: KEY_VERSION
            disabled: true
    
  2. 更新集群:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
        --config USER_CLUSTER_CONFIG
    

    替换以下内容:

    • ADMIN_CLUSTER_KUBECONFIG:管理员集群 kubeconfig 文件的路径
    • USER_CLUSTER_CONFIG:用户集群配置文件的路径
  3. 对特定 DaemonSet 执行滚动更新,如下所示:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      rollout restart statefulsets kube-apiserver \
      -n USER_CLUSTER_NAME
  4. 以 YAML 格式获取用户集群中所有 Secret 的清单:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
      get secrets -A -o yaml > SECRETS_MANIFEST.yaml
  5. 为了以明文形式将所有 Secret 存储在 etcd 中,请重新应用用户集群中的所有 Secret:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
      apply -f SECRETS_MANIFEST.yaml

    您现在可以开始迁移到 Controlplane V2。迁移完成后,您可以在集群上重新启用始终开启的 Secret 加密

更新用户集群配置文件

对现有用户集群配置文件进行以下更改:

  1. enableControlplaneV2 设置为 true。

  2. (可选)使 Controlplane V2 用户集群的控制平面具备高可用性 (HA)。要从非高可用性集群更改为高可用性集群,请将 masterNode.replicas 从 1 更改为 3。

  3. 将用户集群控制平面节点的静态 IP 地址添加到 network.controlPlaneIPBlock.ips 部分。

  4. network.controlPlaneIPBlock 部分中填写网络掩码和网关。

  5. 填写 network.hostConfig 部分(如果为空)。

  6. 如果用户集群使用手动负载均衡,请按照下一部分中所述配置负载均衡器。

  7. 如果用户集群使用手动负载均衡,请将 loadBalancer.manualLB.controlPlaneNodePortloadBalancer.manualLB.konnectivityServerNodePort 设置为 0,因为在 Controlplane V2 启用时不需要它们。

  8. 使用控制平面 VIP 的新 IP 地址更新 loadBalancer.vips.controlPlaneVIP 字段。请注意,它必须与控制平面节点 IP 位于同一 VLAN。

  9. 除非更新集群以进行迁移,否则上述所有字段都是不可变的。请务必仔细检查所有设置。

  10. 运行 gkectl diagnose cluster,并解决该命令发现的任何问题。

    gkectl diagnose cluster --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
          --cluster-name=USER_CLUSTER_NAME

    请替换以下内容:

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

    • USER_CLUSTER_NAME:用户集群的名称。

调整手动负载均衡器配置

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

与为 CPv2 用户集群配置负载均衡器类似,对于您在 network.controlPlaneIPBlock 部分中指定的三个新控制平面节点 IP 地址中的每一个,请在负载均衡器中配置映射:

  • (ingressVIP:80) -> (NEW_NODE_IP_ADDRESS:ingressHTTPNodePort)
  • (ingressVIP:443) -> (NEW_NODE_IP_ADDRESS:ingressHTTPNodePort)

更新集群

运行以下命令,将集群迁移到 ControlPlane V2:

gkectl update cluster \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --config USER_CLUSTER_CONFIG

请替换以下内容:

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

  • USER_CLUSTER_CONFIG:用户集群配置文件的路径。

该命令将执行以下操作:

  1. 创建启用了 ControlPlane V2 的新集群的控制平面。

  2. 停止 kubeception 集群的 Kubernetes 控制平面。

  3. 截取 kubeception 集群的 etcd 快照。

  4. 关闭 kubeception 集群的用户集群控制平面节点。请注意,考虑到故障恢复(即回退到 kubeception 集群),在迁移完成之前,这些节点不会被删除。

  5. 使用上述 etcd 快照恢复新控制平面中的集群数据。

  6. 将 kubeception 集群的节点池节点连接到新的控制平面,该控制平面可通过新的 controlPlaneVIP 访问。

  7. 协调已恢复的用户集群,以满足启用了 ControlPlane V2 的集群的最终状态。

备注

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

  • 在迁移期间,用户集群控制平面会有一些停机时间。具体而言,从第 2 步到完成第 6 步期间,控制平面不可用。(根据我们的测试,停机时间不超过 7 分钟,但实际时长取决于您的基础设施。)

  • 迁移结束时,kubeception 集群的用户集群控制平面节点会被删除。如果管理员集群的 network.ipMode.type 设置为“static”,您可以通过从管理员集群配置文件中移除一些未使用的静态 IP 来回收这些 IP 地址,然后运行 gkectl update admin。您可以使用 kubectl get nodes -o wide 列出管理员集群节点对象,以查看正在使用的 IP。

迁移后

如果您在迁移之前停用了始终开启的 Secret 加密功能,请执行以下步骤重新启用该功能:

  1. 在用户集群配置文件中,将 secretsEncryption.generatedKey.disabled 设置为 false。例如:

    secretsEncryption:
        mode: GeneratedKey
        generatedKey:
            keyVersion: KEY_VERSION
            disabled: false
    
  2. 更新用户集群:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
        --config USER_CLUSTER_CONFIG