使用 Azure CLI 备份 Azure Kubernetes 服务

本文介绍如何使用 Azure CLI 配置和备份 Azure Kubernetes 服务 (AKS)。

Azure 备份现在允许使用备份扩展(必须在群集中安装)备份 AKS 群集(群集资源和附加到群集的永久性卷)。 备份保管库通过此备份扩展与群集通信,以执行备份和还原操作。

开始之前

  • 目前,AKS 备份仅支持基于 Azure 磁盘的永久性卷(由 CSI 驱动程序启用)。 备份仅存储(租户中的)操作数据存储中,不会移动到保管库。 备份保管库和 AKS 群集应位于同一区域。

  • AKS 备份使用 Blob 容器和资源组来存储备份。 Blob 容器中存储了 AKS 群集资源,而永久性卷快照存储在资源组中。 AKS 群集和存储位置必须位于同一区域。 了解如何创建 Blob 容器

  • 目前,AKS 备份支持一天备份一次。 它还支持每天进行更频繁的备份(每 4、8 和 12 小时备份一次)。 此解决方案使你可以将数据保留最多 360 天以用于还原。 了解如何创建备份策略

  • 必须安装备份扩展才能在 AKS 群集上配置备份和还原操作。 详细了解备份扩展

  • 在启动备份配置和还原操作之前,请确保为订阅注册了 Microsoft.KubernetesConfigurationMicrosoft.DataProtectionMicrosoft.ContainerService

  • 在启动 AKS 备份的备份或还原操作之前,请确保执行所有先决条件

若要详细了解支持的方案、限制和可用性,请参阅支持矩阵

创建备份保管库

备份保管库是 Azure 中的管理实体,可存储 Azure 备份支持的各种新型工作负荷(例如 Azure Database for PostgreSQL 服务器和 Azure 磁盘)的备份数据。 备份保管库便于组织备份数据,并最大限度降低管理开销。 备份保管库基于 Azure 的 Azure 资源管理器型号,提供增强的功能来帮助保护备份数据。

在创建备份保管库之前,请选择保管库中数据的存储冗余,然后使用该存储冗余和位置创建备份保管库。 详细了解创建备份保管库

注意

尽管所选保管库可能具有全局冗余设置,但 AKS 的备份目前仅支持操作层。 所有备份存储在 AKS 群集所在同一区域内的订阅中,并且不会复制到备份保管库存储。

若要创建备份保管库,请运行以下命令:

az dataprotection backup-vault create --resource-group $backupvaultresourcegroup --vault-name $backupvault --location $region --type SystemAssigned --storage-settings datastore-type="VaultStore" type="LocallyRedundant"

保管库创建完成后,创建备份策略来保护 AKS 群集。

创建备份策略

要了解用于 AKS 备份的备份策略内部组件,可使用命令 az dataprotection backup-policy get-default-policy-template 检索策略模板。 此命令返回给定数据源类型的默认策略模板。 使用此策略模板创建新策略。

az dataprotection backup-policy get-default-policy-template --datasource-type AzureKubernetesService > akspolicy.json


{
  "datasourceTypes": [
    "Microsoft.ContainerService/managedClusters"
  ],
  "name": "AKSPolicy1",
  "objectType": "BackupPolicy",
  "policyRules": [
    {
      "backupParameters": {
        "backupType": "Incremental",
        "objectType": "AzureBackupParams"
      },
      "dataStore": {
        "dataStoreType": "OperationalStore",
        "objectType": "DataStoreInfoBase"
      },
      "name": "BackupHourly",
      "objectType": "AzureBackupRule",
      "trigger": {
        "objectType": "ScheduleBasedTriggerContext",
        "schedule": {
          "repeatingTimeIntervals": [
            "R/2023-01-04T09:00:00+00:00/PT4H"
          ]
        },
        "taggingCriteria": [
          {
            "isDefault": true,
            "tagInfo": {
              "id": "Default_",
              "tagName": "Default"
            },
            "taggingPriority": 99
          }
        ]
      }
    },
    {
      "isDefault": true,
      "lifecycles": [
        {
          "deleteAfter": {
            "duration": "P7D",
            "objectType": "AbsoluteDeleteOption"
          },
          "sourceDataStore": {
            "dataStoreType": "OperationalStore",
            "objectType": "DataStoreInfoBase"
          }
        }
      ],
      "name": "Default",
      "objectType": "AzureRetentionRule"
    }
  ]
}

策略模板由触发条件(用于确定触发备份作业的因素)和生命周期(决定何时删除、复制或移动备份)组成。 在 AKS 备份中,触发器的默认值如下:计划的小时触发器为每 4 小时 (PT4H) 触发一次,每个备份的保留期为 7 天

Scheduled trigger:
      "trigger": {
        "objectType": "ScheduleBasedTriggerContext",
        "schedule": {
          "repeatingTimeIntervals": [
            "R/2023-01-04T09:00:00+00:00/PT4H"
          ]
        }
      }

