本文档介绍了如何使用 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,请执行以下步骤:
在用户集群配置文件中,如需停用始终开启的 Secret 加密,请将
disabled: true
字段添加到secretsEncryption
部分:secretsEncryption: mode: GeneratedKey generatedKey: keyVersion: KEY_VERSION disabled: true
更新集群:
gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ --config USER_CLUSTER_CONFIG
替换以下内容:
ADMIN_CLUSTER_KUBECONFIG
:管理员集群 kubeconfig 文件的路径USER_CLUSTER_CONFIG
:用户集群配置文件的路径
对特定 DaemonSet 执行滚动更新,如下所示:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ rollout restart statefulsets kube-apiserver \ -n USER_CLUSTER_NAME
以 YAML 格式获取用户集群中所有 Secret 的清单:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ get secrets -A -o yaml > SECRETS_MANIFEST.yaml
为了以明文形式将所有 Secret 存储在 etcd 中,请重新应用用户集群中的所有 Secret:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ apply -f SECRETS_MANIFEST.yaml
您现在可以开始迁移到 Controlplane V2。迁移完成后,您可以在集群上重新启用始终开启的 Secret 加密。
更新用户集群配置文件
对现有用户集群配置文件进行以下更改:
将
enableControlplaneV2
设置为 true。(可选)使 Controlplane V2 用户集群的控制平面具备高可用性 (HA)。要从非高可用性集群更改为高可用性集群,请将
masterNode.replicas
从 1 更改为 3。将用户集群控制平面节点的静态 IP 地址添加到
network.controlPlaneIPBlock.ips
部分。在
network.controlPlaneIPBlock
部分中填写网络掩码和网关。填写
network.hostConfig
部分(如果为空)。如果用户集群使用手动负载均衡,请将
loadBalancer.manualLB.controlPlaneNodePort
和loadBalancer.manualLB.konnectivityServerNodePort
设置为 0,因为在 Controlplane V2 启用时不需要它们。使用控制平面 VIP 的新 IP 地址更新
loadBalancer.vips.controlPlaneVIP
字段。请注意,它必须与控制平面节点 IP 位于同一 VLAN。除非更新集群以进行迁移,否则上述所有字段都是不可变的。请务必仔细检查所有设置。
运行
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
:用户集群配置文件的路径。
该命令将执行以下操作:
创建启用了 ControlPlane V2 的新集群的控制平面。
停止 kubeception 集群的 Kubernetes 控制平面。
截取 kubeception 集群的 etcd 快照。
关闭 kubeception 集群的用户集群控制平面节点。请注意,考虑到故障恢复(即回退到 kubeception 集群),在迁移完成之前,这些节点不会被删除。
使用上述 etcd 快照恢复新控制平面中的集群数据。
将 kubeception 集群的节点池节点连接到新的控制平面,该控制平面可通过新的
controlPlaneVIP
访问。协调已恢复的用户集群,以满足启用了 ControlPlane V2 的集群的最终状态。
备注
在迁移期间,用户集群工作负载不会出现停机时间。
在迁移期间,用户集群控制平面会有一些停机时间。具体而言,从第 2 步到完成第 6 步期间,控制平面不可用。(根据我们的测试,停机时间不超过 7 分钟,但实际时长取决于您的基础设施。)
迁移结束时,kubeception 集群的用户集群控制平面节点会被删除。如果管理员集群的 network.ipMode.type 设置为“static”,您可以通过从管理员集群配置文件中移除一些未使用的静态 IP 来回收这些 IP 地址,然后运行
gkectl update admin
。您可以使用kubectl get nodes -o wide
列出管理员集群节点对象,以查看正在使用的 IP。
迁移后
如果您在迁移之前停用了始终开启的 Secret 加密功能,请执行以下步骤重新启用该功能:
在用户集群配置文件中,将
secretsEncryption.generatedKey.disabled
设置为 false。例如:secretsEncryption: mode: GeneratedKey generatedKey: keyVersion: KEY_VERSION disabled: false
更新用户集群:
gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ --config USER_CLUSTER_CONFIG