이 빠른 시작에서는 Terraform을 사용하여 AKS(Azure Kubernetes Service) 클러스터에 대한 자격 증명 모음 백업을 구성하는 방법을 설명합니다.
AKS용 Azure Backup은 AKS 클러스터에 대한 백업을 빠르게 구성할 수 있는 클라우드 기반, 엔터프라이즈 지원, 애플리케이션 중심 백업 서비스입니다.
참고 항목
클러스터를 배포하고 AKS 백업으로 보호하는 방법에 대한 이 문서에 포함된 단계는 평가 목적으로만 사용됩니다.
프로덕션에 즉시 사용 가능한 클러스터를 배포하고 고급 백업 설정을 활용하기 전에 기본 참조 아키텍처를 숙지하여 비즈니스 요구 사항에 어떻게 부합하는지 고려하는 것이 좋습니다.
필수 조건
AKS 백업을 구성하기 전에 확인해야 할 사항은 다음과 같습니다.
이 빠른 시작에서는 Kubernetes 기본 개념을 이해하고 있다고 가정합니다. 자세한 내용은 [AKS(Azure Kubernetes Service)에 대한 Kubernetes 핵심 개념][kubernetes-concepts]를 참조하세요.
활성 구독이 있는 Azure 계정이 필요합니다. 계정이 없으면 무료 계정을 만듭니다.
Terraform을 설치 및 구성합니다.
random_pet을 사용하여 Azure 리소스 그룹 이름에 대한 임의 값 만들기
azurerm_resource_group을 사용하여 Azure 리소스 그룹 만들기
azurerm_client_config
를 사용하여 Azure 개체 ID를 가져오려면 AzureRM 공급자의 구성에 액세스합니다.azurerm_kubernetes_cluster
를 사용하여 Kubernetes 클러스터를 만듭니다.azapi_resource
를 사용하여 AzAPI 리소스를 만듭니다.azurerm_storage_account
를 사용하여 스토리지 계정을 만듭니다.azurerm_storage_container
를 사용하여 Blob 컨테이너를 만듭니다.azurerm_kubernetes_c
luster_extension`을 사용하여 AKS 클러스터에 백업 확장을 설치합니다.azurerm_data_protection_backup_vault
를 사용하여 백업 자격 증명 모음을 만듭니다.azurerm_data_protection_backup_vault
를 사용하여 AKS 클러스터에 대한 백업 정책을 만듭니다.azurerm_kubernetes_cluster_trusted_access_role_binding
을 사용하여 AKS 클러스터와 백업 자격 증명 모음 간에 신뢰할 수 있는 액세스를 사용하도록 설정합니다.azurerm_role_assignment
를 사용하여 역할 할당을 사용하도록 설정합니다.azurerm_data_protection_backup_policy_kubernetes_cluster
를 사용하여 AKS 클러스터에 대한 백업을 구성합니다.
Azure 계정에 로그인
Azure 계정에 로그인하고 다음 방법 중 하나를 사용하여 인증합니다.
Terraform은 Azure CLI를 통한 Azure에 대한 인증만 지원합니다. Azure PowerShell을 사용한 인증은 지원되지 않습니다. 따라서 Terraform 작업을 수행할 때 Azure PowerShell 모듈을 사용할 수 있지만 먼저 Azure에 대해 인증해야 합니다.
Terraform 코드 구현
AKS 백업 흐름에 대한 Terraform 코드를 구현하려면 다음 스크립트를 실행합니다.
참고 항목
Terraform 샘플 코드를 사용하여 Azure 리소스를 관리하는 방법에 대해 자세히 알아봅니다.
샘플 Terraform 코드를 테스트할 수 있는 디렉터리를 만들고, 이를 현재 디렉터리로 만듭니다.
providers.tf
라는 파일을 만들고 다음 코드를 삽입합니다.terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "3.99.0" } } } provider "azurerm" { features {} subscription_id = "<azure_subscription_id>" tenant_id = "<azure_subscription_tenant_id>" }
main.tf
라는 파일을 만들고 다음 코드를 삽입합니다.#Get Subscription and Tenant Id from Config data "azurerm_client_config" "current" { } #Create a Resource Group where Backup Vault and AKS Cluster will be created resource "azurerm_resource_group" "rg" { ___location = var.resource_group_location name = var.resource_group_name } #Create a Resource Group where Storage Account and Snapshots related to backup will be created resource "azurerm_resource_group" "backuprg" { ___location = var.backup_resource_group_location name = var.backup_resource_group_name } #Create an AKS Cluster resource "azurerm_kubernetes_cluster" "akscluster" { resource_group_name = azurerm_resource_group.rg.name name = var.aks_cluster_name ___location = azurerm_resource_group.rg.___location dns_prefix = var.dns_prefix identity { type = "SystemAssigned" } default_node_pool { name = "agentpool" vm_size = "Standard_D2_v2" node_count = var.node_count } network_profile { network_plugin = "kubenet" load_balancer_sku = "standard" } depends_on = [azurerm_resource_group.rg,azurerm_resource_group.backuprg] } #Create a Backup Vault resource "azurerm_data_protection_backup_vault" "backupvault" { name = var.backupvault_name resource_group_name = resource.azurerm_resource_group.rg.name ___location = resource.azurerm_resource_group.rg.___location datastore_type = var.datastore_type redundancy = var.redundancy identity { type = "SystemAssigned" } depends_on = [azurerm_kubernetes_cluster.akscluster] } #Create a Backup Policy with 4 hourly backups and 7 day retention duration resource "azurerm_data_protection_backup_policy_kubernetes_cluster" "policy" { name = var.backuppolicy_name resource_group_name = var.resource_group_name vault_name = var.backupvault_name backup_repeating_time_intervals = ["R/2024-04-14T06:33:16+00:00/PT4H"] default_retention_rule { life_cycle { duration = "P7D" data_store_type = "OperationalStore" } } depends_on = [resource.azurerm_data_protection_backup_vault.backupvault] } #Create a Trusted Access Role Binding between AKS Cluster and Backup Vault resource "azurerm_kubernetes_cluster_trusted_access_role_binding" "trustedaccess" { kubernetes_cluster_id = azurerm_kubernetes_cluster.akscluster.id name = "backuptrustedaccess" roles = ["Microsoft.DataProtection/backupVaults/backup-operator"] source_resource_id = azurerm_data_protection_backup_vault.backupvault.id depends_on = [resource.azurerm_data_protection_backup_vault.backupvault, azurerm_kubernetes_cluster.akscluster] } #Create a Backup Storage Account provided in input for Backup Extension Installation resource "azurerm_storage_account" "backupsa" { name = "tfaksbackup1604" resource_group_name = azurerm_resource_group.backuprg.name ___location = azurerm_resource_group.backuprg.___location account_tier = "Standard" account_replication_type = "LRS" depends_on = [azurerm_kubernetes_cluster_trusted_access_role_binding.trustedaccess] } #Create a Blob Container where backup items will stored resource "azurerm_storage_container" "backupcontainer" { name = "tfbackup" storage_account_name = azurerm_storage_account.backupsa.name container_access_type = "private" depends_on = [azurerm_storage_account.backupsa] } #Create Backup Extension in AKS Cluster resource "azurerm_kubernetes_cluster_extension" "dataprotection" { name = var.backup_extension_name cluster_id = azurerm_kubernetes_cluster.akscluster.id extension_type = var.backup_extension_type configuration_settings = { "configuration.backupStorageLocation.bucket" = azurerm_storage_container.backupcontainer.name "configuration.backupStorageLocation.config.storageAccount" = azurerm_storage_account.backupsa.name "configuration.backupStorageLocation.config.resourceGroup" = azurerm_storage_account.backupsa.resource_group_name "configuration.backupStorageLocation.config.subscriptionId" = data.azurerm_client_config.current.subscription_id "credentials.tenantId" = data.azurerm_client_config.current.tenant_id } depends_on = [azurerm_storage_container.backupcontainer] } #Assign Role to Extension Identity over Storage Account resource "azurerm_role_assignment" "extensionrole" { scope = azurerm_storage_account.backupsa.id role_definition_name = "Storage Account Contributor" principal_id = azurerm_kubernetes_cluster_extension.dataprotection.aks_assigned_identity[0].principal_id depends_on = [azurerm_kubernetes_cluster_extension.dataprotection] } #Assign Role to Backup Vault over AKS Cluster resource "azurerm_role_assignment" "vault_msi_read_on_cluster" { scope = azurerm_kubernetes_cluster.akscluster.id role_definition_name = "Reader" principal_id = azurerm_data_protection_backup_vault.backupvault.identity[0].principal_id depends_on = [azurerm_kubernetes_cluster.akscluster,resource.azurerm_data_protection_backup_vault.backupvault] } #Assign Role to Backup Vault over Snapshot Resource Group resource "azurerm_role_assignment" "vault_msi_read_on_snap_rg" { scope = azurerm_resource_group.backuprg.id role_definition_name = "Reader" principal_id = azurerm_data_protection_backup_vault.backupvault.identity[0].principal_id depends_on = [azurerm_kubernetes_cluster.akscluster,resource.azurerm_data_protection_backup_vault.backupvault] } #Assign Role to AKS Cluster over Snapshot Resource Group resource "azurerm_role_assignment" "cluster_msi_contributor_on_snap_rg" { scope = azurerm_resource_group.backuprg.id role_definition_name = "Contributor" principal_id = try(azurerm_kubernetes_cluster.akscluster.identity[0].principal_id,null) depends_on = [azurerm_kubernetes_cluster.akscluster,resource.azurerm_kubernetes_cluster.akscluster,resource.azurerm_resource_group.backuprg] } #Create Backup Instance for AKS Cluster resource "azurerm_data_protection_backup_instance_kubernetes_cluster" "akstfbi" { name = "example" ___location = azurerm_resource_group.backuprg.___location vault_id = azurerm_data_protection_backup_vault.backupvault.id kubernetes_cluster_id = azurerm_kubernetes_cluster.akscluster.id snapshot_resource_group_name = azurerm_resource_group.backuprg.name backup_policy_id = azurerm_data_protection_backup_policy_kubernetes_cluster.policy.id backup_datasource_parameters { excluded_namespaces = [] excluded_resource_types = [] cluster_scoped_resources_enabled = true included_namespaces = [] included_resource_types = [] label_selectors = [] volume_snapshot_enabled = true } depends_on = [ resource.azurerm_data_protection_backup_vault.backupvault, azurerm_data_protection_backup_policy_kubernetes_cluster.policy, azurerm_role_assignment.extensionrole, azurerm_role_assignment.vault_msi_read_on_cluster, azurerm_role_assignment.vault_msi_read_on_snap_rg, azurerm_role_assignment.cluster_msi_contributor_on_snap_rg ] }
variables.tf
라는 파일을 만들고 다음 코드를 삽입합니다.variable "aks_cluster_name" { type = string default = "Contoso_AKS_TF" description = "Name of the AKS Cluster." } variable "backup_extension_name" { type = string default = "azure-aks-backup" description = "Name of the AKS Cluster Extension." } variable "backup_extension_type" { type = string default = "microsoft.dataprotection.kubernetes" description = "Type of the AKS Cluster Extension." } variable "dns_prefix" { type = string default = "contoso-aks-dns-tf" description = "DNS Name of AKS Cluster made with Terraform" } variable "node_count" { type = number description = "The initial quantity of nodes for the node pool." default = 3 } variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "backup_resource_group_name" { type = string default = "Contoso_TF_Backup_RG" description = "Location of the resource group." } variable "backup_resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name" { type = string default = "Contoso_TF_RG" description = "Location of the resource group." } variable "cluster_id" { type = string default = "/subscriptions/c3d3eb0c-9ba7-4d4c-828e-cb6874714034/resourceGroups/Contoso_TF_RG/providers/Microsoft.ContainerService/managedClusters/Contoso_AKS_TF" description = "Location of the resource group." } variable "backupvault_name" { type = string default = "BackupVaultTF" description = "Name of the Backup Vault" } variable "datastore_type" { type = string default = "OperationalStore" } variable "redundancy" { type = string default = "LocallyRedundant" } variable "backuppolicy_name" { type = string default = "aksbackuppolicytfv1" }
outputs.tf
라는 파일을 만들고 다음 코드를 삽입합니다.output "aks_resource_group" { value = azurerm_resource_group.rg.name } output "snapshot_resource_group" { value = azurerm_resource_group.backuprg.name } output "kubernetes_cluster_name" { value = azurerm_kubernetes_cluster.akscluster.name } output "backup_vault_name" { value = azurerm_data_protection_backup_vault.backupvault.name } output "backup_instance_id" { value = azurerm_data_protection_backup_instance_kubernetes_cluster.akstfbi.id }
Terraform 초기화
terraform init를 실행하여 Terraform 배포를 초기화합니다. 이 명령은 Azure 리소스를 관리하는 데 필요한 Azure 공급자를 다운로드합니다.
terraform init -upgrade
주요 정보:
-
-upgrade
매개 변수는 필요한 공급자 플러그 인을 구성의 버전 제약 조건을 준수하는 최신 버전으로 업그레이드합니다.
Terraform 실행 계획 만들기
terraform plan을 실행하여 실행 계획을 만듭니다.
terraform plan -out main.tfplan
주요 정보:
-
terraform plan
명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다. - 선택 사항인
-out
매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다.-out
매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.
Terraform 실행 계획 적용
terraform apply를 실행하여 실행 계획을 클라우드 인프라에 적용합니다.
terraform apply main.tfplan
주요 정보:
- 예시
terraform apply
명령은 이전에terraform plan -out main.tfplan
를 실행했다고 가정합니다. -
-out
매개 변수에 다른 파일 이름을 지정한 경우terraform apply
에 대한 호출에서 동일한 파일 이름을 사용합니다. -
-out
매개 변수를 사용하지 않은 경우 매개 변수 없이terraform apply
를 호출합니다.
Azure의 Terraform 문제 해결
Azure에서 Terraform을 사용할 때 일반적인 문제가 발생할 수 있습니다. 문제 해결 방법을 알아봅니다.
다음 단계
이 빠른 시작에서는 Kubernetes 클러스터를 배포하고, 백업 자격 증명 모음을 만들고, Kubernetes 클러스터에 대한 백업을 구성하는 방법을 알아보았습니다.
자세히 알아보기:
AKS 백업 개요. Azure CLI를 사용하여 AKS 클러스터를 복원합니다. AKS용 Azure Backup을 사용하는 방법.