Default retention lifecycle:
      "lifecycles": [
        {
          "deleteAfter": {
            "duration": "P7D",
            "objectType": "AbsoluteDeleteOption"
          },
          "sourceDataStore": {
            "dataStoreType": "OperationalStore",
            "objectType": "DataStoreInfoBase"
          }
        }
      ]


AKS 备份每天提供多个备份。 如果需要更频繁地进行备份,请选择每小时备份频率,让你能够以每 46812 小时的间隔进行备份。 备份是根据所选的时间间隔安排的。

重要

每日备份时间表示备份开始时间,而不是备份完成时间。

将模板下载为 JSON 文件后,可对其进行编辑,以根据需要进行计划和保留。 然后使用生成的 JSON 创建新策略。 如果要编辑每小时频率或保持期,请使用az dataprotection backup-policy trigger set 和/或 az dataprotection backup-policy retention-rule set 命令。

注意

若要将备份数据存储在保管库层,以便长期保留以实现合规性目的,或者通过跨区域还原进行区域灾难恢复,需要在默认模板中定义新的保留规则,以定义备份应存储在保管库中的时长。

举个例子,我们将更新备份策略的默认模板,并添加一条保留规则,将每天第一次成功的备份在保管库层中保留 30 天

使用 az dataprotection backup-policy retention-rule create-lifecycle 命令创建保留规则,然后使用 `` 命令将保留规则添加到备份策略模板


az dataprotection backup-policy retention-rule create-lifecycle  --count 30 --retention-duration-type Days --copy-option ImmediateCopyOption --target-datastore VaultStore --source-datastore OperationalStore > ./retentionrule.json

az dataprotection backup-policy retention-rule set --lifecycles ./retentionrule.json --name Daily --policy ./akspolicy.json > ./akspolicy.json

一旦策略 JSON 具有所有所需值,请使用 az dataprotection backup-policy create 命令从策略对象创建新策略。

az dataprotection backup-policy create -g testBkpVaultRG --vault-name TestBkpVault -n mypolicy --policy policy.json

准备 AKS 群集以进行备份

保管库和策略创建完成后,需要执行以下先决条件,以准备 AKS 群集进行备份:

  1. 创建存储帐户和 Blob 容器

    AKS 备份会将 Kubernetes 资源作为备份存储在 Blob 容器中。 要让 AKS 群集准备好进行备份,需要在群集中安装一个扩展。 此扩展需要使用存储帐户和 Blob 容器作为输入。

    若要创建新的存储帐户,请运行以下命令:

    az storage account create --name $storageaccount --resource-group $storageaccountresourcegroup --location $region --sku Standard_LRS
    

    存储帐户创建完成后,通过运行以下命令在其中创建 Blob 容器:

    az storage container create --name $blobcontainer --account-name $storageaccount --auth-mode login
    

    了解如何在创建存储帐户和 Blob 容器时启用或禁用特定功能,例如专用终结点

    注意

    1. 存储帐户和 AKS 群集应位于同一区域和订阅中。
    2. Blob 容器不应包含以前创建的任何文件系统(由 AKS 备份创建的除外)。
    3. 如果源或目标 AKS 群集位于专用虚拟网络中,则需要创建专用终结点以将存储帐户与 AKS 群集连接。
  2. 安装备份扩展

    必须在 AKS 群集中安装备份扩展才能执行任何备份和还原操作。 备份扩展会在群集中创建命名空间 dataprotection-microsoft,并使用同一命名空间部署其资源。 该扩展需要将存储帐户和 Blob 容器用作输入以进行安装。

    az k8s-extension create --name azure-aks-backup --extension-type microsoft.dataprotection.kubernetes --scope cluster --cluster-type managedClusters --cluster-name $akscluster --resource-group $aksclusterresourcegroup --release-train stable --configuration-settings blobContainer=$blobcontainer storageAccount=$storageaccount storageAccountResourceGroup=$storageaccountresourcegroup storageAccountSubscriptionId=$subscriptionId
    

    在扩展安装过程中,会在 AKS 群集的节点池资源组中创建用户标识。 要使扩展能够访问存储帐户,需要为此标识提供“存储 Blob 数据参与者”角色。 若要分配所需的角色,请运行以下命令:

    az role assignment create --assignee-object-id $(az k8s-extension show --name azure-aks-backup --cluster-name $akscluster --resource-group $aksclusterresourcegroup --cluster-type managedClusters --query aksAssignedIdentity.principalId --output tsv) --role 'Storage Blob Data Contributor' --scope /subscriptions/$subscriptionId/resourceGroups/$storageaccountresourcegroup/providers/Microsoft.Storage/storageAccounts/$storageaccount
    
  3. 启用受信任的访问

    要让备份保管库与 AKS 群集连接,必须启用受信任的访问,因为这样会使得备份保管库直接看到 AKS 群集。

    若要启用受信任的访问,请运行以下命令:

    az aks trustedaccess rolebinding create --cluster-name $akscluster --name backuprolebinding --resource-group $aksclusterresourcegroup --roles Microsoft.DataProtection/backupVaults/backup-operator --source-resource-id /subscriptions/$subscriptionId/resourceGroups/$backupvaultresourcegroup/providers/Microsoft.DataProtection/BackupVaults/$backupvault
    

