使用 Velero 備份、還原工作負載叢集

適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

本文說明如何在 Azure Arc 所啟用的 AKS 中,使用 Azure Blob 儲存體 或 MinIO 記憶體來安裝和使用 Velero 來備份和還原工作負載和目標叢集。

Velero 是開放原始碼社群標準工具,可用來備份和還原 Kubernetes 叢集物件和永續性磁碟區。 它支援各種 記憶體提供者 來儲存其備份。 如果 AKS Arc 目標 Kubernetes 叢集當機且無法復原,您可以使用 Velero 備份將其內容和內部 API 物件還原至新的叢集。

如果您不想將備份儲存在 Azure Blob 儲存體 中,您可以使用 MinIO 搭配 Velero。 本文說明如何安裝和設定 Velero 以使用 Azure Blob 儲存體安裝和設定 Velero 以使用 MinIO 記憶體

注意

Velero 未正式支援 Microsoft Windows。 在測試中,Velero 小組只能備份無狀態的 Windows 應用程式。 Restic 不支援具狀態應用程式或永續性磁碟區的整合和備份。

必要條件

開始部署 Velero 之前,請先完成這些必要條件:

使用 Azure Blob 儲存體 安裝 Velero

本節中的程序說明如何安裝 Velero,並使用 Azure Blob 儲存體 進行備份。 如果您不想將備份儲存在 Azure 中,請移至 使用 MiniO 記憶體安裝 Velero

  1. 以系統管理員身分啟動 PowerShell。

  2. 使用 Azure CLI 登入 Azure:

    az login --use-device-code   
    
  3. 執行下列命令以安裝 Velero CLI

注意

velero 1.10+ 版不再支援旗標 --use-restic,因此必須使用旗標 1.9.x

