AKS(Azure Kubernetes Service) 클러스터의 비밀 저장소 CSI 드라이버에 대한 Azure Key Vault 공급자 사용

Secrets Store Container Storage Interface(CSI) 드라이버용 Azure Key Vault 공급자는 CSI 볼륨을 통해 Azure Key Vault를 시크릿 저장소로 Azure Kubernetes Service(AKS) 클러스터에 통합할 수 있게 해줍니다.

기능

  • CSI 볼륨을 사용하여 Pod에 비밀, 키 및 인증서를 탑재합니다.
  • CSI 인라인 볼륨을 지원합니다.
  • 단일 볼륨으로 여러 비밀 저장소 개체 탑재를 지원합니다.
  • 사용자 지정 리소스 정의 (CRD)를 사용하여 Pod SecretProviderClass의 이식성을 지원합니다.
  • Windows 컨테이너를 지원합니다.
  • Kubernetes 비밀과 동기화합니다.
  • 탑재된 콘텐츠 및 동기화된 Kubernetes 비밀의 자동 순환을 지원합니다.

제한 사항

  • ConfigMap 또는 SecretsubPath 볼륨 탑재로 사용하는 컨테이너는 비밀이 회전될 때 자동으로 업데이트되지 않습니다. 이는 Kubernetes의 제한 사항입니다. 변경 내용을 적용하려면 애플리케이션에서 파일 시스템의 변경 내용을 확인하거나 Pod를 다시 시작하여 변경된 파일을 다시 로드해야 합니다. 자세한 내용은 비밀 저장소 CSI 드라이버의 알려진 제한 사항을 참조하세요.
  • 추가 기능은 노드 리소스 그룹(azurekeyvaultsecretsprovider-xxxxx)에 명명된 MC_ 관리 ID를 만들고 가상 머신 확장 집합에 자동으로 할당합니다. 이 관리 ID 또는 사용자 고유의 관리 ID를 사용하여 키 자격 증명 모음에 액세스할 수 있습니다. ID 생성을 방지할 수는 없습니다.

필수 구성 요소

  • Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

  • Terraform 버전 1.6 이상입니다.

  • Azure CLI 설치되고 로그인되었습니다. 최신 버전을 설치합니다.

  • AKS 및 Key Vault 리소스를 만들 수 있는 권한입니다.

  • 다음 명령을 사용하여 Azure CLI Azure 구독을 설정합니다. <subscriptionId>는 구독 ID로 바꿉니다.

    az account set --subscription <subscriptionId>
    

네트워크

역할

AKS 클러스터 만들기

비밀 저장소 CSI 드라이버 지원을 위한 Azure Key Vault 공급자를 사용하여 AKS 클러스터를 만듭니다.

  1. 명령에 사용되는 변수를 만들어 AKS 클러스터 및 Key Vault를 만듭니다.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    

    Azure Key Vault 이름은 전역적으로 고유해야 하며 하이픈을 포함한 영숫자 및 3-24자여야 합니다. 키 볼트 이름은 KEYVAULT_NAME 변수의 myKeyVault 값과 RANDOM_STRING 변수의 10자 문자열을 연결하여 생성됩니다.

  2. az group create 명령을 사용하여 Azure 리소스 그룹을 만듭니다.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. az aks create 매개 변수와 함께 --enable-addons azure-keyvault-secrets-provider 명령을 사용하여 비밀 저장소 CSI 드라이버 기능에 대한 Azure Key Vault 공급자를 사용하여 AKS 클러스터를 만듭니다.

    --enable-addons 매개 변수는 키 자격 증명 모음에 인증하는 데 사용할 수 있는 사용자 할당 관리 ID azurekeyvaultsecretsprovider-xxxx를 생성합니다. 관리 ID는 노드 리소스 그룹(MC_)에 저장되고 Virtual Machine Scale Set에 자동으로 할당됩니다. 이 관리 ID 또는 사용자 고유의 관리 ID를 사용하여 키 자격 증명 모음에 액세스할 수 있습니다. ID 생성을 방지할 수는 없습니다.

    az aks create \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --enable-addons azure-keyvault-secrets-provider \
      --generate-ssh-keys
    

    팁 (조언)

    Microsoft Entra 워크로드 ID를 사용하려면 명령에 az aks create--enable-oidc-issuer 매개 변수가 포함되어야 합니다.

