本文档介绍了如何将 vSphere 数据存储区迁移到基于存储政策的管理 (SPBM)。
本页面适用于配置和管理存储性能、用量和费用的存储专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
1.30:正式版 
1.29:预览版 
1.16 及更早版本:不可用
上下文
您可以在集群配置文件中的以下四个位置指定数据存储区:
- 管理员集群:vCenter.datastore 
- 集群级用户集群,其中包含控制平面节点和所有工作器节点池:vCenter.datastore 
- 用户集群控制平面节点:masterNode.vsphere.datastore 
- 用户集群工作器节点池:nodePools[i].vsphere.datastore 
这些字段的继承关系如下:
adminCluster.vCenter.datastore ->
  userCluster.vCenter.datastore ->
    (userCluster.masterNode.vsphere.datastore and userCluster.nodePools[i].vsphere.datastore)
示例:
- 如果 - userCluster.vCenter.datastore为空,则会从- adminCluster.vCenter.datastore继承值。
- 如果 - userCluster.nodePools[i].vsphere.datastore为空,则会从- userCluster.vCenter.datastore继承值。
同样,您可以在以下四个位置指定存储政策:
- 集群级用户集群,其中包含控制平面节点和所有工作器节点池:vCenter.storagePolicyName 
- 用户集群控制平面节点:masterNode.vsphere.storagePolicyName 
- 用户集群工作器节点池:nodePools[i].vsphere.storagePolicyName 
storagePolicyName 字段的继承关系与 datastore 字段相同。
准备工作
- 此过程是单向迁移。我们不支持迁移回之前的状态。
- 数据存储区必须与您将要设置的新存储政策兼容。
- 仅支持高可用性 (HA) 管理员集群。如果您的管理员集群是非 HA 集群,您必须先将管理员集群迁移到 HA 集群。
迁移用户集群
您用于迁移的步骤取决于您是想迁移整个用户集群,还是想单独迁移控制平面节点和工作器节点池。使用此选项,您可以为控制平面节点和工作器节点池选择不同的存储政策。
为帮助您规划维护窗口,请注意以下事项:
- 迁移整个集群只需更新一次集群。 
- 单独迁移控制平面节点和工作器节点池需要进行两次集群更新。 
整个集群
如果您想迁移整个集群(包括所有控制平面节点和工作器节点池),请按照以下步骤操作。用户集群版本必须为 1.30 或更高版本。
- 修改用户集群配置文件,如下所示: - 使用存储政策的名称设置 - vCenter.storagePolicyName字段。
- 如果指定了以下各项,请将其移除或注释掉: - vCenter.datastore字段
- masterNode.vsphere部分
- nodepools[i].vsphere.datastore
- nodepools[i].vsphere.storagePolicyName
 
 - 以下示例配置展示了这些更改。 - 更改前: - vCenter: datastore: ds-1- 更改后: - vCenter: storagePolicyName: sp-1 # datastore: ds-1
- 更新用户集群: - gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ --config USER_CLUSTER_CONFIG - 替换以下内容: - ADMIN_CLUSTER_KUBECONFIG:管理员集群 kubeconfig 文件的路径
- USER_CLUSTER_CONFIG:用户集群配置文件的路径
 
更新捆绑的 StorageClass
更新集群中的配置设置后,您需要更新捆绑的 StorageClass。
- 获取捆绑的 - vsphere-csi-driver的当前默认- StorageClass(名为- standard-rwo),并将其保存到名为- storage-class.yaml的本地文件中。- kubectl get storageclass standard-rwo -oyaml \ --kubeconfig USER_CLUSTER_KUBECONFIG > storage-class.yaml- 将 - USER_CLUSTER_KUBECONFIG替换为用户集群 kubeconfig 文件的路径。
- 为保险起见,请复制 - storage-class.yaml,因为您需要对该文件进行更改:- cp storage-class.yaml storage-class.yaml-backup.yaml 
- 从集群中删除默认 - StorageClass:- kubectl delete storageclass standard-rwo \ --kubeconfig USER_CLUSTER_KUBECONFIG
- 按如下所示更新 - storage-class.yaml中的配置:- 删除或注释掉以下字段: - parameters.datastoreURL
- resourceVersion
 