choco install velero   
  1. 如有需要,請變更為您想要用於備份的 Azure 訂用帳戶。

    根據預設,Velero 會將備份儲存在與 VM 和磁碟相同的 Azure 訂用帳戶中,而且不允許您將備份還原至不同訂用帳戶中的資源群組。 若要啟用跨訂用帳戶的備份和還原,請指定要用於備份的訂用帳戶。 如果您已經在要用於備份的訂用帳戶中,則可以略過此步驟。

    切換至您要用於備份的訂用帳戶:

    1. 使用訂用帳戶名稱來尋找訂用帳戶識別碼:

      $AZURE_BACKUP_SUBSCRIPTION_NAME="<NAME_OF_TARGET_SUBSCRIPTION>"
      $AZURE_BACKUP_SUBSCRIPTION_ID=$(az account list --query="[?name=='$AZURE_BACKUP_SUBSCRIPTION_NAME'].id | [0]" -o tsv)
      
    2. 然後變更訂用帳戶:

      az account set -s $AZURE_BACKUP_SUBSCRIPTION_ID
      
  2. 建立 Azure 記憶體帳戶和 Blob 容器。

    當您將 Azure Blob 儲存體 用於備份時,Velero 需要記憶體帳戶和 Blob 容器來儲存備份。 下列範例顯示新 Velero_Backups 資源群組中建立的記憶體帳戶。

    您必須使用可在 DNS 中使用的全域唯一識別碼來建立記憶體帳戶。 範例腳本會 uuidgen 使用應用程式隨機產生唯一的名稱。 只要名稱遵循 記憶體帳戶的 Azure 命名規則,您就可以使用任何方法。

    儲存器帳戶是以待用加密功能建立, (使用 Microsoft 受控密鑰) ,且設定為只允許透過 HTTPS 連線進行存取。

    若要建立記憶體帳戶和 Blob 容器,請遵循下列步驟:

    1. 建立備份記憶體帳戶的資源群組。 視需要將目錄變更為您慣用的位置,然後執行下列命令:

      $AZURE_BACKUP_RESOURCE_GROUP="Velero_Backups"
      az group create -n $AZURE_BACKUP_RESOURCE_GROUP --location WestUS
      
    2. 建立儲存體帳戶:

      $AZURE_STORAGE_ACCOUNT_ID="<NAME_OF_ACCOUNT_TO_ASSIGN>"
      
      az storage account create --name $AZURE_STORAGE_ACCOUNT_ID --resource-group $AZURE_BACKUP_RESOURCE_GROUP --sku Standard_GRS --encryption-services blob --https-only true --kind BlobStorage --access-tier Hot
      
    3. 建立 Blob 容器:

      $BLOB_CONTAINER="velero"
      az storage container create -n $BLOB_CONTAINER --public-access off --account-name $AZURE_STORAGE_ACCOUNT_ID
      

      此範例使用名為 的 veleroBlob 容器。 您可以使用不同的名稱,最好是單一 Kubernetes 叢集的唯一名稱。

  3. 建立服務主體:

    1. 取得 Azure 帳戶的訂用帳戶識別碼和租使用者識別碼:

      $AZURE_SUBSCRIPTION_ID=(az account list --query '[?isDefault].id' -o tsv)
      $AZURE_TENANT_ID=(az account list --query '[?isDefault].tenantId' -o tsv) 
      
    2. 建立具有參與者許可權的服務主體。

      您可以使用參與者角色建立服務主體,或使用自訂角色:

      • 參與者角色: 參與者角色會授與整個訂用帳戶的存取權,因此,如果您指派該角色,請務必保護此認證。
      • 自定義角色: 如果您需要更嚴格的角色,請使用自定義角色。

      指派參與者角色:

      如果您使用 Velero 來備份具有多個 Blob 容器的多個叢集,建議您為每個叢集建立唯一的使用者名稱,而不是使用名稱 velero

      若要建立具有參與者角色的服務主體,請使用下列命令。 替代您自己的訂用帳戶標識碼,並選擇性地取代您自己的服務主體名稱。 Microsoft Entra ID 將為您產生秘密。

      $AZURE_CLIENT_SECRET=(az ad sp create-for-rbac --name "velero" --role "Contributor" --query 'password' -o tsv --scopes  /subscriptions/$AZURE_SUBSCRIPTION_ID)
      

      如有需要,請對命令進行這些調整:

      • 如果您打算針對工作負載叢集和 Velero 備份檔使用不同的訂用帳戶,請提供這兩個訂用帳戶標識碼,如下列範例所示:

        $AZURE_CLIENT_SECRET=(az ad sp create-for-rbac --name "velero" --role "Contributor" --query 'password' -o tsv --scopes  /subscriptions/$AZURE_SUBSCRIPTION_ID /subscriptions/$AZURE_BACKUP_SUBSCRIPTION_ID)
        
      • 如果您不想使用 velero 作為服務主體名稱,請確定--name您在 Microsoft Entra ID 中選擇是唯一的,而且不會與其他服務主體或應用程式註冊衝突。

      重要

      只有在建立服務主體時,才會在此步驟期間顯示秘密。 請務必記下秘密,以供日後步驟使用。

      使用自訂角色:

      如果您想要啟用最低資源提供者動作,請建立自定義角色,並將該角色指派給服務主體。

      1. 使用下列內容 建立名為 azure-role.json 的檔案。 替代您自己的自定義角色名稱和訂用帳戶標識碼。

        {
            "Name": <CUSTOM_ROLE_NAME>,
            "Id": null,
            "IsCustom": true,
            "Description": "Velero related permissions to perform backups, restores and deletions",
            "Actions": [
                "Microsoft.Compute/disks/read",
                "Microsoft.Compute/disks/write",
                "Microsoft.Compute/disks/endGetAccess/action",
                "Microsoft.Compute/disks/beginGetAccess/action",
                "Microsoft.Compute/snapshots/read",
                "Microsoft.Compute/snapshots/write",
                "Microsoft.Compute/snapshots/delete",
                "Microsoft.Storage/storageAccounts/listkeys/action",
                "Microsoft.Storage/storageAccounts/regeneratekey/action"
            ],
            "NotActions": [],
            "AssignableScopes": [
              "<SUBSCRIPTION_ID>"
            ]
        }
        
      2. 建立自訂角色和服務主體:

        az role definition create --role-definition azure-role.json
        
        $AZURE_CLIENT_SECRET=(az ad sp create-for-rbac --name "velero" --role "<CUSTOM_ROLE>" --query 'password' -o tsv --scopes  /subscriptions/$AZURE_SUBSCRIPTION_ID)
        

      如需建立自定義角色的詳細資訊,請參閱 設定 Velero 的許可權

  4. 取得服務主體名稱,並將該名稱指派給 AZURE_CLIENT_ID 變數:

    $AZURE_CLIENT_ID=(az ad sp list --display-name "velero" --query '[0].appId' -o tsv)
    

    注意

    服務主體到期。 若要瞭解新的服務主體何時到期,請執行此命令: az ad sp show --id $AZURE_CLIENT_ID

  5. 建立包含 Velero 安裝所需變數的檔案。 這個指令看起來類似下列命令:

    AZURE_SUBSCRIPTION_ID=${AZURE_SUBSCRIPTION_ID}
    AZURE_TENANT_ID=${AZURE_TENANT_ID}
    AZURE_CLIENT_ID=${AZURE_CLIENT_ID}
    AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET}
    AZURE_RESOURCE_GROUP=${AZURE_BACKUP_RESOURCE_GROUP}
    AZURE_CLOUD_NAME=AzurePublicCloud" | Out-File -FilePath ./credentials-velero.txt
    

    重要

    安裝 Velero 之後,請刪除此檔案。 用戶端密碼是純文本的,這可能會造成安全性風險。

    繼續之前,請確認檔案的格式正確。 擴展名並不重要。

    • 拿掉任何額外的空格或索引標籤。
    • 請確定變數名稱正確。
  6. 安裝並啟動 Velero。

    在叢集上安裝 Velero,然後開始部署。 此程式會建立名為 的 velero 命名空間,並將名為 velero 的部署新增至 命名空間。

    1. 使用下列命令安裝 Velero。 您必須自定義範例命令。

      velero install --provider azure --plugins velero/velero-plugin-for-microsoft-azure:v1.5.0 --bucket $BLOB_CONTAINER --secret-file ./credentials-velero.txt --backup-location-config resourceGroup=$AZURE_BACKUP_RESOURCE_GROUP,storageAccount=$AZURE_STORAGE_ACCOUNT_ID,subscriptionId=$AZURE_BACKUP_SUBSCRIPTION_ID --use-restic
      

      視需要設定下列變數:

      • 此命令會安裝 Microsoft Azure 外掛程式,其必須與您使用的 Velero CLI 版本相容。 此範例命令使用 Microsoft Azure 外掛程式 1.5.0 版,其與最新的 Velero CLI 版本 1.9.0 相容。 若要瞭解要與您的 Valero CLI 版本一起安裝的 Microsoft Azure 外掛程式版本,請參閱 相容性矩陣

      • 請務必包含 參數, --use-restic 以使用 Restic在文件系統層級啟用 Kubernetes 磁碟區的備份。 Restic 可用來備份任何類型的 Kubernetes 磁碟區。 根據預設,Velero 支援擷取 Amazon EBS 磁碟區、Azure 受控磁碟 和 Google 永續性磁碟的永續性磁碟區快照集。 在 AKS Arc 中,Kubernetes 磁碟區會使用叢集共用磁碟區 (CSV) 來儲存數據。 因此, Restic 需要啟用永續性磁碟區快照集。 AKS Arc 目前不支援磁碟區快照集。

      • subscriptionId=$AZURE_BACKUP_SUBSCRIPTION_ID 是選擇性的。 只有在 Velero 和工作負載叢集有不同的訂用帳戶標識碼時,才需要包含它。 如果他們使用相同的 Azure 訂用帳戶,您可以移除 subscriptionId 參數, 而credentials-velero.txt 檔案會提供該資訊。

      Velero 服務會在安裝時自動啟動。

    2. 檢查 Velero 服務是否正常執行:

      kubectl -n velero get pods
      kubectl logs deployment/velero -n velero
      

      此命令 get pods 應該會顯示 Velero Pod 正在執行。

