AKS(Azure Kubernetes Service) 사용자 할당 관리 ID 사용

이 문서에서는 새 AKS 클러스터 또는 기존 AKS 클러스터에서 사용자 할당 관리 ID를 사용하도록 설정하고, 사용자 할당 관리 ID의 주체 ID를 가져오고, 사용자 할당 관리 ID에 대한 역할 할당을 추가하는 방법을 설명합니다.

사전 요구 사항

  • AKS에서 사용할 수 있는 다양한 유형의 관리 ID와 Azure 리소스에 안전하게 액세스하는 방법을 이해하려면 AKS(Azure Kubernetes Service) 관리 ID의 뷰를 참조하세요.

  • 명령을 사용하여 az account set 구독을 현재 활성 구독으로 설정합니다.

    az account set --subscription <subscription-id>
    
  • 기존 Azure 리소스 그룹입니다. 없는 경우 az group create 명령을 사용하여 하나를 생성할 수 있습니다.

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  • Azure CLI 버전 2.23.0 이상이 설치되었습니다. az --version을 실행하여 버전을 찾습니다. 설치하거나 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.
  • 사용자 할당 관리 ID를 사용하도록 기존 클러스터를 업데이트하려면 Azure CLI 버전 2.49.0 이상이 설치되어 있어야 합니다.
  • Terraform이 로컬로 설치되었습니다. 설치 지침은 Terraform 설치를 참조하세요.

제한점

  • 관리 ID를 사용하여 클러스터를 만든 후에는 서비스 주체를 사용하도록 다시 전환할 수 없습니다.
  • 관리 ID가 사용하도록 설정된 클러스터를 다른 테넌트로 이동하거나 마이그레이션하는 것은 지원되지 않습니다.
  • 클러스터에 Microsoft Entra Pod 관리 ID(aad-pod-identity)가 사용하도록 설정된 경우 Node-Managed ID(NMI) Pod는 노드의 iptable을 수정하여 Azure IMDS(인스턴스 메타데이터) 엔드포인트에 대한 호출을 가로채도록 합니다. 이 구성은 특정 Pod가 aad-pod-identity를 사용하지 않더라도 IMDS 엔드포인트에 대한 모든 요청이 NMI에 의해 가로채진다는 것을 의미합니다.
    • AzurePodIdentityException 사용자 지정 리소스 정의(CRD)를 구성하여 CRD에 정의된 레이블과 일치하는 Pod에서 시작된 IMDS 엔드포인트로의 요청이 NMI에서 처리되지 않고 프록시되도록 지정할 수 있습니다. kubernetes.azure.com/managedby: aks 레이블이 있는 시스템 포드를 kube-system 네임스페이스에서 제외하려면 AzurePodIdentityException CRD를 구성하십시오. 자세한 내용은 AKS(Azure Kubernetes Service) 참조하세요.
    • 예외를 구성하려면 mic-exception YAML 설치합니다.
  • Azure 미국 정부 클라우드의 USDOD Central, USDOD 동부 및 USGov 아이오와 지역은 사용자 할당 관리 ID를 사용하여 클러스터를 만드는 것을 지원하지 않습니다.

클러스터 업데이트 고려 사항

클러스터를 업데이트할 때 다음 정보를 고려합니다.

  • 업데이트는 사용할 VHD 업데이트가 있는 경우에만 작동합니다. 최신 VHD를 실행하는 경우 다음 VHD를 사용할 수 있을 때까지 기다린 후에 업데이트를 수행해야 합니다.
  • Azure CLI 마이그레이션 후 추가 기능의 사용 권한이 올바르게 설정되었는지 확인합니다. Azure CLI 사용하여 마이그레이션 작업을 수행하지 않는 경우 추가 기능 ID의 사용 권한을 직접 처리해야 합니다. ARM(Azure Resource Manager) 템플릿을 사용하는 예제는 ARM 템플릿을 사용하여 Azure 역할 할당 참조하세요.
  • 클러스터가 Azure Container Registry(ACR)에서 이미지를 끌어오기 위해 --attach-acr 사용하는 경우 클러스터를 업데이트한 후 az aks update --resource-group <resource-group-name> --name <aks-cluster-name> --attach-acr <acr-resource-id> 명령을 실행하여 관리 ID에 사용되는 새로 만든 kubelet이 ACR에서 끌어올 수 있는 권한을 얻도록 해야 합니다. 그렇지 않으면 업데이트 후 ACR에서 끌어올 수 없습니다.

