Azure CLI を使用して Azure Kubernetes Service を復元する
この記事では、Azure CLI を使用して、Azure Backup で作成された復元ポイントから Azure Kubernetes クラスターを復元する方法について説明します。
Azure Backup では、クラスターにインストールする必要があるバックアップ拡張機能を使用して、AKS クラスター (クラスター リソースとクラスターにアタッチされている永続ボリューム) をバックアップできるようになりました。 バックアップ コンテナーは、このバックアップ拡張機能を介してクラスターと通信し、バックアップ操作と復元操作を実行します。
"元の場所への復旧 (OLR)" (バックアップされた AKS クラスターでの復元) と "代替場所への復旧 (ALR)" (別の AKS クラスターでの復元) の両方を実行できます。 項目レベルの復旧 (ILR) バックアップから、復元する項目を選ぶこともできます。
注意
復元操作を開始する前に、ターゲット クラスターにバックアップ拡張機能がインストールされ、Backup ボールトに対して信頼されたアクセスが有効になっている必要があります。 詳細については、こちらを参照してください。
開始する前に
AKS バックアップを使用すると、(バックアップされた) 元の AKS クラスターおよび代替 AKS クラスターに復元できます。 AKS バックアップでは、完全復元と項目レベルの復元を実行できます。 復元構成を使い、復元されるクラスター リソースに基づいてパラメーターを定義できます。
ターゲット AKS クラスターにバックアップ拡張機能をインストールする必要があります。 また、Backup コンテナーと 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
信頼されたアクセスを確認する
Backup コンテナーとターゲット 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
復元要求を準備する
復元構成を準備し、ターゲット AKS クラスターに復元する項目を定義するには、az dataprotection backup-instance initialize-restoreconfig
コマンドを実行します。
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
: 復元中に、クラスターにバックアップと同じ名前のリソースが存在する場合は、競合の処理方法を選択できます。 バックアップ項目を復元しない "スキップ" と、バックアップに格納されているリソースを使用してクラスター内リソースの変更可能なフィールドを変更する "更新" という 2 つのオプションがあります。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
Note
--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
Note
復元操作中、Backup ボールトと AKS クラスターには、復元を実行するために特定のロールが割り当てられている必要があります。
- "ターゲット AKS" クラスターには、"スナップショット リソース グループ" に対する "共同作成者" ロールが必要です。
- バックアップ拡張機能にアタッチされている "ユーザー ID" には、"ストレージ アカウント" に対する "ストレージ BLOB データ共同作成者" ロールが必要です。このロールは、運用層の場合はバックアップが格納され、コンテナー層の場合は *"ステージング ストレージ アカウント" に格納されます。
- "バックアップ コンテナー" には、運用レベルから復元する場合は、"ターゲット AKS クラスター" と "Snapshot リソース グループ" に対して "閲覧者" ロールが必要です。
- "バックアップ コンテナー" には、コンテナー層からバックアップを復元する場合、"ステージング リソース グループ" に対する "共同作成者"ロールが必要です。
- "バックアップ コンテナー" には、コンテナー層からバックアップを復元する場合に "ステージング リソース グループ" に対する "ストレージ アカウント共同作成者" と "ストレージ BLOB データ所有者" ロールが必要です。
復元のトリガー
ロールの割り当てが完了したら、復元オブジェクトをもう一度検証する必要があります。 その後、次のコマンドを実行して復元操作をトリガーできます。
az dataprotection backup-instance restore trigger --backup-instance-name $backupinstancename --restore-request-object restorerequestobject.json
Note
ステージング リソース グループとストレージ アカウントでハイドレートされたリソースは、復元ジョブが完了した後に自動的にクリーンアップされないため、手動で削除します。
ジョブの追跡
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