将数据存储区迁移到 SPBM

本文档介绍了如何将 vSphere 数据存储区迁移到基于存储政策的管理 (SPBM)。

本页面适用于配置和管理存储性能、用量和费用的存储专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务

1.30:正式版
1.29:预览版
1.16 及更低版本:不可用

上下文

在集群配置文件中,您可以在以下四个位置指定数据存储区:

这些字段的继承关系如下所示:

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 继承值。

同样,您可以在以下四个位置指定存储政策:

storagePolicyName 字段的继承关系与 datastore 字段相同。

准备工作

  • 此过程是单向迁移。我们不支持迁移回之前的状态。
  • 数据存储区必须与您要设置的新存储政策兼容。
  • 仅支持高可用性 (HA) 管理员集群。如果您的管理员集群是非 HA 集群,您必须先将管理员集群迁移到 HA 集群

迁移用户集群

您用于迁移的步骤取决于您是想迁移整个用户集群,还是想单独迁移控制平面节点和工作器节点池。使用此选项,您可以为控制平面节点和工作器节点池选择不同的存储政策。

为帮助您规划维护窗口,请注意以下事项:

  • 迁移整个集群只需要进行一次集群更新。

  • 单独迁移控制平面节点和工作器节点池需要进行两次集群更新。

整个集群

如果您想迁移整个集群(包括所有控制平面节点和工作器节点池),请按照以下步骤操作。用户集群版本必须为 1.30 或更高版本。

  1. 修改用户集群配置文件,如下所示:

    1. 使用存储政策的名称设置 vCenter.storagePolicyName 字段。

    2. 如果指定了以下各项,请将其移除或注释掉:

      • vCenter.datastore 字段
      • masterNode.vsphere 部分
      • nodepools[i].vsphere.datastore
      • nodepools[i].vsphere.storagePolicyName

    以下示例配置展示了这些更改。

    更改前:

    vCenter:
      datastore: ds-1
    

    更改后:

    vCenter:
      storagePolicyName: sp-1
      # datastore: ds-1
    
  2. 更新用户集群:

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

    替换以下内容:

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

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

更新捆绑的 StorageClass

更新集群中的配置设置后,您需要更新捆绑的 StorageClass

  1. 获取捆绑的 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 文件的路径。

  2. 为保险起见,请复制 storage-class.yaml,因为您需要对该文件进行更改:

    cp storage-class.yaml storage-class.yaml-backup.yaml
    
  3. 从集群中删除默认的 StorageClass

    kubectl delete storageclass standard-rwo \
        --kubeconfig USER_CLUSTER_KUBECONFIG
    
  4. 更新 storage-class.yaml 中的配置,如下所示:

    1. 删除或注释掉以下字段:

      • parameters.datastoreURL
      • resourceVersion
    2. 添加 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
    
  5. 将修改后的 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

  1. 获取捆绑的 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 的路径。

  2. 为保险起见,请复制 storage-class-kubeception.yaml,因为您需要对该文件进行更改:

    cp storage-class-kubeception.yaml storage-class-kubeception-backup.yaml
    
  3. 从集群中删除默认的 StorageClass

    kubectl delete storageclass USER_CLUSTER_NAME-csi \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    
  4. 更新 storage-class-kubeception.yaml 中的配置,如下所示:

    1. 删除或注释掉以下字段:

      • parameters.datastoreURL
      • resourceVersion
    2. 添加 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
    
  5. 将修改后的 StorageClass 应用于管理员集群:

    kubectl apply -f storage-class-kubeception.yaml \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

迁移后

如果您在迁移后创建新节点池,则新池会根据更新后的集群遵循继承规则。

例如,假设您已将 vCenter.datastore 迁移到存储政策。

现在,如果您创建新的节点池并将 nodePools[i].vsphere.datastorenodePools[i].vsphere.storagePolicyName 都留空,则新节点池会继承 vCenter.storagePolicyName 中指定的存储政策。

单独迁移节点

如果您想单独迁移控制平面节点和工作器节点池,请按照以下步骤操作。

  1. 仅限 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
    

迁移控制平面节点

