使用 Velero 备份、还原工作负荷群集

适用于:在 Windows Server 上运行的 AKS

本文介绍如何在 Windows Server 上的 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 集成以及有状态应用程序或持久卷的备份不受支持。

先决条件

在开始之前,请确保满足以下先决条件:

使用 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   
    
  4. 如果需要,请更改为用于备份的 Azure 订阅。

    默认情况下,Velero 将备份存储在 VM 和磁盘所在的同一 Azure 订阅中,不允许将备份还原到其他订阅中的资源组。 若要跨订阅启用备份和还原操作,请指定要用于备份的订阅。 如果你已经进行了要用于备份的订阅,则可以跳过此步骤。

    请切换到您想用于备份的订阅:

    1. 使用订阅名称查找订阅 ID:

      $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
      
  5. 创建 Azure 存储帐户和 Blob 容器。

    使用Azure Blob 存储进行备份时,Velero 需要存储帐户和 Blob 容器来存储备份。 以下示例演示在新 Velero_Backups 资源组中创建的存储帐户。

    必须使用可在 DNS 中使用的全局唯一 ID 创建存储帐户。 示例脚本使用 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
      

      该示例使用名为 velero 的 Blob 容器。 可以使用其他名称,最好是单个 Kubernetes 群集的唯一名称。

  6. 创建服务主体:

    1. 获取 Azure 帐户的订阅 ID 和租户 ID:

      $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

      若要创建具有参与者角色的服务主体,请运行以下命令。 替换为你自己的订阅 ID 以及(可选)你自己的服务主体名称。 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 备份文件使用不同的订阅,请提供两个订阅 ID,如以下示例所示:

        $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 中是唯一的,并且不会与其他服务主体或应用注册冲突。

      重要

      仅当创建服务主体时,此步骤才会显示机密。 请务必记下机密,以便在后续步骤中使用。

      如果要启用最低资源提供程序操作,请创建自定义角色,并将该角色分配给服务主体。

    3. 创建包含以下内容的名为 azure-role.json 的文件。 替换自己的自定义角色名称和订阅 ID:

      {
          "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",
              "Microsoft.Storage/storageAccounts/read"
          ],
          "NotActions": [],
          "AssignableScopes": [
            "<SUBSCRIPTION_ID>"
          ]
      }
      
    4. 创建自定义角色和服务主体:

      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 的权限。

  7. 获取服务主体名称,并将该名称 分配给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

  8. 创建包含 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 后删除此文件。 客户端密码采用纯文本形式,可能会带来安全风险。

    在继续之前,请验证文件的格式是否正确。 文件扩展名无关紧要。

    • 删除任何额外的空格或选项卡。
    • 确保变量名称正确。
  9. 在群集上安装 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 和工作负荷群集具有不同的订阅 ID 时,才需要包含它。 如果它们使用相同的 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-pvc-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 的部署文件 minio-deployment.yaml。 包括以下内容。 部署将使用你创建的永久性卷。

        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 服务。 此服务将向 MinIO Pod 提供外部 IP 地址。

      使用以下设置创建 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 Storage 用于备份,可以在你创建的 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

后续步骤