- 添加 - parameters.storagePolicyName字段,并将其设置为存储政策的名称。
 - 以下示例配置展示了这些更改。 - 更改前: - apiVersion: storage.k8s.io/v1 kind: StorageClass name: standard-rwo Parameters: ... datastoreURL: ds//ds-1- 更改后: - apiVersion: storage.k8s.io/v1 kind: StorageClass name: standard-rwo Parameters: ... storagePolicyName: sp-1
- 将修改后的 - StorageClass应用到用户集群:- kubectl apply -f storage-class.yaml \ --kubeconfig USER_CLUSTER_KUBECONFIG
仅限 Kubeception 用户集群
对于 kubeception 用户集群,您需要更新管理员集群中用户集群控制平面节点的 StorageClass。Kubeception 集群的配置字段 enableControlplaneV2 设置为 false。启用 Controlplane V2 后,用户集群的控制平面在用户集群本身中运行。如果未启用 Controlplane V2,则用户集群的控制平面会在管理员集群中运行,称为 kubeception。
运行以下命令,确定集群是否已启用 ControlPlane V2:
kubectl get onpremuserclusters --kubeconfig USER_CLUSTER_KUBECONFIG \
  -n kube-system -o jsonpath='{.items[0].spec.enableControlplaneV2}' && echo
如果输出为 false,请完成以下步骤,以更新管理员集群中用户集群控制平面节点的默认 StorageClass:
- 获取捆绑的 - vsphere-csi-driver的当前默认- StorageClass(名为- USER_CLUSTER_NAME-csi),并将其保存到名为- storage-class-kubeception.yaml的本地文件中。- kubectl get storageclass USER_CLUSTER_NAME-csi -oyaml \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG > storage-class-kubeception.yaml- 将 - ADMIN_CLUSTER_KUBECONFIG替换为管理员集群 kubeconfig 的路径。
- 为保险起见,请复制 - storage-class-kubeception.yaml,因为您需要对该文件进行更改:- cp storage-class-kubeception.yaml storage-class-kubeception-backup.yaml 
- 从集群中删除默认 - StorageClass:- kubectl delete storageclass USER_CLUSTER_NAME-csi \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
- 按如下所示更新 - storage-class-kubeception.yaml中的配置:- 删除或注释掉以下字段: - parameters.datastoreURL
- resourceVersion
 
- 添加 - parameters.storagePolicyName字段,并将其设置为存储政策的名称。
 - 以下示例配置展示了这些更改。 - 更改前: - apiVersion: storage.k8s.io/v1 kind: StorageClass name: standard-rwo Parameters: ... datastoreURL: ds//ds-1- 更改后: - apiVersion: storage.k8s.io/v1 kind: StorageClass name: standard-rwo Parameters: ... storagePolicyName: sp-1
- 将修改后的 - StorageClass应用于管理员集群:- kubectl apply -f storage-class-kubeception.yaml \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
迁移后
如果您在迁移后创建新的节点池,则新节点池会根据更新后的集群遵循继承规则。
例如,假设您已将 vCenter.datastore 迁移到存储政策。
现在,如果您创建新的节点池并将 nodePools[i].vsphere.datastore 和 nodePools[i].vsphere.storagePolicyName 都留空,则新节点池会继承 vCenter.storagePolicyName 中指定的存储政策。
单独迁移节点
如果您想单独迁移控制平面节点和工作器节点池,请按照以下步骤操作。
- 仅限版本 1.29:获取当前集群配置。如果用户集群的版本为 1.30 或更高版本,则无需执行此步骤。 - gkectl get-config cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ --cluster-name USER_CLUSTER_NAME \ --output-dir ./gen-files - 替换以下内容: - ADMIN_CLUSTER_KUBECONFIG:管理员集群的 kubeconfig 文件的路径。
- USER_CLUSTER_NAME:用户集群的名称。
 - 在 - ./gen-files中,找到- user-cluster.yaml。- 如需详细了解如何获取配置文件,请参阅从集群生成配置文件。 - 生成的配置文件在每个级别(集群, - masterNode[对于控制平面节点] 和- nodepools[对于工作器节点])都设置了- datastore名称,如以下示例所示:- apiVersion: v1 kind: UserCluster ... # VCenter config in cluster level: vCenter: datastore: ds-1 ... # VCenter config in master node level: masterNode: vsphere: datastore: ds-1 ... # VCenter config in nodepool level: nodepools: - name: pool-1 vsphere: datastore: ds-1 - name: pool-2 vsphere: datastore: ds-1
