你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure CLI 还原 Azure Kubernetes 服务

本文介绍如何使用 Azure CLI 从 Azure 备份创建的还原点还原 Azure Kubernetes 群集。

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

可以执行原始位置恢复 (OLR)(在备份的 AKS 群集中还原)和备用位置恢复 (ALR)(在其他 AKU 群集中还原)。 还可以选择要从项目级 (ILR) 的备份中还原的项。

注意

在启动还原操作之前,目标群集应安装备份扩展并为备份保管库启用受信任访问。 了解详细信息

开始之前

  • 使用 AKS 备份,可以还原到已备份的原始 AKS 群集和备用 AKS 群集。 AKS 备份允许执行完整还原和项级还原。 可以利用还原配置基于要还原的群集资源定义参数。

  • 必须在目标 AKS 群集中安装备份扩展。 此外,必须在备份保管库和 AKS 群集之间启用受信任的访问

  • 如果目标 AKS 群集版本与备份期间使用的版本不同,还原操作可能会失败,或者完成但同时针对各种场景(例如较新的群集版本中有已弃用的资源)发出警告。 如果从保管库层还原,则可以使用暂存位置中的冻结资源将应用程序资源还原到目标群集。

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

验证和准备目标 AKS 群集

在启动还原过程之前,必须验证 AKS 群集是否已准备好进行还原。 这包括要安装的备份扩展,该扩展具有存储/冻结备份的存储帐户的权限,以及在目标 AKS 群集和备份保管库之间启用的受信任访问。

首先,检查是否通过运行以下命令在群集中安装了备份扩展:

az k8s-extension show --name azure-aks-backup --cluster-type managedClusters --cluster-name $targetakscluster --resource-group $aksclusterresourcegroup

如果安装了扩展,则检查它是否对存储备份的存储帐户具有适当的权限:

az role assignment list --all --assignee  $(az k8s-extension show --name azure-aks-backup --cluster-name $targetakscluster --resource-group $aksclusterresourcegroup --cluster-type managedClusters --query aksAssignedIdentity.principalId --output tsv)

如果未分配角色,则可以通过运行以下命令来分配角色:

az role assignment create --assignee-object-id $(az k8s-extension show --name azure-aks-backup --cluster-name $targetakscluster --resource-group $aksclusterresourcegroup --cluster-type managedClusters --query aksAssignedIdentity.principalId --output tsv) --role 'Storage Account Contributor'  --scope /subscriptions/$subscriptionId/resourceGroups/$storageaccountresourcegroup/providers/Microsoft.Storage/storageAccounts/$storageaccount

如果未安装备份扩展,则对存储帐户和 Blob 容器(其中备份存储为输入)运行以下扩展安装命令。

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

然后运行以下命令,将所需的角色分配给存储帐户上的扩展:

