자습서: AKS(Azure Kubernetes Service)에서 애플리케이션에 워크로드 ID 사용
AKS(Azure Kubernetes Service)는 Kubernetes 클러스터를 빠르게 배포하고 관리할 수 있는 관리되는 Kubernetes 서비스입니다. 이 자습서에서는 다음을 수행합니다.
- OIDC(OpenID 커넥트) 발급자 및 관리 ID와 함께 Azure CLI를 사용하여 AKS 클러스터를 배포합니다.
- Azure Key Vault 및 비밀을 만듭니다.
- Microsoft Entra 워크로드 ID 및 Kubernetes 서비스 계정을 만듭니다.
- 토큰 페더레이션을 위한 관리 ID를 구성합니다.
- 워크로드를 배포하고 워크로드 ID를 사용하여 인증을 확인합니다.
시작하기 전에
- 이 자습서에서는 Kubernetes 개념에 대한 기본 지식이 있다고 가정합니다. 자세한 내용은 AKS(Azure Kubernetes Service)에 대한 Kubernetes 핵심 개념을 참조하세요.
- Microsoft Entra 워크로드 ID 잘 모르는 경우 Microsoft Entra 워크로드 ID 개요를 참조하세요.
- AKS 클러스터를 만들면 AKS 리소스를 저장하기 위해 두 번째 리소스 그룹이 자동으로 만들어집니다. 자세한 내용은 AKS를 사용하여 두 개의 리소스 그룹을 만드는 이유를 참조 하세요.
필수 조건
- Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.
- 이 문서에는 Azure CLI 버전 2.47.0 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.
- 클러스터를 만드는 데 사용하는 ID에는 적절한 최소 권한이 있어야 합니다. AKS의 액세스 및 ID에 대한 자세한 내용은 AKS(Azure Kubernetes Service)에 대한 액세스 및 ID 옵션을 참조하세요.
- 여러 Azure 구독이 있는 경우 az account set 명령을 사용하여 리소스를 청구해야 하는 적절한 구독 ID를 선택합니다.
리소스 그룹 만들기
Azure 리소스 그룹은 Azure 리소스를 배포하고 관리하는 논리 그룹입니다. 리소스 그룹을 만들 때 위치를 지정하라는 메시지가 표시됩니다. 이 위치는 리소스 그룹 메타데이터의 스토리지 위치이며 리소스를 만드는 중에 다른 지역을 지정하지 않은 경우 Azure에서 리소스가 실행되는 위치입니다.
다음 예제에서는 eastus 위치에 myResourceGroup이라는 리소스 그룹을 만듭니다.
az group create 명령을 사용하여 리소스 그룹을 만듭니다.
az group create --name myResourceGroup --location eastus
다음 출력 예는 리소스 그룹의 성공적인 만드는 것과 유사합니다.
{ "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup", "location": "eastus", "managedBy": null, "name": "myResourceGroup", "properties": { "provisioningState": "Succeeded" }, "tags": null }
환경 변수 내보내기
필요한 ID를 구성하는 단계를 간소화하기 위해 아래 단계에서는 클러스터에서 참조할 환경 변수를 정의합니다.
다음 명령을 사용하여 이러한 변수를 만듭니다. ,
LOCATION
,USER_ASSIGNED_IDENTITY_NAME
SERVICE_ACCOUNT_NAME
SUBSCRIPTION
, 및FEDERATED_IDENTITY_CREDENTIAL_NAME
.의 기본값을RESOURCE_GROUP
바꿉합니다.export RESOURCE_GROUP="myResourceGroup" export LOCATION="westcentralus" export SERVICE_ACCOUNT_NAMESPACE="default" export SERVICE_ACCOUNT_NAME="workload-identity-sa" export SUBSCRIPTION="$(az account show --query id --output tsv)" export USER_ASSIGNED_IDENTITY_NAME="myIdentity" export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity" export KEYVAULT_NAME="azwi-kv-tutorial" export KEYVAULT_SECRET_NAME="my-secret"
AKS 클러스터 만들기
OIDC 발급자를 사용하려면
--enable-oidc-issuer
매개 변수와 함께 az aks create 명령을 사용하여 AKS 클러스터를 만듭니다.az aks create -g "${RESOURCE_GROUP}" -n myAKSCluster --node-count 1 --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys
몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.
다음 명령을 사용하여 OIDC 발급자 URL을 가져와 환경 변수에 저장합니다. 클러스터 이름인 인수
-n
의 기본값을 바꿉다.export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -otsv)"
변수는 다음 예제와 유사한 발급자 URL을 포함해야 합니다.
https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/00000000-0000-0000-0000-000000000000/
기본적으로 발급자에서 기본 URL
https://{region}.oic.prod-aks.azure.com
을 사용하도록 설정됩니다. 여기서 값{region}
은 AKS 클러스터가 배포된 위치와 일치합니다.
Azure Key Vault 및 비밀 만들기
az keyvault create 명령을 사용하여 이 자습서에서 만든 리소스 그룹에 Azure Key Vault를 만듭니 다.
az keyvault create --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --name "${KEYVAULT_NAME}" --enable-rbac-authorization false
이 명령의 출력에는 새로 만든 키 자격 증명 모음의 속성이 표시됩니다. 아래에 나열된 두 속성을 기록해 둡다.
Name
: 매개 변수에 제공한 자격 증명 모음--name
이름입니다.vaultUri
: 예제에서는 다음과 같습니다https://<your-unique-keyvault-name>.vault.azure.net/
. REST API를 통해 자격 증명 모음을 사용하는 애플리케이션은 이 URI를 사용해야 합니다.
이때 사용자의 Azure 계정은 이 새 Vault에서 모든 작업을 수행할 권한이 있는 유일한 계정입니다.
az keyvault secret set 명령을 사용하여 자격 증명 모음에 비밀을 추가합니다. 암호는 환경 변수
KEYVAULT_SECRET_NAME
에 대해 지정한 값이며 여기에 Hello! 값을 저장합니다.az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello!'
az keyvault show 명령을 사용하여 환경 변수
KEYVAULT_URL
에 Key Vault URL을 추가합니다.export KEYVAULT_URL="$(az keyvault show -g "${RESOURCE_GROUP}" -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
관리 ID를 만들고 비밀에 액세스할 수 있는 권한 부여
az account set 명령을 사용하여 특정 구독을 현재 활성 구독으로 설정합니다 .
az account set --subscription "${SUBSCRIPTION}"
az identity create 명령을 사용하여 관리 ID를 만듭니 다.
az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"
다음 명령을 사용하여 관리 ID에 대한 액세스 정책을 설정하여 Key Vault 비밀에 액세스합니다.
export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)"
az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
Kubernetes 서비스 계정 만들기
Kubernetes 서비스 계정을 만들고 az aks get-credentials 명령을 사용하여 이전 단계에서 만든 관리 ID의 클라이언트 ID로 주석을 추가합니다. 클러스터 이름 및 리소스 그룹 이름의 기본값을 바꿉니다.
az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"
다음 여러 줄 입력을 터미널에 복사하고 명령을 실행하여 서비스 계정을 만듭니다.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: ${USER_ASSIGNED_CLIENT_ID} name: ${SERVICE_ACCOUNT_NAME} namespace: ${SERVICE_ACCOUNT_NAMESPACE} EOF
다음 출력은 성공적인 ID 만들기와 유사합니다.
Serviceaccount/workload-identity-sa created
페더레이션 ID 자격 증명 설정
az identity federated-credential create 명령을 사용하여 관리 ID, 서비스 계정 발급자 및 주체 간에 페더레이션 ID 자격 증명을 만듭니 다.
az identity federated-credential create --name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} --identity-name ${USER_ASSIGNED_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --issuer ${AKS_OIDC_ISSUER} --subject system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}
참고 항목
페더레이션 ID 자격 증명이 처음 추가된 후 전파되는 데 몇 초 정도 걸립니다. 페더레이션 ID 자격 증명을 추가한 후 토큰 요청을 즉시 사용할 수 있는 경우 캐시가 디렉터리에 이전 데이터로 채워져 있으므로 몇 분 동안 오류가 발생할 수 있습니다. 이 문제를 방지하려면 페더레이션 ID 자격 증명을 추가한 후 약간의 지연을 추가하면 됩니다.
워크로드 배포
다음 명령을 사용하여 이전 단계에서 만든 서비스 계정을 참조하는 Pod를 배포합니다.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: quick-start namespace: ${SERVICE_ACCOUNT_NAMESPACE} labels: azure.workload.identity/use: "true" spec: serviceAccountName: ${SERVICE_ACCOUNT_NAME} containers: - image: ghcr.io/azure/azure-workload-identity/msal-go name: oidc env: - name: KEYVAULT_URL value: ${KEYVAULT_URL} - name: SECRET_NAME value: ${KEYVAULT_SECRET_NAME} nodeSelector: kubernetes.io/os: linux EOF
다음 출력은 성공적인 Pod 만들기와 유사합니다.
pod/quick-start created
kubectl describe 명령을 사용하여 모든 속성이 웹후크에 제대로 삽입되는지 확인합니다.
kubectl describe pod quick-start
Pod가 kubectl 로그 명령을 사용하여 토큰을 가져오고 Key Vault에서 비밀에 액세스할 수 있는지 확인합니다 .
kubectl logs quick-start
다음 출력은 토큰의 성공적인 액세스와 유사합니다.
I1013 22:49:29.872708 1 main.go:30] "successfully got secret" secret="Hello!"
리소스 정리
이러한 리소스를 그대로 두는 것이 좋습니다. 이러한 리소스가 더 이상 필요하지 않은 경우 다음 명령을 사용하여 삭제합니다.
명령을 사용하여 Pod를 삭제합니다
kubectl delete pod
.kubectl delete pod quick-start
명령을 사용하여 서비스 계정을 삭제합니다
kubectl delete sa
.kubectl delete sa "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
az group delete 명령을 사용하여 Azure 리소스 그룹 및 모든 리소스를 삭제 합니다.
az group delete --name "${RESOURCE_GROUP}"
다음 단계
이 자습서에서는 Kubernetes 클러스터를 배포한 다음 간단한 컨테이너 애플리케이션을 배포하여 Microsoft Entra 워크로드 ID 작업을 테스트했습니다.
이 자습서는 소개용입니다. 프로덕션용 AKS를 사용하여 전체 솔루션을 만드는 방법에 대한 지침은 AKS 솔루션 지침을 참조하세요.