사용자 할당 관리 ID 만들기

아직 사용자가 할당한 관리 ID 리소스가 없으면 az identity create 명령을 사용하여 리소스를 만듭니다.

az identity create \
    --name <identity-name> \
    --resource-group <resource-group-name>

다음과 같은 예시 출력과 유사하게 출력해야 합니다.

{                                  
    "clientId": "<client-id>",
    "clientSecretUrl": "<clientSecretUrl>",
    "id": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>",
    "location": "<location>",
    "name": "<identity-name>",
    "principalId": "<principal-id>",
    "resourceGroup": "<resource-group-name>",
    "tags": {},
    "tenantId": "<tenant-id>",
    "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
}

사용자가 할당한 관리 ID의 주체 ID를 가져옵니다.

az identity show 명령을 사용하여 사용자 할당 관리 ID의 주체 ID를 가져옵니다.

CLIENT_ID=$(az identity show \
    --name <identity-name> \
    --resource-group <resource-group-name> \
    --query principalId \
    --output tsv)

사용자 할당 관리 ID의 리소스 ID를 가져옵니다.

명령을 사용하여 사용자 할당 관리 ID의 리소스 ID를 az identity show 가져옵니다.

RESOURCE_ID=$(az identity show \
    --name <identity-name> \
    --resource-group <resource-group-name> \
    --query id \
    --output tsv)

새 AKS 클러스터에서 사용자 할당 관리 ID 사용

az aks create 명령과 --assign-identity 매개 변수에 사용자 할당 관리 ID의 리소스 ID를 설정하여 AKS 클러스터를 만듭니다.

az aks create \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --network-plugin azure \
    --vnet-subnet-id <vnet-subnet-id> \
    --dns-service-ip 10.2.0.10 \
    --service-cidr 10.2.0.0/24 \
    --assign-identity $RESOURCE_ID \
    --generate-ssh-keys

기존 클러스터를 업데이트하여 사용자가 지정한 관리 ID를 사용합니다.

명령을 사용하여 사용자 할당 관리 ID를 사용하도록 기존 클러스터를 az aks update 업데이트하고 --assign-identity 매개 변수를 사용자 할당 관리 ID의 리소스 ID로 설정합니다.

az aks update \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --enable-managed-identity \
    --assign-identity $RESOURCE_ID

사용자가 할당한 관리 ID를 사용하여 클러스터를 성공적으로 업데이트할 경우 출력은 다음 출력 예와 유사해야 합니다.

...
    "identity": {
    "principalId": null,
    "tenantId": null,
    "type": "UserAssigned",
    "userAssignedIdentities": {
        "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>": {
        "clientId": "<client-id>",
        "principalId": "<principal-id>"
        }
    }
    },
...

서비스 주체 대신 사용자 할당 관리 ID를 사용하도록 클러스터를 업데이트한 후 제어 평면 및 Pod는 Azure 다른 서비스에 액세스할 때 권한 부여를 위해 사용자 할당 관리 ID를 사용합니다. Kubelet은 노드 풀도 업그레이드할 때까지 서비스 주체를 계속 사용합니다. 노드 풀을 업그레이드할 때 노드 풀의 노드가 차단 및 드레이닝되고 이미지로 다시 설치되면서 AKS 클러스터에 대해 가동 중지 시간이 발생합니다. 노드의 명령을 사용하여 사용자 할당 관리 ID로 업데이트할 수 있습니다.

az aks nodepool upgrade \
  --resource-group <resource-group-name> \
  --cluster-name <aks-cluster-name> \
  --name <node-pool-name> \
  --node-image-only

메모

컨트롤 플레인에 대한 관리 ID를 시스템이 할당한 ID에서 사용자가 할당한 ID로 마이그레이션해도 컨트롤 플레인 및 에이전트 풀에 가동 중지 시간이 발생하지 않습니다. 컨트롤 플레인 구성 요소는 다음 토큰이 새로 고쳐질 때까지 최대 몇 시간 동안 이전 시스템 할당 ID로 계속 진행됩니다.

사용자 할당 관리 ID에 Azure RBAC 역할 할당