配置备份

使用已创建的备份保管库和备份策略以及处于随时可备份状态的 AKS 群集,现在可以开始备份 AKS 群集。

准备请求

备份的配置分两个步骤执行:

  1. 准备备份配置,以定义要使用 az dataprotection backup-instance initialize-backupconfig 命令备份的群集资源。 该命令会生成一个 JSON,可以更新该 JSON,以便根据需要为 AKS 群集定义备份配置。

    az dataprotection backup-instance initialize-backupconfig --datasource-type AzureKubernetesService > aksbackupconfig.json
    
    {
     "excluded_namespaces": null,
     "excluded_resource_types": null,
     "include_cluster_scope_resources": true,
     "included_namespaces": null, 
     "included_resource_types": null,
     "label_selectors": null,
     "snapshot_volumes": true
    }
    

以下命名空间会从备份配置中跳过,并且不会进行备份配置:kube-system、kube-node-lease、kube-public。

  1. 通过 az dataprotection backup-instance initialize 命令使用相关保管库、策略、AKS 群集、备份配置和快照资源组来准备相关请求。

    az dataprotection backup-instance initialize --datasource-id /subscriptions/$subscriptionId/resourceGroups/$aksclusterresourcegroup/providers/Microsoft.ContainerService/managedClusters/$akscluster --datasource-location $region --datasource-type AzureKubernetesService --policy-id /subscriptions/$subscriptionId/resourceGroups/$backupvaultresourcegroup/providers/Microsoft.DataProtection/backupVaults/$backupvault/backupPolicies/$backuppolicy --backup-configuration ./aksbackupconfig.json --friendly-name ecommercebackup --snapshot-resource-group-name $snapshotresourcegroup > backupinstance.json
    

现在,使用此命令的 JSON 输出为 AKS 群集配置备份。

分配所需的权限并进行验证

备份保管库使用托管标识来访问其他 Azure 资源。 要配置 AKS 群集的备份,备份保管库的托管标识需要对创建和管理快照的 AKS 群集和资源组具有一组权限。 此外,AKS 群集需要具有对快照资源组的权限。

备份当前仅支持系统分配的托管标识(备份保管库和 AKS 群集)。 系统分配的托管标识限制为每个资源一个,并绑定到此资源的生命周期。 可使用 Azure 基于角色的访问控制 (Azure RBAC) 来授予托管标识的访问权限。 托管标识是一种只能用于 Azure 资源的特殊类型的服务主体。 详细了解托管标识

准备好请求后,首先需要通过运行以下命令来验证是否将所需角色分配给上述资源:

az dataprotection backup-instance validate-for-backup --backup-instance ./backupinstance.json --ids /subscriptions/$subscriptionId/resourceGroups/$backupvaultresourcegroup/providers/Microsoft.DataProtection/backupVaults/$backupvault

如果验证失败且缺少某些权限,可以通过运行以下命令来分配这些权限:

az dataprotection backup-instance update-msi-permissions command.
az dataprotection backup-instance update-msi-permissions --datasource-type AzureKubernetesService --operation Backup --permissions-scope ResourceGroup --vault-name $backupvault --resource-group $backupvaultresourcegroup --backup-instance backupinstance.json

分配完权限后,使用以下验证备份命令重新验证:

az dataprotection backup-instance create --backup-instance  backupinstance.json --resource-group $backupvaultresourcegroup --vault-name $backupvault

运行按需备份

要提取你想触发的备份所在的相关备份实例,请运行 az dataprotection backup-instance list-from-resourcegraph -- 命令。

az dataprotection backup-instance list-from-resourcegraph --datasource-type AzureKubernetesService --datasource-id /subscriptions/$subscriptionId/resourceGroups/$aksclusterresourcegroup/providers/Microsoft.ContainerService/managedClusters/$akscluster --query aksAssignedIdentity.id

现在,通过运行以下命令为备份实例触发按需备份:

az dataprotection backup-instance adhoc-backup --rule-name "BackupDaily" --ids /subscriptions/$subscriptionId/resourceGroups/$backupvaultresourcegroup/providers/Microsoft.DataProtection/backupVaults/$backupvault/backupInstances/$backupinstanceid

跟踪作业

运行 az dataprotection job 命令来跟踪备份作业。 你可以列出所有作业并提取特定作业详细信息。

还可以使用 Resource Graph 通过运行 az dataprotection job list-from-resourcegraph 命令来跟踪所有订阅、资源组和备份保管库中的所有作业,以获取相关的作业

对于按需备份

az dataprotection job list-from-resourcegraph --datasource-type AzureKubernetesService --datasource-id /subscriptions/$subscriptionId/resourceGroups/$aksclusterresourcegroup/providers/Microsoft.ContainerService/managedClusters/$akscluster --operation OnDemandBackup

对于计划备份

az dataprotection job list-from-resourcegraph --datasource-type AzureKubernetesService --datasource-id /subscriptions/$subscriptionId/resourceGroups/$aksclusterresourcegroup/providers/Microsoft.ContainerService/managedClusters/$akscluster --operation ScheduledBackup

后续步骤