使用 MinIO 記憶體安裝 Velero

本節中的程序說明如何安裝 Velero,並使用 MinIO 記憶體進行備份。 如果您想要針對備份使用 Azure Blob 儲存體,請移至安裝具有 Azure Blob 儲存體的 Velero

如果您不想將備份儲存在MinIO中,請移至設定Velero以使用 Azure Blob 儲存體

  1. 執行下列命令來安裝 Velero CLI。 安裝 Chocolately 如果您還沒有的話。

    choco install velero
    
  2. 安裝 MinIO:

    1. 建立永續性磁碟區來儲存MinIO備份。 此範例會在 AKS Arc 的預設儲存類別中建立持續性磁碟區,該磁碟區已經存在。

      1. 使用下列內容建立名為 minio-pv-storage.yaml 的 YAML 檔案:

        kind: PersistentVolumeClaim
        apiVersion: v1
        metadata: 
        name: minio-pv-claim 
        spec: 
        storageClassName: default 
        accessModes: 
           - ReadWriteOnce 
        resources: 
           requests: 
              storage: 100Gi 
        

        執行此命令以建立永續性磁碟區:

        kubectl create -f minio-pvc-storage.yaml
        
      2. 建立 部署檔案 minio-deployment.yaml,以啟動 MinIO。 包含下列內容。 部署將使用您所建立的永續性磁碟區。

        apiVersion: apps/v1
        kind: Deployment
        metadata:
        name: minio-deployment 
        spec: 
        selector: 
           matchLabels: 
              app: minio 
        strategy: 
           type: Recreate 
        template: 
           metadata: 
              labels: 
              app: minio 
           spec: 
              volumes: 
              - name: storage 
              persistentVolumeClaim: 
                 claimName: minio-pv-claim 
              containers: 
              - name: minio 
              image: minio/minio:latest 
              args: 
              - server 
              - /storage 
              env: 
              - name: MINIO_ACCESS_KEY 
                 value: "<you can define this>" 
              - name: MINIO_SECRET_KEY 
                 value: "<you can define this>" 
              ports: 
              - containerPort: 9000 
                 hostPort: 9000 
              volumeMounts: 
              - name: storage  
                 mountPath: "/storage" 
        

        然後建立部署:

        kubectl create -f minio-deployment.yaml
        
    2. 建立名為 minio-service.yaml 的 Kubernetes 服務。 此服務會將外部IP位址提供給MinIO Pod。

      使用下列設定建立 YAML 檔案以設定服務:

      apiVersion: v1 
      kind: Service 
      metadata: 
      name: minio-service 
      spec: 
      type: LoadBalancer 
      ports: 
         - port: 9000 
            targetPort: 9000 
            protocol: TCP 
      selector: 
         app: minio 
      

      然後建立服務:

      kubectl create -f mino-service.yaml
      
    3. 執行下列命令以取得 MinIO Pod 的外部 IP 位址。 您將使用該位址來安裝 Velero。

      kubectl get svc
      
    4. 若要檢查 MinIO 是否已啟動並執行,請在瀏覽器中登入 IP 位址,或使用 MinIO 用戶端,如下所示。

      安裝 MinIO 用戶端,並流覽 MinIO 檔案。

      下載 MinIO 用戶端:

      Invoke-WebRequest -Uri "https://dl.minio.io/client/mc/release/windows-amd64/mc.exe" -OutFile "C:\mc.exe
      

      接下來,設定別名:

      mc alias set minio http://10.10.77.6:9000 "minio_access_key" "minio_secret_key" --api s3v4
      

      最後,流覽 MinIO 安裝:

      mc ls minio
      
    5. 建立貯體來儲存 Velero 檔案。 此貯體將用於 Velero 安裝中。

      mc mb minio/velero-backup
      
    6. 使用下列資訊建立 MinIO 認證檔案:

      minio.credentials 
             [default] 
        aws_access_key_id=<minio_access_key> 
        aws_secret_access_key=<minio_secret_key> 
      
  3. 安裝 Velero:

    velero install --provider aws --bucket velero-backup --secret-file .\minio.credentials --backup-location-config region=minio,s3ForcePathStyle=true,s3Url=http://10.10.77.6:9000 --plugins velero/velero-plugin-for-aws:v1.1.0 --use-restic
    

    執行此命令之前,請先檢查貯體名稱、MinIO 認證,以及 MinIO 外部 IP 位址。

  4. 檢查 Velero 服務是否正常執行:

    kubectl -n velero get pods
    kubectl logs deployment/velero -n Velero
    

    此命令 get pods 應該會顯示 Velero Pod 正在執行。