AKS 클러스터 만들기

다음 구성을 사용하여 main.tf 파일을 만들어 비밀 저장소 CSI 드라이버 지원을 위한 Azure Key Vault 공급자를 사용하여 AKS 클러스터를 만듭니다.

  1. Terraform 구성을 만듭니다.

    terraform {
     required_version = ">= 1.6.0"
     required_providers {
       azurerm = {
         source  = "hashicorp/azurerm"
         version = "~> 4.0"
       }
     }
    }
    provider "azurerm" {
     features {}
    }
    data "azurerm_client_config" "current" {}
    resource "azurerm_resource_group" "rg" {
     name     = "aks-rg"
     location = "East US"
    }
    
  2. AKS 클러스터를 만듭니다.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "aks-cluster"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     dns_prefix          = "akscsi"
     default_node_pool {
       name       = "system"
       node_count = 1
       vm_size    = "Standard_DS2_v2"
     }
     identity {
       type = "SystemAssigned"
     }
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  3. 구성을 배포합니다. Bash 세션을 구성하고 다음 명령을 실행하여 리소스를 배포합니다.

    terraform init
    terraform validate
    terraform plan
    terraform apply
    

기존 AKS 클러스터 업데이트

비밀 저장소 CSI 드라이버 지원을 위해 Azure Key Vault 공급자를 사용하여 기존 AKS 클러스터를 업데이트합니다.

  1. 명령에 사용되는 변수를 만듭니다. 기존 AKS 클러스터 또는 Key Vault를 업데이트하기 위해 필요에 따라 값을 바꿉니다.

    예를 들어, 기존 키 자격 증명 모음을 사용하는 경우 KEYVAULT_NAME 변수를 사용하지 않고 RANDOM_STRING 변수의 값을 바꿉니다.

    키 자격 증명 저장소가 없는 경우, Azure Key Vault 이름은 전 세계적으로 고유해야 하며, 하이픈을 포함한 영숫자로, 3에서 24자 사이여야 합니다. 키 볼트 이름은 KEYVAULT_NAME 변수의 myKeyVault 값과 RANDOM_STRING 변수의 10자 문자열을 연결하여 생성됩니다. 이 문서의 뒷부분에서 키 자격 증명 모음을 만들 수 있습니다.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    
  2. 기존 AKS 클러스터를 Azure Key Vault 공급자를 통해 비밀 저장소 CSI 드라이버 기능을 위해 az aks enable-addons 명령을 사용하여 업데이트하고, azure-keyvault-secrets-provider 추가 기능을 사용하도록 설정하십시오. 추가 기능은 키 자격 증명 모음에서 인증을 받는 데 사용할 수 있는 사용자가 할당한 관리 ID를 만듭니다.

    az aks enable-addons \
      --addons azure-keyvault-secrets-provider \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    

    Azure Key Vault 비밀 공급자를 사용하도록 설정한 후 AKS는 키 자격 증명 모음에 인증하는 데 사용할 수 있는 관리 azurekeyvaultsecretsprovider-xxxx ID를 만듭니다. 관리 ID는 노드 리소스 그룹(MC_)에 저장되고 Virtual Machine Scale Set에 자동으로 할당됩니다. 이 관리 ID 또는 사용자 고유의 관리 ID를 사용하여 키 자격 증명 모음에 액세스할 수 있습니다. ID 생성을 방지할 수는 없습니다.

기존 AKS 클러스터 업데이트

