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

      重要

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

      使用自定义角色:

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

      1. 创建包含以下内容的名为 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>"
            ]
        }
        
      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 的权限。

  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 的命名空间,并将名为 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 存储用于备份,请转到安装 Velero 并Azure Blob 存储。

如果不想将备份存储在 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 存储,可以在创建的 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 --help的所有选项velero restore,这将返回以下信息:

  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

后续步骤