備份叢集

您可以備份或還原叢集中的所有物件,也可以依類型、命名空間和/或標籤來篩選物件。

建立備份

使用 Velero backup create 命令建立所選記憶體的備份。 下列範例會 --default-volumes-to-restic 使用 旗標,此旗標會建立永續性磁碟區的快照集。 如需其他備份選項,請參閱 Velero 備份參考

  • 叢集中所有命名空間的隨選備份:

    velero backup create <BACKUP-NAME> --default-volumes-to-restic
    
  • 叢集中單一命名空間的隨選備份:

    velero backup create <BACKUP-NAME> --include-namespaces <NAMESPACE1> --default-volumes-to-restic
    
  • 叢集中多個所選命名空間的隨選備份:

    velero backup create <BACKUP-NAME> --include-namespaces <NAMESPACE-1>, <NAMESPACE-2> --default-volumes-to-restic
    

檢查備份進度

  • 若要檢查備份的進度,請執行此命令:

    velero backup describe <BACKUP-NAME>
    
  • 如果您使用備份 Azure Blob 儲存體,您可以在您建立的 Blob/容器下,在 Azure 記憶體帳戶中檢視備份。

還原叢集

若要還原叢集,您必須建立新的叢集,才能將舊的叢集還原至。 您無法將叢集備份還原至現有的叢集。

