자습서: 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에서 리소스가 실행되는 위치입니다.

다음 예제에서는 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_NAMESERVICE_ACCOUNT_NAMESUBSCRIPTION, 및 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 클러스터 만들기

  1. 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 형식 정보가 반환됩니다.

  2. 다음 명령을 사용하여 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 및 비밀 만들기

  1. 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에서 모든 작업을 수행할 권한이 있는 유일한 계정입니다.

  2. az keyvault secret set 명령을 사용하여 자격 증명 모음에 비밀을 추가합니다. 암호는 환경 변수 KEYVAULT_SECRET_NAME에 대해 지정한 값이며 여기에 Hello! 값을 저장합니다.

    az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello!'
    
  3. az keyvault show 명령을 사용하여 환경 변수 KEYVAULT_URLKey Vault URL을 추가합니다.

    export KEYVAULT_URL="$(az keyvault show -g "${RESOURCE_GROUP}" -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    

관리 ID를 만들고 비밀에 액세스할 수 있는 권한 부여

  1. az account set 명령을 사용하여 특정 구독을 현재 활성 구독으로 설정합니다 .

    az account set --subscription "${SUBSCRIPTION}"
    
  2. az identity create 명령을 사용하여 관리 ID를 만듭니 다.

    az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"
    
  3. 다음 명령을 사용하여 관리 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 서비스 계정 만들기

  1. Kubernetes 서비스 계정을 만들고 az aks get-credentials 명령을 사용하여 이전 단계에서 만든 관리 ID의 클라이언트 ID로 주석을 추가합니다. 클러스터 이름 및 리소스 그룹 이름의 기본값을 바꿉니다.

    az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"
    
  2. 다음 여러 줄 입력을 터미널에 복사하고 명령을 실행하여 서비스 계정을 만듭니다.

    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 자격 증명을 추가한 후 약간의 지연을 추가하면 됩니다.

워크로드 배포

  1. 다음 명령을 사용하여 이전 단계에서 만든 서비스 계정을 참조하는 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
    
  2. kubectl describe 명령을 사용하여 모든 속성이 웹후크에 제대로 삽입되는지 확인합니다.

    kubectl describe pod quick-start
    
  3. Pod가 kubectl 로그 명령을 사용하여 토큰을 가져오고 Key Vault에서 비밀에 액세스할 수 있는지 확인합니다 .

    kubectl logs quick-start
    

    다음 출력은 토큰의 성공적인 액세스와 유사합니다.

    I1013 22:49:29.872708       1 main.go:30] "successfully got secret" secret="Hello!"
    

리소스 정리

이러한 리소스를 그대로 두는 것이 좋습니다. 이러한 리소스가 더 이상 필요하지 않은 경우 다음 명령을 사용하여 삭제합니다.

  1. 명령을 사용하여 Pod를 삭제합니다 kubectl delete pod .

    kubectl delete pod quick-start
    
  2. 명령을 사용하여 서비스 계정을 삭제합니다 kubectl delete sa .

    kubectl delete sa "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
    
  3. az group delete 명령을 사용하여 Azure 리소스 그룹 및 모든 리소스를 삭제 합니다.

    az group delete --name "${RESOURCE_GROUP}"
    

다음 단계

이 자습서에서는 Kubernetes 클러스터를 배포한 다음 간단한 컨테이너 애플리케이션을 배포하여 Microsoft Entra 워크로드 ID 작업을 테스트했습니다.

이 자습서는 소개용입니다. 프로덕션용 AKS를 사용하여 전체 솔루션을 만드는 방법에 대한 지침은 AKS 솔루션 지침을 참조하세요.