다음 구성으로 main.tf 파일을 만들어 비밀 저장소 CSI 드라이버 지원을 위한 Azure Key Vault 공급자를 사용하여 기존 AKS 클러스터를 업데이트합니다.

  1. 기존 AKS 클러스터 업데이트.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "<existing-cluster>"
     resource_group_name = "<resource-group>"
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  2. 구성을 배포합니다. Bash 세션을 구성하고 다음 명령을 실행하여 구성을 배포합니다.

    Run the following commands to apply the updates:
    
    terraform init
    terraform validate
    terraform plan
    terraform apply
    

관리 ID 및 키 보관소 공급자 설치 확인

Terraform을 사용하여 새 클러스터를 만들거나 기존 클러스터를 업데이트한 경우 다음 명령과 같은 $CLUSTER_NAME 변수를 Terraform 구성에서 사용한 값으로 바꿔야 합니다.

관리 ID 확인

다음 단계를 사용하여 관리 ID가 만들어지고 클러스터의 Virtual Machine Scale Set에 할당되었는지 확인합니다.

  1. 명령을 사용하여 관리 ID가 만들어지고 클러스터에 할당되었는지 확인합니다 az aks show .

    az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query addonProfiles
    
    {
      "azureKeyvaultSecretsProvider": {
        "config": {
          "enableSecretRotation": "false",
          "rotationPollInterval": "2m"
        },
        "enabled": true,
        "identity": {
          "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
          "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
          "resourceId": "/subscriptions/<subscriptionID>/resourcegroups/MC_myResourceGroup_myAKSCluster_eastus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/azurekeyvaultsecretsprovider-myakscluster"
        }
      }
    }
    

    속성은 resourceId 리소스 그룹 및 ID의 이름을 azurekeyvaultsecretsprovider-myakscluster표시합니다.

  2. 관리 ID가 노드 리소스 그룹의 Virtual Machine Scale Set에 할당되었는지 확인합니다.

    NODE_RG=$(az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query nodeResourceGroup --output tsv)
    
    VMSS_NAME=$(az vmss list \
      --resource-group $NODE_RG \
      --query [].name --output tsv)
    
    az vmss show --name $VMSS_NAME --resource-group $NODE_RG --query '[id, identity]'
    

    출력 결과에는 Virtual Machines Scale Sets의 Microsoft.Compute/virtualMachineScaleSets 리소스 ID 및 userAssignedIdentities에 대한 리소스 ID를 포함한 azurekeyvaultsecretsprovider-myakscluster 속성이 표시되며 해당 Virtual Machine Scale Set에 할당되어 있음을 확인할 수 있습니다.

비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자 설치 확인

  1. az aks get-credentials 명령을 사용하여 AKS 클러스터 자격 증명을 가져옵니다.

    az aks get-credentials \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    
  2. kubectl get pods 명령을 사용하여 secrets-store-csi-driver 네임스페이스에서 secrets-store-provider-azurekube-system 레이블이 있는 모든 Pod를 나열하여 설치가 완료되었는지 확인합니다.

    kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)' -o wide
    

    -o wide 플래그는 각 포드가 실행되는 노드를 출력에 포함합니다.

    출력은 다음 예제 출력과 비슷하게 표시됩니다.

    NAME                                     READY   STATUS    RESTARTS   AGE    NODE
    aks-secrets-store-csi-driver-4vpkj       3/3     Running   2          4m25s  aks-nodepool1-12345678-vmss000002
    aks-secrets-store-csi-driver-ctjq6       3/3     Running   2          4m21s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-csi-driver-tlvlq       3/3     Running   2          4m24s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-5p4nb   1/1     Running   0          4m21s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-6pqmv   1/1     Running   0          4m24s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-provider-azure-f5qlm   1/1     Running   0          4m25s  aks-nodepool1-12345678-vmss000002
    

새 키 볼트 생성