명령을 사용하여 사용자 할당 관리 ID에 대한 역할 할당을 추가합니다 az role assignment create . 다음 예제에서는 Key Vault 비밀 사용자 역할을 사용자 할당 관리 ID에 할당하여 key vault 비밀에 액세스할 수 있는 권한을 부여합니다. 역할 할당은 키 자격 증명 모음 리소스에 한정됩니다.

az role assignment create \
    --assignee <client-id> \
    --role "Key Vault Secrets User" \
    --scope "<key-vault-resource-id>"

메모

클러스터의 관리 ID에 부여된 권한이 전파되는 데 최대 60분이 걸릴 수 있습니다.

Terraform 구성 파일 만들기

Terraform 구성 파일은 Terraform에서 만들고 관리하는 인프라를 정의합니다.

  1. main.tf 파일을 만들고 다음 코드를 추가하여 Terraform 버전을 정의하고 Azure 공급자를 지정합니다.

    terraform {
    required_version = ">= 1.0"
    required_providers {
      azurerm = {
        source  = "hashicorp/azurerm"
        version = "~> 4.0"
      }
     }
    }
    provider "azurerm" {
     features {}
    }
    
  2. 다음 코드를 main.tf 추가하여 Azure 리소스 그룹을 만듭니다. 필요에 따라 리소스 그룹의 이름과 위치를 자유롭게 변경할 수 있습니다.

    resource "azurerm_resource_group" "example" {
     name     = "aks-rg"
     location = "East US"
    }
    

Terraform을 사용하여 사용자 할당 관리 ID를 사용하여 AKS 클러스터 만들기

다음 코드를 main.tf에 추가하여 사용자 할당 관리 ID와 AKS 클러스터를 생성합니다. 이 클러스터는 해당 ID를 사용합니다.

resource "azurerm_user_assigned_identity" "uai" {
 name                = "aks-user-identity"
 resource_group_name = azurerm_resource_group.example.name
 location            = azurerm_resource_group.example.location
}
resource "azurerm_kubernetes_cluster" "user_assigned" {
 name                = "aks-user"
 location            = azurerm_resource_group.example.location
 resource_group_name = azurerm_resource_group.example.name
 dns_prefix          = "aksuser"
 identity {
   type         = "UserAssigned"
   identity_ids = [azurerm_user_assigned_identity.uai.id]
 }
 default_node_pool {
   name       = "system"
   node_count = 1
   vm_size    = "Standard_DS2_v2"
 }
}

Terraform을 사용하여 사용자 할당 관리 ID에 대한 역할 할당 추가

다음 코드를 추가하여 main.tf 사용자 할당 관리 ID에 대한 역할 할당을 만듭니다. 이 예제에서는 Key Vault 비밀 사용자 역할을 사용자 할당 관리 ID에 할당하여 key vault 비밀에 액세스할 수 있는 권한을 부여합니다. 역할 할당은 키 자격 증명 모음 리소스에 한정됩니다.

resource "azurerm_role_assignment" "user_assigned_key_vault_secrets_user" {
 scope                = azurerm_resource_group.example.id
 role_definition_name = "Key Vault Secrets User"
 principal_id         = azurerm_user_assigned_identity.uai.principal_id
}

Terraform 초기화

main.tf 파일이 있는 디렉터리에서 terraform init 명령어를 사용해 Terraform을 초기화하세요. 이 명령은 Terraform을 사용하여 Azure 리소스를 관리하는 데 필요한 Azure 공급자를 다운로드합니다.

terraform init

Terraform 실행 계획 만들기

terraform plan 명령을 사용하여 Terraform 실행 계획을 만듭니다. 이 명령은 Terraform이 Azure 구독에서 만들거나 수정할 리소스를 보여 줍니다.

terraform plan

Terraform 구성 적용

실행 계획을 검토하고 확인한 후 명령을 사용하여 Terraform 구성을 적용합니다 terraform apply . 이 명령은 Azure 구독의 main.tf 파일에 정의된 리소스를 만들거나 수정합니다.

terraform apply

Terraform 배포 확인

Terraform 구성을 적용한 후, 출력 결과를 필터링하고 ID 정보(Identity Information)를 표시하기 위해 az aks show 매개 변수를 사용하여 [--query][az-aks-show] 명령을 이용하여 배포를 확인할 수 있습니다. 다음은 그 예입니다.

az aks show \
 --name <cluster-name> \
 --resource-group <resource-group> \
 --query identity.type \
 --output tsv

AKS의 관리 ID에 대한 자세한 내용은 다음 문서를 참조하세요.