迁移控制平面节点
如需迁移控制平面节点,请执行以下步骤:
- 在用户集群配置文件中进行以下更改: - 使用存储政策的名称设置 masterNode.vsphere.storagePolicyName字段。
- 删除或注释掉 masterNode.vsphere.datastore字段。
 - 以下示例配置展示了这些更改。 - 更改前: - masterNode: vsphere: datastore: ds-1- 更改后: - masterNode: vsphere: # datastore: ds-1 storagePolicyName: sp-1
- 使用存储政策的名称设置 
- 更新用户集群: - gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ --config USER_CLUSTER_CONFIG - 替换以下内容: - ADMIN_CLUSTER_KUBECONFIG:管理员集群 kubeconfig 文件的路径
- USER_CLUSTER_CONFIG:用户集群配置文件的路径
 - 等待更新命令完成后,然后再更新节点池。 
迁移节点池
如需迁移所有节点池,请执行以下步骤:
- 在用户集群配置文件中进行以下更改: - 使用存储政策的名称设置每个 nodePools[i].vsphere.storagePolicyName字段。
- 删除或注释掉每个 nodePools[i].vsphere.datastore字段。
 - 以下示例配置展示了这些更改。 - 更改前: - nodepools: - name: pool-1 vsphere: datastore: ds-1 - name: pool-2 vsphere: datastore: ds-1- 更改后: - nodepools: - name: pool-1 vsphere: # datastore: ds-1 storagePolicyName: sp-1 - name: pool-2 vsphere: # datastore: ds-1 storagePolicyName: sp-1
- 使用存储政策的名称设置每个 
- 更新用户集群: - gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ --config USER_CLUSTER_CONFIG 
(可选)在集群级别更新存储政策
对于用户集群,集群级 vCenter 部分中的 datastore 和 storagePolicyName 字段是 masterNode 和 nodepools 部分使用的默认值。完成上述步骤后,集群级 vCenter datastore 和 storagePolicyName 设置不会被任何集群组件使用。您可以将集群级 vCenter 部分保留为原样,也可以更新该部分以与 masterNode 和 nodepools 保持一致。
如果您将该设置保留为原样,我们建议您在集群级 vCenter 部分上方添加注释,说明此设置会被忽略,因为它会被 masterNode 和 nodepools 部分中的设置替换。
如果您需要,可以更改集群级 vCenter 部分以匹配 masterNode 和 nodepools 部分,并按照以下步骤更新集群:
- 修改用户集群配置文件,如下所示: - 使用存储政策的名称设置 vCenter.storagePolicyName字段。
- 移除或注释掉 vCenter.datastore字段。
 
- 使用存储政策的名称设置 
- 更新用户集群: - gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ --config USER_CLUSTER_CONFIG - 此更新命令不会对集群进行任何更改,但会更新服务器端 ( - OnPremUserCluster) 的- vCenter.datastore和- vCenter.storagePolicyName字段。
更新捆绑的 StorageClass
更新配置设置后,您需要更新捆绑的 StorageClass。
- 获取捆绑的 - vsphere-csi-driver的当前默认- StorageClass(名为- standard-rwo),并将其保存到名为- storage-class.yaml的本地文件中。- kubectl get storageclass standard-rwo -oyaml \ --kubeconfig USER_CLUSTER_KUBECONFIG > storage-class.yaml- 将 - USER_CLUSTER_KUBECONFIG替换为用户集群 kubeconfig 文件的路径。
- 为保险起见,请复制 - storage-class.yaml,因为您需要对该文件进行更改:- cp storage-class.yaml storage-class.yaml-backup.yaml 
- 从集群中删除默认 - StorageClass:- kubectl delete storageclass standard-rwo \ --kubeconfig USER_CLUSTER_KUBECONFIG
- 按如下所示更新 - storage-class.yaml中的配置:- 删除或注释掉以下字段: - parameters.datastoreURL
- resourceVersion
 