restore命令可讓您從先前建立的備份還原所有物件和永續性磁碟區。 您也可以只還原物件和永久性磁碟區的篩選子集。 如需更多備份選項,請參閱 資源篩選

在您想要將備份還原至 目的地叢集 () 的叢集:

  1. 使用上述指示部署 Velero。 使用您用於來源叢集的相同 Azure 認證。

  2. 執行下列命令,確定已建立 Velero 備份物件。 Velero 資源會與雲端儲存體中的備份檔案進行同步處理。

    velero backup describe <BACKUP-NAME>
    
  3. 確認備份 (BACKUP-NAME) 出現正確的備份之後,請還原備份中的所有物件:

    velero restore create --from-backup <BACKUP-NAME>
    

取得 Velero 命令的說明

若要查看與特定 Velero 命令相關聯的所有選項,請使用 --help 旗標搭配 命令。 例如,velero restore create --help 會顯示與 velero restore create 命令相關聯的所有選項。

例如,若要列出 的所有選項 velero restore,請執行 velero restore --help,這會傳回下列資訊:

  velero restore [command]
  Available Commands:
  create      Create a restore
  delete      Delete restores
  describe    Describe restores
  get         Get restores
  logs        Get restore logs

解除安裝 Velero

若要從叢集卸載 Velero,並移除 Velero 安裝所建立的所有資源,請執行下列命令:

kubectl delete namespace/velero clusterrolebinding/velero 
kubectl delete crds -l component=velero

下一步