AKS(Azure Kubernetes Service)에서 테넌트 간 워크로드 ID 구성
이 문서에서는 AKS(Azure Kubernetes Service)에서 테넌트 간 워크로드 ID를 구성하는 방법을 알아봅니다. 테넌트 간 워크로드 ID를 사용하면 AKS 클러스터에서 다른 테넌트에 있는 리소스에 액세스할 수 있습니다. 이 예제에서는 한 테넌트에 Azure Service Bus를 만들고 다른 테넌트에 있는 AKS 클러스터에서 실행되는 워크로드에서 Azure Service Bus에 메시지를 보냅니다.
워크로드 ID에 대한 자세한 내용은 워크로드 개요를 참조하세요.
필수 조건
두 개의 Azure 구독(각각 별도의 테넌트에 있음). 이 문서에서는 이를 테넌트 A와 테넌트 B라고 부릅니다.
로컬 컴퓨터에 설치된 Azure CLI. Azure CLI를 설치하지 않은 경우 Azure CLI 설치를 참조하세요.
Bash 셸 환경. 이 문서에서는 Bash 셸 구문을 사용합니다.
다음 구독 세부 정보가 있어야 합니다.
- 테넌트 A 테넌트 ID
- 테넌트 A 구독 ID
- 테넌트 B 테넌트 ID
- 테넌트 B 구독 ID
Important
설정한 환경 변수를 유지하려면 이 문서의 기간 동안 동일한 터미널 창 내에 있어야 합니다. 터미널 창을 닫으면 환경 변수를 다시 설정해야 합니다.
테넌트 A에서 리소스 구성
테넌트 A에서 워크로드 ID 및 OIDC 발급자를 사용하도록 설정한 AKS 클러스터를 만듭니다. 이 클러스터를 사용하여 테넌트 B의 리소스에 액세스하려는 애플리케이션을 배포합니다.
테넌트 A에 로그인
az login
명령을 사용하여 테넌트 A 구독에 로그인합니다.# Set environment variable TENANT_A_ID=<tenant-id> az login --tenant $TENANT_A_ID
az account set
명령을 사용하여 테넌트 A에서 올바른 구독으로 작업하고 있는지 확인합니다.# Set environment variable TENANT_A_SUBSCRIPTION_ID=<subscription-id> # Log in to your Tenant A subscription az account set --subscription $TENANT_A_SUBSCRIPTION_ID
테넌트 A에서 리소스 만들기
테넌트 A에서 리소스 그룹을 만들어
az group create
명령을 사용하여 AKS 클러스터를 호스트합니다.# Set environment variables RESOURCE_GROUP=<resource-group-name> LOCATION=<location> # Create a resource group az group create --name $RESOURCE_GROUP --location $LOCATION
az aks create
명령을 사용하여 테넌트 A에서 워크로드 ID 및 OIDC 발급자를 사용하도록 설정한 AKS 클러스터를 만듭니다.# Set environment variable CLUSTER_NAME=<cluster-name> # Create an AKS cluster az aks create \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --enable-oidc-issuer \ --enable-workload-identity \ --generate-ssh-keys
AKS 클러스터에서 OIDC 발급자 URL 가져오기
az aks show
명령을 사용하여 테넌트 A의 클러스터에서 OIDC 발급자 URL을 가져옵니다.OIDC_ISSUER_URL=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "oidcIssuerProfile.issuerUrl" --output tsv)
테넌트 B에서 리소스 구성
테넌트 BDPTJ 관리 ID인 Azure Service Bus를 만들고 서비스 버스에 메시지를 읽고 쓸 수 있는 권한을 이 ID에 할당하고 테넌트 A에서 관리 ID와 AKS 클러스터 간에 신뢰를 설정합니다.
테넌트 B에 로그인
az logout
명령을 사용하여 테넌트 A 구독에서 로그아웃합니다.az logout
az login
명령을 사용하여 테넌트 B 구독에 로그인합니다.# Set environment variable TENANT_B_ID=<tenant-id> az login --tenant $TENANT_B_ID
az account set
명령을 사용하여 테넌트 B에서 올바른 구독으로 작업하고 있는지 확인합니다.# Set environment variable TENANT_B_SUBSCRIPTION_ID=<subscription-id> # Log in to your Tenant B subscription az account set --subscription $TENANT_B_SUBSCRIPTION_ID
테넌트 B에서 리소스 만들기
테넌트 B에서 리소스 그룹을 만들어
az group create
명령을 사용하여 관리 ID를 호스트합니다.# Set environment variables RESOURCE_GROUP=<resource-group-name> LOCATION=<location> # Create a resource group az group create --name $RESOURCE_GROUP --location $LOCATION
az servicebus namespace create
및az servicebus queue create
명령을 사용하여 테넌트 B에서 서비스 버스 및 큐를 만듭니다.# Set environment variable SERVICEBUS_NAME=sb-crosstenantdemo-$RANDOM # Create a new service bus namespace and and return the service bus hostname SERVICEBUS_HOSTNAME=$(az servicebus namespace create \ --name $SERVICEBUS_NAME \ --resource-group $RESOURCE_GROUP \ --disable-local-auth \ --query serviceBusEndpoint \ --output tsv | sed -e 's/https:\/\///' -e 's/:443\///') # Create a new queue in the service bus namespace az servicebus queue create \ --name myqueue \ --namespace $SERVICEBUS_NAME \ --resource-group $RESOURCE_GROUP
az identity create
명령을 사용하여 테넌트 B에서 사용자 할당 관리 ID를 만듭니다.# Set environment variable IDENTITY_NAME=${SERVICEBUS_NAME}-identity # Create a user-assigned managed identity az identity create --resource-group $RESOURCE_GROUP --name $IDENTITY_NAME
테넌트 B에서 리소스 ID 가져오기 및 권한 할당
az identity show
명령을 사용하여 테넌트 B에서 관리 ID의 보안 주체 ID를 가져옵니다.# Get the user-assigned managed identity principalId PRINCIPAL_ID=$(az identity show \ --resource-group $RESOURCE_GROUP \ --name $IDENTITY_NAME \ --query principalId \ --output tsv)
az identity show
명령을 사용하여 테넌트 B에서 관리 ID의 클라이언트 ID를 가져옵니다.CLIENT_ID=$(az identity show \ --resource-group $RESOURCE_GROUP \ --name $IDENTITY_NAME \ --query clientId \ --output tsv)
az servicebus namespace show
명령을 사용하여 테넌트 B에서 서비스 버스 네임스페이스의 리소스 ID를 가져옵니다.SERVICEBUS_ID=$(az servicebus namespace show \ --name $SERVICEBUS_NAME \ --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
az role assignment create
명령을 사용하여 테넌트 B의 관리 ID에 서비스 버스 메시지를 읽고 쓸 수 있는 권한을 할당합니다.az role assignment create \ --role "Azure Service Bus Data Owner" \ --assignee-object-id $PRINCIPAL_ID \ --assignee-principal-type ServicePrincipal \ --scope $SERVICEBUS_ID
AKS 클러스터와 관리 ID 간의 신뢰 설정
이 섹션에서는 테넌트 A의 AKS 클러스터와 테넌트 B의 관리 ID 간에 신뢰를 설정하는 데 필요한 페더레이션 ID 자격 증명을 만듭니다. 테넌트 A의 AKS 클러스터 OIDC 발급자 URL과 테넌트 B의 관리 ID 이름을 사용합니다.
az identity federated-credential create
명령을 사용하여 페더레이션 ID 자격 증명을 만듭니다.az identity federated-credential create \ --name $IDENTITY_NAME-$RANDOM \ --identity-name $IDENTITY_NAME \ --resource-group $RESOURCE_GROUP \ --issuer $OIDC_ISSUER_URL \ --subject system:serviceaccount:default:myserviceaccount
--subject system:serviceaccount:default:myserviceaccount
는 문서 뒷부분에서 테넌트 A에서 만든 Kubernetes 서비스 계정의 이름입니다. 애플리케이션 Pod가 인증을 요청하면 이 값은 권한 부여 요청의 subject
로 Microsoft Entra ID에 전송됩니다. Microsoft Entra ID는 이 값이 페더레이션 ID 자격 증명을 만들 때 설정한 값과 일치하는지 여부에 따라 자격을 결정하므로 값이 일치하는지 확인해야 합니다.
Azure Service Bus 큐에 메시지를 보내는 애플리케이션 배포
이 섹션에서는 테넌트 B의 Azure Service Bus 큐에 메시지를 보내는 테넌트 A의 AKS 클러스터에 애플리케이션을 배포합니다.
테넌트 A에 로그인하고 AKS 자격 증명 가져오기
az logout
명령을 사용하여 테넌트 B 구독에서 로그아웃합니다.az logout
az login
명령을 사용하여 테넌트 A 구독에 로그인합니다.az login --tenant $TENANT_A_ID
az account set
명령을 사용하여 테넌트 A에서 올바른 구독으로 작업하고 있는지 확인합니다.az account set --subscription $TENANT_A_SUBSCRIPTION_ID
az aks get-credentials
명령을 사용하여 테넌트 A의 AKS 클러스터에 대한 자격 증명을 가져옵니다.az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
Azure Service Bus 큐에 메시지를 보낼 Kubernetes 리소스 만들기
default
네임스페이스에 새 Kubernetes ServiceAccount를 만들고 테넌트 B에 있는 관리 ID의 클라이언트 ID를kubectl apply
명령에 전달합니다. 클라이언트 ID는 테넌트 B의 Azure Service Bus에 대해 테넌트 A의 앱을 인증하는 데 사용됩니다.kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: $CLIENT_ID name: myserviceaccount EOF
default
네임스페이스에 새 Kubernetes 작업을 만들어 Azure Service Bus 큐에 100개의 메시지를 보냅니다. Pod 템플릿은 이전 단계에서 만든 워크로드 ID 및 서비스 계정을 사용하도록 구성됩니다. 또한AZURE_TENANT_ID
환경 변수는 테넌트 B의 테넌트 ID로 설정됩니다. 워크로드 ID는 기본적으로 AKS 클러스터의 테넌트이므로 테넌트 B의 테넌트 ID를 명시적으로 설정해야 합니다.kubectl apply -f - <<EOF apiVersion: batch/v1 kind: Job metadata: name: myproducer spec: template: metadata: labels: azure.workload.identity/use: "true" spec: serviceAccountName: myserviceaccount containers: - image: ghcr.io/azure-samples/aks-app-samples/servicebusdemo:latest name: myproducer resources: {} env: - name: OPERATION_MODE value: "producer" - name: MESSAGE_COUNT value: "100" - name: AZURE_SERVICEBUS_QUEUE_NAME value: myqueue - name: AZURE_SERVICEBUS_HOSTNAME value: $SERVICEBUS_HOSTNAME - name: AZURE_TENANT_ID value: $TENANT_B_ID restartPolicy: Never EOF
배포 확인
kubectl describe pod
명령을 사용해 Pod의 상태를 확인하여 테넌트 B의 Azure Service Bus 큐와 상호 작용하도록 Pod가 올바르게 구성되었는지 확인합니다.# Get the dynamically generated pod name POD_NAME=$(kubectl get po --selector job-name=myproducer -o jsonpath='{.items[0].metadata.name}') # Verify the tenant ID environment variable is set for Tenant B kubectl describe pod $POD_NAME | grep AZURE_TENANT_ID
Pod의 로그를 확인하여 애플리케이션이
kubectl logs
명령을 사용해 테넌트 간에 메시지를 보낼 수 있는지 확인합니다.kubectl logs $POD_NAME
출력은 다음 예제 출력과 비슷하게 됩니다.
... Adding message to batch: Hello World! Adding message to batch: Hello World! Adding message to batch: Hello World! Sent 100 messages
참고 항목
추가 확인 단계로, Azure Portal로 이동하고 테넌트 B의 Azure Service Bus 큐로 이동하여 Service Bus Explorer에서 보낸 메시지를 볼 수 있습니다.
리소스 정리
배포가 성공했는지 확인한 후에는 리소스를 정리하여 Azure 비용이 발생하지 않도록 할 수 있습니다.
테넌트 A에서 리소스 삭제
az login
명령을 사용하여 테넌트 A 구독에 로그인합니다.az login --tenant $TENANT_A_ID
az account set
명령을 사용하여 테넌트 A에서 올바른 구독으로 작업하고 있는지 확인합니다.az account set --subscription $TENANT_A_SUBSCRIPTION_ID
az group delete
명령을 사용하여 Azure 리소스 그룹과 그룹에 있는 모든 리소스를 삭제합니다.az group delete --name $RESOURCE_GROUP --yes --no-wait
테넌트 B에서 리소스 삭제
az login
명령을 사용하여 테넌트 B 구독에 로그인합니다.az login --tenant $TENANT_B_ID
az account set
명령을 사용하여 테넌트 B에서 올바른 구독으로 작업하고 있는지 확인합니다.az account set --subscription $TENANT_B_SUBSCRIPTION_ID
az group delete
명령을 사용하여 Azure 리소스 그룹과 그룹에 있는 모든 리소스를 삭제합니다.az group delete --name $RESOURCE_GROUP --yes --no-wait
다음 단계
이 문서에서는 AKS(Azure Kubernetes Service)에서 테넌트 간 워크로드 ID를 구성하는 방법을 알아보았습니다. 워크로드 ID에 대해 자세히 알아보려면 다음 문서를 참조하세요.
Azure Kubernetes Service