- 添加 - parameters.storagePolicyName字段,并将其设置为存储政策的名称。
 - 以下示例配置展示了这些更改。 - 更改前: - apiVersion: storage.k8s.io/v1 kind: StorageClass name: standard-rwo Parameters: ... datastoreURL: ds//ds-1- 更改后: - apiVersion: storage.k8s.io/v1 kind: StorageClass name: standard-rwo Parameters: ... storagePolicyName: sp-1
- 将修改后的 - StorageClass应用到用户集群:- kubectl apply -f storage-class.yaml \ --kubeconfig USER_CLUSTER_KUBECONFIG
仅限 Kubeception 用户集群
对于 kubeception 用户集群,您需要更新管理员集群中用户集群控制平面节点的 StorageClass。Kubeception 集群的配置字段 enableControlplaneV2 设置为 false。启用 Controlplane V2 后,用户集群的控制平面在用户集群本身中运行。如果未启用 Controlplane V2,则用户集群的控制平面会在管理员集群中运行,称为 kubeception。
运行以下命令,确定集群是否已启用 ControlPlane V2:
kubectl get onpremuserclusters --kubeconfig USER_CLUSTER_KUBECONFIG \
  -n kube-system -o jsonpath='{.items[0].spec.enableControlplaneV2}' && echo
如果输出为 false,请完成以下步骤,以更新管理员集群中用户集群控制平面节点的默认 StorageClass:
- 获取捆绑的 - vsphere-csi-driver的当前默认- StorageClass(名为- USER_CLUSTER_NAME-csi),并将其保存到名为- storage-class-kubeception.yaml的本地文件中。- kubectl get storageclass USER_CLUSTER_NAME-csi -oyaml \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG > storage-class-kubeception.yaml- 将 - ADMIN_CLUSTER_KUBECONFIG替换为管理员集群 kubeconfig 的路径。
- 为保险起见,请复制 - storage-class-kubeception.yaml,因为您需要对该文件进行更改:- cp storage-class-kubeception.yaml storage-class-kubeception-backup.yaml 
- 从集群中删除默认 - StorageClass:- kubectl delete storageclass USER_CLUSTER_NAME-csi \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
- 按如下所示更新 - storage-class-kubeception.yaml中的配置:- 删除或注释掉以下字段: - parameters.datastoreURL
- resourceVersion
 
- 添加 - parameters.storagePolicyName字段,并将其设置为存储政策的名称。
 - 以下示例配置展示了这些更改。 - 更改前: - apiVersion: storage.k8s.io/v1 kind: StorageClass name: standard-rwo Parameters: ... datastoreURL: ds//ds-1- 更改后: - apiVersion: storage.k8s.io/v1 kind: StorageClass name: standard-rwo Parameters: ... storagePolicyName: sp-1
- 将修改后的 - StorageClass应用于管理员集群:- kubectl apply -f storage-class-kubeception.yaml \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
迁移管理员集群
确保管理员集群也已使用存储政策名称进行更新。
- 在管理员集群配置文件中进行以下更改: - 移除或注释掉 vCenter.datastore字段。
- 使用存储政策的名称设置 vCenter.storagePolicyName字段。
 
- 移除或注释掉 
- 更新管理员集群: - gkectl update admin --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ --config ADMIN_CLUSTER_CONFIG - 替换以下内容: - ADMIN_CLUSTER_KUBECONFIG:管理员集群 kubeconfig 文件的路径。
- ADMIN_CLUSTER_CONFIG:管理员集群配置文件的路径。
 
使用 SPBM 进行存储迁移
完成数据存储区到 SPBM 的迁移后,您的集群现在将使用 SPBM。但迁移不会将任何存储工作负载(例如机器数据磁盘或容器卷)从旧数据存储区迁出。
如需迁移存储工作负载,请参阅通过基于存储政策的管理进行存储迁移。