将 Azure 磁盘永久性卷移动到同一订阅或不同订阅中的另一个 AKS 群集

本文介绍了如何将 Azure 磁盘永久性卷从一个 Azure Kubernetes 服务 (AKS) 群集安全地移动到同一订阅或不同订阅中的另一个群集。 目标订阅必须在同一区域中。

完成此移动的步骤序列为:

  • 为了避免数据丢失,请确认源 AKS 群集上的 Azure 磁盘资源状态不是“已附加”状态。
  • 将 Azure 磁盘资源移动到同一订阅或不同订阅中的目标资源组。
  • 验证 Azure 磁盘资源移动是否已成功。
  • 创建永久性卷 (PV) 和永久性卷声明 (PVC),然后将移动的磁盘作为卷装载到目标群集上的 Pod 上。

开始之前

  • 确保已安装且已配置 Azure CLI 版本 2.0.59。 要查找版本,请运行 az --version。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • 将资源移动到新资源组或订阅中查看有关在不同区域之间移动资源的详细信息和要求。 请务必查看该文章中的移动资源前的核对清单
  • 源群集必须具有一个或多个附加了 Azure 磁盘的永久性卷。
  • 目标订阅中必须有 AKS 群集。

验证磁盘卷状态

在处理永久性卷时,请务必避免数据损坏、不一致或数据丢失的风险。 若要在迁移或移动过程中降低这些风险,必须首先执行以下步骤来验证磁盘卷是否未附加。

  1. 使用 az aks show 命令标识托管着 Azure 托管磁盘的节点资源组,并添加 --query nodeResourceGroup 参数。

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    

    该命令的输出类似于以下示例:

    MC_myResourceGroup_myAKSCluster_chinanorth3
    
  2. 使用 az disk list 命令列出托管磁盘。 引用上一步骤中返回的资源组。

    az disk list --resource-group MC_myResourceGroup_myAKSCluster_chinanorth3
    

    查看列表并记下你计划移动到其他群集的磁盘卷。 还可以通过查找 diskState 属性来验证磁盘状态。 以下命令输出是一个精简的示例。

    {
    "LastOwnershipUpdateTime": "2023-04-25T15:09:19.5439836+00:00",
    "creationData": {
      "createOption": "Empty",
      "logicalSectorSize": 4096
    },
    "diskIOPSReadOnly": 3000,
    "diskIOPSReadWrite": 4000,
    "diskMBpsReadOnly": 125,
    "diskMBpsReadWrite": 1000,
    "diskSizeBytes": 1073741824000,
    "diskSizeGB": 1000,
    "diskState": "Unattached",
    

    注意

    从上面的输出中记下你要移动的每个磁盘的 resourceGroup 字段的值。 此资源组是节点资源组,而不是群集资源组。 你需要使用此资源组的名称才能移动磁盘。

  3. 如果 diskState 显示 Attached,请先确定是否有任何工作负载仍在访问该卷并停止它们。 一段时间后,磁盘状态返回状态 Unattached,然后可以移动。

移动永久性卷

若要将永久性卷移动到另一个 AKS 群集,请按照将 Azure 资源移动到新的资源组或订阅中所述的步骤进行操作。 可以使用 Azure 门户Azure PowerShellAzure CLI 来执行迁移。

在此过程中,你将引用:

  • 托管着 Azure 托管磁盘的源节点资源组的名称或资源 ID。 可以通过在 Azure 门户中导航到“磁盘”仪表板并记下磁盘的关联资源组来查找节点资源组的名称。
  • 要将托管磁盘移动到的目标资源组的名称或资源 ID。
  • 托管磁盘资源的名称或资源 ID。

注意

由于资源提供程序之间的依赖关系,此操作可能需要长达四个小时才能完成。

验证磁盘卷是否已移动

将磁盘卷移动到目标群集资源组后,使用 az disk list 命令在资源组列表中验证该资源。 引用资源被移动到的目标资源组。 在此示例中,磁盘已移动到名为 MC_myResourceGroup_myAKSCluster_chinanorth3 的资源组

  az disk list --resource-group MC_myResourceGroup_myAKSCluster_chinanorth3

将移动的磁盘装载为卷

若要装载移动的磁盘卷,请使用在前面的步骤中复制的资源 ID 创建一个静态永久性卷,并创建永久性卷声明(在此示例中是一个简单的 Pod)。

  1. 创建包含一个永久性卷的 pv-azuredisk.yaml 文件。 将 volumeHandle 字段更新为来自上一步骤的磁盘资源 ID。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-azuredisk
    spec:
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: managed-csi
      csi:
        driver: disk.csi.azure.com
        readOnly: false
        volumeHandle: /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MC_rg_azure_aks-pvc-target_chinanorth3/providers/Microsoft.Compute/disks/pvc-501cb814-dbf7-4f01-b4a2-dc0d5b6c7e7a
        volumeAttributes:
          fsType: ext4
    
  2. 创建一个 pvc-azuredisk.yaml 文件,其中包含使用 PersistentVolume 的 PersistentVolumeClaim。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-azuredisk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      volumeName: pv-azuredisk
      storageClassName: managed-csi
    
  3. 使用 kubectl apply 命令创建 PersistentVolumePersistentVolumeClaim,并引用已创建的两个 YAML 文件。

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. 使用 kubectl get 命令验证 PersistentVolumeClaim 是否已创建并绑定到 PersistentVolume

    kubectl get pvc pvc-azuredisk
    

    该命令的输出类似于以下示例:

    NAME            STATUS   VOLUME         CAPACITY    ACCESS MODES   STORAGECLASS   AGE
    pvc-azuredisk   Bound    pv-azuredisk   20Gi        RWO                           5s
    
  5. 若要引用 PersistentVolumeClaim,请创建 azure-disk-pod.yaml 文件。 在示例清单中,Pod 的名称为 mypod。

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
          name: mypod
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - name: azure
              mountPath: /mnt/azure
      volumes:
        - name: azure
          persistentVolumeClaim:
            claimName: pvc-azuredisk
    
  6. 使用 kubectl apply 命令应用配置并装载卷。

    kubectl apply -f azure-disk-pod.yaml
    
  7. 检查 Pod 状态,以及随 /mnt/azure 上的 Pod 文件系统中装载的卷迁移的数据。 首先,使用 kubectl get 命令获取 Pod 状态。

    kubectl get pods
    

    该命令的输出类似于以下示例:

    NAME    READY   STATUS    RESTARTS   AGE
    mypod   1/1     Running   0          4m1s
    

    使用 kubectl exec 命令验证装载的卷 /mnt/azure 中的数据。

    kubectl exec -it mypod -- ls -l /mnt/azure/
    

    该命令的输出类似于以下示例:

    total 28
    -rw-r--r--    1 root     root       0 Jan 11 10:09 file-created-in-source-aks
    

后续步骤