如需迁移控制平面节点,请执行以下步骤:

  1. 在用户集群配置文件中进行以下更改:

    • 使用存储政策的名称设置 masterNode.vsphere.storagePolicyName 字段。
    • 删除或注释掉 masterNode.vsphere.datastore 字段。

    以下示例配置展示了这些更改。

    更改前:

    masterNode:
      vsphere:
        datastore: ds-1
    

    更改后:

    masterNode:
      vsphere:
        # datastore: ds-1
        storagePolicyName: sp-1
    
  2. 更新用户集群:

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

    替换以下内容:

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

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

    等待更新命令完成后,然后再更新节点池。

迁移节点池

如需迁移所有节点池,请执行以下步骤:

  1. 在用户集群配置文件中进行以下更改:

    • 使用存储政策的名称设置每个 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
    
  2. 更新用户集群:

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

(可选)在集群级别更新存储政策

对于用户集群,集群级 vCenter 部分中的 datastorestoragePolicyName 字段是 masterNodenodepools 部分使用的默认值。完成上述步骤后,集群级 vCenter datastorestoragePolicyName 设置不会被任何集群组件使用。您可以将集群级 vCenter 部分保留为原样,也可以更新该部分以与 masterNodenodepools 保持一致。

如果您将该设置保留为原样,我们建议您在集群级 vCenter 部分上方添加注释,说明此设置会被忽略,因为它会被 masterNodenodepools 部分中的设置替换。

如果您需要,可以更改集群级 vCenter 部分以匹配 masterNodenodepools 部分,并按照以下步骤更新集群:

  1. 修改用户集群配置文件,如下所示:

    • 使用存储政策的名称设置 vCenter.storagePolicyName 字段。
    • 移除或注释掉 vCenter.datastore 字段。
  2. 更新用户集群:

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

    此更新命令不会对集群进行任何更改,但会更新服务器端 (OnPremUserCluster) vCenter.datastorevCenter.storagePolicyName 字段。

更新捆绑的 StorageClass

更新配置设置后,您需要更新捆绑的 StorageClass

  1. 获取捆绑的 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 文件的路径。

  2. 为保险起见,请复制 storage-class.yaml,因为您需要对该文件进行更改:

    cp storage-class.yaml storage-class.yaml-backup.yaml
    
  3. 从集群中删除默认的 StorageClass

    kubectl delete storageclass standard-rwo \
        --kubeconfig USER_CLUSTER_KUBECONFIG
    
  4. 更新 storage-class.yaml 中的配置,如下所示:

    1. 删除或注释掉以下字段:

      • parameters.datastoreURL
      • resourceVersion
    2. 添加 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
    
  5. 将修改后的 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

  1. 获取捆绑的 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 的路径。

  2. 为保险起见,请复制 storage-class-kubeception.yaml,因为您需要对该文件进行更改:

    cp storage-class-kubeception.yaml storage-class-kubeception-backup.yaml
    
  3. 从集群中删除默认的 StorageClass

    kubectl delete storageclass USER_CLUSTER_NAME-csi \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    
  4. 更新 storage-class-kubeception.yaml 中的配置,如下所示:

    1. 删除或注释掉以下字段:

      • parameters.datastoreURL
      • resourceVersion
    2. 添加 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
    
  5. 将修改后的 StorageClass 应用于管理员集群:

    kubectl apply -f storage-class-kubeception.yaml \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

迁移管理员集群

确保管理员集群也已使用存储政策名称进行更新。

  1. 在管理员集群配置文件中进行以下更改:

    • 移除或注释掉 vCenter.datastore 字段。
    • 使用存储政策的名称设置 vCenter.storagePolicyName 字段。
  2. 更新管理员集群:

    gkectl update admin --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      --config ADMIN_CLUSTER_CONFIG
    

    替换以下内容:

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

使用 SPBM 进行存储迁移

完成数据存储区到 SPBM 的迁移后,您的集群现在将使用 SPBM。但迁移不会将任何存储工作负载(例如机器数据磁盘或容器卷)从旧数据存储区迁出。

如需迁移存储工作负载,请参阅通过基于存储政策的管理进行存储迁移