az role assignment create --assignee-object-id $(az k8s-extension show --name azure-aks-backup --cluster-name $targetakscluster --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

检查受信任访问

若要检查是否在备份保管库和目标 AKS 群集之间启用了受信任访问,请运行以下命令:

az aks trustedaccess rolebinding list --resource-group $aksclusterresourcegroup --cluster-name $targetakscluster

如果未执行此操作,则可以使用以下命令启用受信任访问:

az aks trustedaccess rolebinding create --cluster-name $targetakscluster --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 群集关联的所有实例,并标识相关实例。

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

标识实例后,提取相关恢复点。

az dataprotection recovery-point list --backup-instance-name $backupinstancename --resource-group $backupvaultresourcegroup --vault-name $backupvault

如果要将备份还原到次要区域,请使用标志 --use-secondary-region 标识该区域中可用的恢复点。

az dataprotection recovery-point list --backup-instance-name $backupinstancename --resource-group $backupvaultresourcegroup --vault-name $backupvault --use-secondary-region true

准备还原请求

使用 az dataprotection backup-instance initialize-restoreconfig 命令准备还原配置,定义要还原到目标 AKS 群集的项。

az dataprotection backup-instance initialize-restoreconfig --datasource-type AzureKubernetesService >restoreconfig.json



{
  "conflict_policy": "Skip",
  "excluded_namespaces": null,
  "excluded_resource_types": null,
  "include_cluster_scope_resources": true,
  "included_namespaces": null,
  "included_resource_types": null,
  "label_selectors": null,
  "namespace_mappings": null,
  "object_type": "KubernetesClusterRestoreCriteria",
  "persistent_volume_restore_mode": "RestoreWithVolumeData",
  "resource_modifier_reference": null,
  "restore_hook_references": null,
  "staging_resource_group_id": null,
  "staging_storage_account_id": null
}

还原配置由以下项组成:

  • conflict_policy:还原期间,如果群集中存在与备份中同名的资源,则可以选择如何处理冲突。 有两个选项:“跳过”(此选项不会还原备份项)或“更新”(此选项使用存储在备份中的资源修改群集中资源的可变字段)。

  • excluded_namespace:可以列出不还原到群集中的命名空间。 不会还原这些命名空间下的资源。

  • excluded_resource_types:可以列出不还原到群集中的资源类型。 输入中的值应以 API 组类型作为键值对提供。

  • include_cluster_scope_resources:可以通过将值设置为 true 或 false 来决定是否要还原群集范围的资源。

  • included_namespaces:可以列出仅作为还原到群集的一部分包含的命名空间。 将还原这些命名空间下的资源。

  • excluded_resource_types:可以列出仅用于还原到群集的资源类型。 输入中的值应以 API 组类型作为键值对提供。

  • label_selectors:可以选择还原带特定标签的资源。 输入值应作为键值对提供。

  • namespace_mappings:可以将命名空间(和基础资源)映射到目标群集中的其他命名空间。 如果群集中不存在目标命名空间,则扩展会创建一个新的命名空间。 输入值应作为键值对提供。

  • persistent_volume_restore_mode:可以使用此变量来确定是否要还原备份的永久性卷。 接受的值是 RestoreWithVolumeData、RestoreWithoutVolumeData

  • resource_modifier_reference:可以使用此变量引用群集中部署的资源修饰符资源。 输入值是部署资源的命名空间的键值对和 yaml 文件的名称。

  • restore_hook_references:可以使用此变量引用群集中部署的还原挂钩资源。 输入值是部署资源的命名空间的键值对和 yaml 文件的名称。

  • staging_resource_group_id:如果要还原存储在保管库层中的备份,则需要提供资源组的 ID 作为暂存位置。 在此资源组中,备份的永久性卷在还原到目标群集之前会冻结。

  • staging_storage_account_id:如果要还原存储在保管库层中的备份,则需要提供存储帐户的 ID 作为暂存位置。 在此资源组中,备份的 kubernetes 资源在还原到目标群集之前会冻结。

现在,使用所有相关详细信息来还原请求。 如果要将备份还原到原始群集,请运行以下命令:

az dataprotection backup-instance restore initialize-for-item-recovery --datasource-type AzureKubernetesService --restore-location $region --source-datastore OperationalStore --recovery-point-id $recoverypointid --restore-configuration restoreconfig.json --backup-instance-id /subscriptions/$subscriptionId/resourceGroups/$aksclusterresourcegroup/providers/Microsoft.DataProtection/backupVaults/$backupvault/backupInstances/$backupinstanceid >restorerequestobject.json

如果用于还原的目标 AKS 群集不同于原始群集,请运行以下命令:

az dataprotection backup-instance restore initialize-for-data-recovery --datasource-type AzureKubernetesService --restore-location $region --source-datastore OperationalStore --recovery-point-id $recoverypointid --restore-configuration restoreconfig.json --target-resource-id /subscriptions/$subscriptionId/resourceGroups/$aksclusterresourcegroup/providers/Microsoft.ContainerService/managedClusters/$targetakscluster >restorerequestobject.json

注意

如果已从“保管库层”中选择恢复点,--source-datastore 为 VaultStore,则在还原配置中提供存储帐户和快照资源组。

如果尝试还原到次要区域中的群集,请将标志 --restore-location 设置为次要区域的名称,并将 --source-datastore 设置为 VaultStore。

现在,可以根据要求更新 JSON 对象,然后运行以下命令来验证该对象:

az dataprotection backup-instance validate-for-restore --backup-instance-name $backupinstancename --resource-group $backupvaultresourcegroup --restore-request-object restorerequestobject.json --vault-name $backupvault

此命令检查 AKS 群集和备份保管库是否在执行还原所需的不同资源上拥有所需的角色。 如果验证因缺少角色而失败,可以通过运行以下命令进行分配:

az dataprotection backup-instance update-msi-permissions --datasource-type AzureKubernetesService --operation Restore --permissions-scope Resource --resource-group  $backupvaultresourcegroup --vault-name $backupvault --restore-request-object restorerequestobject.json --snapshot-resource-group-id /subscriptions/$subscriptionId/resourceGroups/$snapshotresourcegroup

注意

在还原操作期间,备份保管库和 AKS 群集需要拥有分配的特定角色才能执行还原:

  • 目标 AKS 群集应在快照资源组上具有参与者角色。
  • 备份扩展随附的用户标识应在存储备份的存储帐户上(操作层)和暂存存储帐户上(保管库层)具有存储 Blob 数据参与者角色。
  • 在从操作层还原的情况下,备份保管库应在目标 AKS 群集和快照资源组上具有读取者角色。
  • 在从保管库层还原备份的情况下,备份保管库应在暂存资源组上具有参与者角色。
  • 在从保管库层还原备份的情况下,备份保管库应在暂存资源组上具有存储帐户参与者和存储 Blob 数据所有者角色。

触发还原

角色分配完成后,应再次验证还原对象。 之后,可以通过运行以下命令来触发还原操作:

az dataprotection backup-instance restore trigger --backup-instance-name $backupinstancename --restore-request-object restorerequestobject.json 

注意

完成还原作业后,暂存资源组和存储帐户中的冻结资源不会自动清理,需要手动删除。

跟踪作业

可以使用 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 Restore

后续步骤