다음을 통해 공유


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에 로그인

  1. az login 명령을 사용하여 테넌트 A 구독에 로그인합니다.

    # Set environment variable
    TENANT_A_ID=<tenant-id>
    
    az login --tenant $TENANT_A_ID
    
  2. 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에서 리소스 만들기

  1. 테넌트 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
    
  2. 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에 로그인

  1. az logout 명령을 사용하여 테넌트 A 구독에서 로그아웃합니다.

    az logout
    
  2. az login 명령을 사용하여 테넌트 B 구독에 로그인합니다.

    # Set environment variable
    TENANT_B_ID=<tenant-id>
    
    az login --tenant $TENANT_B_ID
    
  3. 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에서 리소스 만들기

  1. 테넌트 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
    
  2. az servicebus namespace createaz 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
    
  3. 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 가져오기 및 권한 할당

  1. 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)
    
  2. az identity show 명령을 사용하여 테넌트 B에서 관리 ID의 클라이언트 ID를 가져옵니다.

    CLIENT_ID=$(az identity show \
      --resource-group $RESOURCE_GROUP \
      --name $IDENTITY_NAME \
      --query clientId \
      --output tsv)
    
  3. az servicebus namespace show 명령을 사용하여 테넌트 B에서 서비스 버스 네임스페이스의 리소스 ID를 가져옵니다.

    SERVICEBUS_ID=$(az servicebus namespace show \
      --name $SERVICEBUS_NAME \
      --resource-group $RESOURCE_GROUP \
      --query id \
      --output tsv)
    
  4. 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 자격 증명 가져오기

  1. az logout 명령을 사용하여 테넌트 B 구독에서 로그아웃합니다.

    az logout
    
  2. az login 명령을 사용하여 테넌트 A 구독에 로그인합니다.

    az login --tenant $TENANT_A_ID
    
  3. az account set 명령을 사용하여 테넌트 A에서 올바른 구독으로 작업하고 있는지 확인합니다.

    az account set --subscription $TENANT_A_SUBSCRIPTION_ID
    
  4. az aks get-credentials 명령을 사용하여 테넌트 A의 AKS 클러스터에 대한 자격 증명을 가져옵니다.

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    

Azure Service Bus 큐에 메시지를 보낼 Kubernetes 리소스 만들기

  1. 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
    
  2. 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
    

배포 확인

  1. 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
    
  2. 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에서 리소스 삭제

  1. az login 명령을 사용하여 테넌트 A 구독에 로그인합니다.

    az login --tenant $TENANT_A_ID
    
  2. az account set 명령을 사용하여 테넌트 A에서 올바른 구독으로 작업하고 있는지 확인합니다.

    az account set --subscription $TENANT_A_SUBSCRIPTION_ID
    
  3. az group delete 명령을 사용하여 Azure 리소스 그룹과 그룹에 있는 모든 리소스를 삭제합니다.

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

테넌트 B에서 리소스 삭제

  1. az login 명령을 사용하여 테넌트 B 구독에 로그인합니다.

    az login --tenant $TENANT_B_ID
    
  2. az account set 명령을 사용하여 테넌트 B에서 올바른 구독으로 작업하고 있는지 확인합니다.

    az account set --subscription $TENANT_B_SUBSCRIPTION_ID
    
  3. az group delete 명령을 사용하여 Azure 리소스 그룹과 그룹에 있는 모든 리소스를 삭제합니다.

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

다음 단계

이 문서에서는 AKS(Azure Kubernetes Service)에서 테넌트 간 워크로드 ID를 구성하는 방법을 알아보았습니다. 워크로드 ID에 대해 자세히 알아보려면 다음 문서를 참조하세요.