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또는Secret을subPath볼륨 탑재로 사용하는 컨테이너는 비밀이 회전될 때 자동으로 업데이트되지 않습니다. 이는 Kubernetes의 제한 사항입니다. 변경 내용을 적용하려면 애플리케이션에서 파일 시스템의 변경 내용을 확인하거나 Pod를 다시 시작하여 변경된 파일을 다시 로드해야 합니다. 자세한 내용은 비밀 저장소 CSI 드라이버의 알려진 제한 사항을 참조하세요. - 추가 기능은 노드 리소스 그룹(
azurekeyvaultsecretsprovider-xxxxx)에 명명된MC_관리 ID를 만들고 가상 머신 확장 집합에 자동으로 할당합니다. 이 관리 ID 또는 사용자 고유의 관리 ID를 사용하여 키 자격 증명 모음에 액세스할 수 있습니다. ID 생성을 방지할 수는 없습니다.
필수 구성 요소
- Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
- Azure CLI 버전이 2.30.0 이상인지 확인합니다. 이전 버전을 사용하는 경우 최신 버전을 설치하세요.
Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
Terraform 버전 1.6 이상입니다.
Azure CLI 설치되고 로그인되었습니다. 최신 버전을 설치합니다.
AKS 및 Key Vault 리소스를 만들 수 있는 권한입니다.
다음 명령을 사용하여 Azure CLI Azure 구독을 설정합니다.
<subscriptionId>는 구독 ID로 바꿉니다.az account set --subscription <subscriptionId>
네트워크
- 네트워크 격리 클러스터를 사용하는 경우 Azure Key Vault에 액세스하도록 프라이빗 엔드포인트를 설정하는 것이 좋습니다.
- 클러스터에 아웃바운드 유형
userDefinedRouting이 있고 Azure Firewall과 같은 도메인 이름에 따라 아웃바운드 트래픽을 제어할 수 있는 방화벽 디바이스를 사용하는 경우 필요한 아웃바운드 네트워크 규칙 및 FQDN이 허용되는지 확인합니다. - 클러스터에 대한 수신을 제한하는 경우 포트 9808 및 8095가 열려 있는지 확인합니다.
역할
- 이 문서에서는 Key Vault 비밀 매니저 역할을 사용하여 계정에 키 볼트에서 비밀을 만들 수 있는 권한을 부여합니다.
-
Azure Key Vault 액세스 권한 제공 문서에서
SecretProviderClass과(와) 함께 사용되는 ID는 Key Vault 인증서 사용자 권한이 있어야key또는certificate개체 유형에 액세스할 수 있으며, Key Vault Secrets User 권한이 있어야secret개체 유형에 액세스할 수 있습니다.
AKS 클러스터 만들기
비밀 저장소 CSI 드라이버 지원을 위한 Azure Key Vault 공급자를 사용하여 AKS 클러스터를 만듭니다.
명령에 사용되는 변수를 만들어 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=eastus2Azure Key Vault 이름은 전역적으로 고유해야 하며 하이픈을 포함한 영숫자 및 3-24자여야 합니다. 키 볼트 이름은
KEYVAULT_NAME변수의myKeyVault값과RANDOM_STRING변수의 10자 문자열을 연결하여 생성됩니다.az group create명령을 사용하여 Azure 리소스 그룹을 만듭니다.az group create --name $RESOURCE_GROUP --location $LOCATIONaz aks create매개 변수와 함께--enable-addons azure-keyvault-secrets-provider명령을 사용하여 비밀 저장소 CSI 드라이버 기능에 대한 Azure Key Vault 공급자를 사용하여 AKS 클러스터를 만듭니다.--enable-addons매개 변수는 키 자격 증명 모음에 인증하는 데 사용할 수 있는 사용자 할당 관리 IDazurekeyvaultsecretsprovider-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 클러스터를 만듭니다.
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" }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 } }구성을 배포합니다. Bash 세션을 구성하고 다음 명령을 실행하여 리소스를 배포합니다.
terraform init terraform validate terraform plan terraform apply
기존 AKS 클러스터 업데이트
비밀 저장소 CSI 드라이버 지원을 위해 Azure Key Vault 공급자를 사용하여 기존 AKS 클러스터를 업데이트합니다.
명령에 사용되는 변수를 만듭니다. 기존 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기존 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_GROUPAzure Key Vault 비밀 공급자를 사용하도록 설정한 후 AKS는 키 자격 증명 모음에 인증하는 데 사용할 수 있는 관리
azurekeyvaultsecretsprovider-xxxxID를 만듭니다. 관리 ID는 노드 리소스 그룹(MC_)에 저장되고 Virtual Machine Scale Set에 자동으로 할당됩니다. 이 관리 ID 또는 사용자 고유의 관리 ID를 사용하여 키 자격 증명 모음에 액세스할 수 있습니다. ID 생성을 방지할 수는 없습니다.
기존 AKS 클러스터 업데이트
다음 구성으로 main.tf 파일을 만들어 비밀 저장소 CSI 드라이버 지원을 위한 Azure Key Vault 공급자를 사용하여 기존 AKS 클러스터를 업데이트합니다.
기존 AKS 클러스터 업데이트.
resource "azurerm_kubernetes_cluster" "aks" { name = "<existing-cluster>" resource_group_name = "<resource-group>" key_vault_secrets_provider { secret_rotation_enabled = false } }구성을 배포합니다. 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에 할당되었는지 확인합니다.
명령을 사용하여 관리 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표시합니다.관리 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 공급자 설치 확인
az aks get-credentials명령을 사용하여 AKS 클러스터 자격 증명을 가져옵니다.az aks get-credentials \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUPkubectl get pods명령을 사용하여secrets-store-csi-driver네임스페이스에서secrets-store-provider-azure및kube-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 키, 인증서 및 비밀에 대한 액세스 제공을 참조하세요.
키 자격 증명 모음에 역할 할당 및 비밀 추가
az keyvault show명령을 실행하여 키 자격 증명 모음에 Azure RBAC가 활성화되어 있는지 확인합니다.az keyvault show \ --name $KEYVAULT_NAME \ --resource-group $RESOURCE_GROUP \ --query properties.enableRbacAuthorization출력은
true이어야 합니다.다음 단계에서 키 자격 증명 모음 비밀을 추가할 수 있도록
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 tableExampleSecret명령을 사용하여 키 자격 증명 모음에az keyvault secret set라는 일반 텍스트 비밀을 만드십시오.키 자격 증명 모음에는 키, 비밀 및 인증서를 저장할 수 있습니다. 매개 변수는
value변수를RANDOM_STRING사용하여 비밀에 대한 고유 값을 만듭니다.az keyvault secret set \ --vault-name $KEYVAULT_NAME \ --name ExampleSecret \ --value MyAKSExampleSecret${RANDOM_STRING}[
az keyvault secret show][az-keyvault-secret-show] 명령어를 사용하여 해당 비밀이 키 자격 증명 모음에 성공적으로 추가되었는지 확인하세요.az keyvault secret show --vault-name $KEYVAULT_NAME --name ExampleSecret
새 키 볼트 생성
main.tf 파일을 업데이트하여 Azure RBAC(Azure 역할 기반 액세스 제어)를 사용하도록 설정된 새 키 자격 증명 모음을 만듭니다.
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 }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 }키 볼트에서 ExampleSecret을 만듭니다.
resource "azurerm_key_vault_secret" "example" { name = "ExampleSecret" value = "MyAKSExampleSecret" key_vault_id = azurerm_key_vault.kv.id }구성을 배포합니다. Bash 세션을 구성하고 다음 명령을 실행하여 업데이트된 구성을 배포합니다.
terraform plan terraform apply[
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(롤 기반 액세스 제어)가 사용 설정된 기존 키 볼트를 업데이트합니다.
기존 키 자격 증명 모음을 업데이트하여 Azure RBAC이 활성화되도록 설정합니다.
resource "azurerm_key_vault" "kv" { name = "<existing-kv>" resource_group_name = "<resource-group>" enable_rbac_authorization = true }역할을 할당하고 비밀을 추가합니다.
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 }구성을 배포합니다. Bash 세션을 구성하고 다음 명령을 실행하여 업데이트된 구성을 배포합니다.
terraform plan terraform apply
자원을 정리하세요
다음 문서로 이동하여 이러한 리소스가 필요한 경우 다음 단계를 무시합니다. 그렇지 않은 경우 완료되었으며 다음 문서로 계속 진행할 계획이 없는 경우 불필요한 비용을 방지하기 위해 이 문서에서 만든 리소스를 삭제해야 합니다.
로컬 .kube/config 파일에서 클러스터의 자격 증명을 제거합니다.
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXT명령(
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 설명서를 참조하세요.
로컬 .kube/config 파일에서 클러스터의 자격 증명을 제거합니다.
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXT다음 명령을 실행하여 이 문서에서 만든 리소스를 제거합니다.
terraform destroy
다음 단계
이 문서에서는 AKS 클러스터에서 비밀 저장소 CSI 드라이버용 Azure Key Vault 공급자를 사용하는 방법을 알아보았습니다. 이제 Azure Key Vault에 액세스하기 위한 ID를 제공해야 합니다. 방법을 알아보려면 계속해서 다음 문서를 진행하세요.