將 Azure 磁碟持續性磁碟區移到相同或不同訂用帳戶中的另一個 AKS 叢集

本文說明如何將 Azure 磁碟永續性磁碟區從一個 Azure Kubernetes Service (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_eastus
    
  2. 使用 az disk list 命令列出受控磁碟。 參考上一個步驟中傳回的資源群組。

    az disk list --resource-group MC_myResourceGroup_myAKSCluster_eastus
    

    檢查清單並記下您打算移至另一個叢集的磁碟區。 同時尋找 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 PowerShell,或使用 Azure CLI 來執行移轉。

在此程序期間,您會參考:

  • 承載 Azure 管理磁碟的來源節點資源群組名稱或資源 ID。 您可以在 Azure 入口網站中瀏覽至 [磁碟] 儀表板,並記下磁碟的相關資源群組,以尋找節點資源群組的名稱。
  • 受控磁碟要移至的目標資源群組的名稱或資源識別碼。
  • 受控磁碟資源的名稱或資源識別碼。

注意

由於資源提供者之間的相依性,此作業最多可能需要四個小時才能完成。

確認磁碟區已被移動

將磁碟磁碟區移至目標叢集資源群組之後,請使用 az disk list 命令來驗證資源群組清單中的資源。 參考移動資源的目的地資源群組。 在此範例中,磁碟已移至名為 MC_myResourceGroup_myAKSCluster_eastus 的資源群組。

  az disk list --resource-group MC_myResourceGroup_myAKSCluster_eastus

將已移動的磁碟掛接為磁碟區

若要掛接已移動的磁碟磁碟區,請建立靜態持續性磁碟區 (使用前述步驟複製的資源識別碼)、持續性磁碟區宣告,並在此範例中建立簡單的 Pod。

  1. 建立包含持續性磁碟區的 pv-azuredisk.yaml 檔案。 使用前一個步驟中的磁碟資源識別碼,更新 volumeHandle 欄位。

    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_eastus/providers/Microsoft.Compute/disks/pvc-aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
        volumeAttributes:
          fsType: ext4
    
  2. 建立包含 PersistentVolumeClaim 的 pvc-azuredisk.yaml 檔案,該宣告會使用 PersistentVolume。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-azuredisk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      volumeName: pv-azuredisk
      storageClassName: managed-csi
    
  3. 使用命令並參考已建立的兩個 YAML 檔案來建立PersistentVolume 和kubectl apply。

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. 使用 命令,驗證 PersistentVolumeClaim 是否已建立並繫結至 kubectl get。

    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.microsoft.com/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 狀態,以及將磁碟區掛接在 Pod 檔案系統 /mnt/azure 內的已移轉資料。 首先,使用 kubectl get 命令取得 Pod 狀態。

    kubectl get pods
    

    此命令的輸出與下列範例類似:

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

    使用 /mnt/azure 命令,確認掛接磁碟區 kubectl exec 內的資料。

    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
    

下一步