az keyvault create 명령을 실행하여 Azure RBAC가 활성화된 새 키 자격 증명 모음을 만드세요.

az keyvault create \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --enable-rbac-authorization

매개 변수를 포함하지 않더라도 새 키 자격 증명 보관소를 만들 때 Azure RBAC가 기본 설정으로 활성화됩니다.

Key Vault 권한 모델 및 Azure RBAC에 대한 자세한 내용은 Azure 역할 기반 액세스 제어를 사용하여 Key Vault 키, 인증서 및 비밀에 대한 액세스 제공을 참조하세요.

기존의 키 볼트를 업데이트합니다.

az keyvault update 명령을 실행하여 Azure 역할 기반 액세스 제어(RBAC)를 사용하여 기존 키 자격 증명 모음을 업데이트합니다. Azure RBAC를 사용하지 않도록 설정한 기존 키 자격 증명 모음을 업데이트할 때 Azure RBAC를 사용하도록 설정하려면 --enable-rbac-authorization 매개 변수가 필요합니다.

az keyvault update \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --enable-rbac-authorization

키 자격 증명 모음 권한 모델 및 Azure RBAC에 대한 자세한 내용은 Azure 역할 기반 액세스 제어를 사용하여 Key Vault 키, 인증서 및 비밀에 대한 액세스 제공을 참조하세요.

키 자격 증명 모음에 역할 할당 및 비밀 추가

  1. az keyvault show 명령을 실행하여 키 자격 증명 모음에 Azure RBAC가 활성화되어 있는지 확인합니다.

    az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query properties.enableRbacAuthorization
    

    출력은 true이어야 합니다.

  2. 다음 단계에서 키 자격 증명 모음 비밀을 추가할 수 있도록 az role assignment create 명령을 사용하여 사용자 계정에 키 자격 증명 모음 범위 내 역할 할당을 추가합니다.

    고유 식별자가 있는 b86a8fe4-44ce-4948-aee5-eccb2c155cd7 역할이 추가되고 이름 또는 고유 식별자를 사용할 수 있습니다. 역할의 고유 식별자를 사용하는 것은 역할 이름이 변경되는 경우 문제를 방지하는 모범 사례입니다.

    KEYVAULT_ID=$(az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query id -o tsv)
    
    MYID=$(az ad signed-in-user show --query id --output tsv)
    
    az role assignment create \
      --assignee-object-id $MYID \
      --role "b86a8fe4-44ce-4948-aee5-eccb2c155cd7" \
      --scope $KEYVAULT_ID \
      --assignee-principal-type User
    

    역할 할당이 적용되는 데 몇 분 정도 걸릴 수 있습니다. 다음 명령을 사용하여 역할 할당이 생성되었는지 확인할 수 있습니다.

    az role assignment list \
      --assignee-object-id $MYID \
      --scope $KEYVAULT_ID \
      --query '[].{Role:roleDefinitionName, Scope:scope}' \
      --output table
    
  3. ExampleSecret 명령을 사용하여 키 자격 증명 모음에 az keyvault secret set라는 일반 텍스트 비밀을 만드십시오.

    키 자격 증명 모음에는 키, 비밀 및 인증서를 저장할 수 있습니다. 매개 변수는 value 변수를 RANDOM_STRING 사용하여 비밀에 대한 고유 값을 만듭니다.

    az keyvault secret set \
      --vault-name $KEYVAULT_NAME \
      --name ExampleSecret \
      --value MyAKSExampleSecret${RANDOM_STRING}
    
  4. [az keyvault secret show][az-keyvault-secret-show] 명령어를 사용하여 해당 비밀이 키 자격 증명 모음에 성공적으로 추가되었는지 확인하세요.

    az keyvault secret show --vault-name $KEYVAULT_NAME --name ExampleSecret
    

새 키 볼트 생성

main.tf 파일을 업데이트하여 Azure RBAC(Azure 역할 기반 액세스 제어)를 사용하도록 설정된 새 키 자격 증명 모음을 만듭니다.

  1. Azure RBAC가 활성화된 새 키 자격 증명 모음을 생성합니다.

    data "azurerm_client_config" "current" {}
    resource "random_string" "suffix" {
     length  = 5
     special = false
     upper   = false
    }
    resource "azurerm_key_vault" "kv" {
     name                = "akskv${random_string.suffix.result}"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     tenant_id           = data.azurerm_client_config.current.tenant_id
     sku_name            = "standard"
     enable_rbac_authorization = true
    }
    
  2. Key Vault 비밀 책임자 역할을 할당합니다.

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    
  3. 키 볼트에서 ExampleSecret을 만듭니다.

    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  4. 구성을 배포합니다. Bash 세션을 구성하고 다음 명령을 실행하여 업데이트된 구성을 배포합니다.

    terraform plan
    terraform apply
    
  5. [az keyvault secret show][az-keyvault-secret-show] 명령을 사용하여 ExampleSecret이 키 자격 증명 모음에 추가되었는지 확인하세요. Terraform 구성에서 만든 키 볼트의 이름으로 <keyvault-name>를 변경하십시오.

    az keyvault secret show \
     --vault-name <keyvault-name> \
     --name ExampleSecret
    

기존의 키 볼트를 업데이트합니다.

main.tf 파일을 업데이트하여 Azure RBAC(롤 기반 액세스 제어)가 사용 설정된 기존 키 볼트를 업데이트합니다.

  1. 기존 키 자격 증명 모음을 업데이트하여 Azure RBAC이 활성화되도록 설정합니다.

    resource "azurerm_key_vault" "kv" {
     name                = "<existing-kv>"
     resource_group_name = "<resource-group>"
     enable_rbac_authorization = true
    }
    
  2. 역할을 할당하고 비밀을 추가합니다.

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  3. 구성을 배포합니다. Bash 세션을 구성하고 다음 명령을 실행하여 업데이트된 구성을 배포합니다.

    terraform plan
    terraform apply
    

자원을 정리하세요

다음 문서로 이동하여 이러한 리소스가 필요한 경우 다음 단계를 무시합니다. 그렇지 않은 경우 완료되었으며 다음 문서로 계속 진행할 계획이 없는 경우 불필요한 비용을 방지하기 위해 이 문서에서 만든 리소스를 삭제해야 합니다.

  1. 로컬 .kube/config 파일에서 클러스터의 자격 증명을 제거합니다.

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. 명령(MC_)을 사용하여 리소스 그룹 및 해당 그룹 내의 모든 리소스를 포함해 노드 리소스 그룹(az group delete)의 리소스를 삭제합니다.

    az group delete --name $RESOURCE_GROUP --yes --no-wait
    

terraform destroy 명령은 현재 Terraform 구성 및 상태 파일에 정의된 모든 리소스를 제거합니다. 이 문서에 사용되는 작업 디렉터리에서만 이 명령을 실행합니다.

Warning

기존 또는 프로덕션 리소스로 작업하는 경우 실행하기 전에 실행 계획을 신중하게 검토합니다.

terraform plan -destroy

제거해도 안전하다고 확신하지 않는 한 공유 또는 가져온 인프라에 대해 실행 terraform destroy 하지 마세요. 자세한 내용은 terraform destroy 명령에 대한 Terraform 설명서를 참조하세요.

  1. 로컬 .kube/config 파일에서 클러스터의 자격 증명을 제거합니다.

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. 다음 명령을 실행하여 이 문서에서 만든 리소스를 제거합니다.

    terraform destroy
    

다음 단계

이 문서에서는 AKS 클러스터에서 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자를 사용하는 방법을 알아보았습니다. 이제 Azure Key Vault에 액세스하기 위한 ID를 제공해야 합니다. 방법을 알아보려면 계속해서 다음 문서를 진행하세요.