AKS(Azure Kubernetes Service) 클러스터에서 워크로드 ID 배포 및 구성

AKS(Azure Kubernetes Service)는 Kubernetes 클러스터를 빠르게 배포하고 관리할 수 있는 관리되는 Kubernetes 서비스입니다. 이 문서에서는 다음에 대해 알아봅니다.

  • OpenID Connect 발급자 및 Microsoft Entra 워크로드 ID가 포함된 Azure CLI를 사용하여 AKS 클러스터 배포
  • Azure Key Vault에 대한 액세스 권한 부여
  • Microsoft Entra 워크로드 ID 및 Kubernetes 서비스 계정 만들기
  • 토큰 페더레이션을 위한 관리 ID를 구성합니다.

이 문서에서는 사용자가 Kubernetes 개념에 대한 기본적인 지식을 보유하고 있다고 가정합니다. 자세한 내용은 AKS(Azure Kubernetes Service)의 Kubernetes 핵심 개념을 참조하세요. Microsoft Entra 워크로드 ID에 익숙하지 않은 경우 다음 개요 문서를 참조하세요.

  • 이 문서대로 하려면 Azure CLI 버전 2.47.0 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.

  • 클러스터를 만드는 데 사용하는 ID에는 적절한 최소 권한이 있습니다. AKS의 액세스 및 ID에 대한 자세한 내용은 AKS(Azure Kubernetes Service)에 대한 액세스 및 ID 옵션을 참조하세요.

  • Azure 구독이 여러 개인 경우 az account 명령을 사용하여 리소스가 청구되어야 하는 적절한 구독 ID를 선택합니다.

참고 항목

모든 단계를 수동으로 구성하는 대신, 일부 단계를 자동으로 구성하고 동일한 결과를 얻을 수 있는 서비스 커넥터라는 또 다른 구현이 있습니다. 참조: 자습서: 워크로드 ID를 사용하여 서비스 커넥터를 사용하여 AKS(Azure Kubernetes Service)에서 Azure Storage 계정에 연결.

환경 변수 내보내기

필요한 ID를 만드는 단계를 간소화하기 위해 아래 단계에서는 클러스터에서 참조할 환경 변수를 정의합니다.

다음 명령을 실행하여 이러한 변수를 만듭니다. RESOURCE_GROUP, LOCATION, SERVICE_ACCOUNT_NAME, SUBSCRIPTION, USER_ASSIGNED_IDENTITY_NAME, FEDERATED_IDENTITY_CREDENTIAL_NAME의 기본값을 바꿉니다.

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"

AKS 클러스터 만들기

OIDC 발급자를 사용하려면 --enable-oidc-issuer 매개 변수와 함께 az aks create 명령을 사용하여 AKS 클러스터를 만듭니다. 다음 예에서는 myResourceGroup에 하나의 노드가 있는 myAKSCluster라는 클러스터를 만듭니다.

az aks create -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys

몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

참고 항목

AKS 클러스터를 생성하면 AKS 리소스를 저장하는 두 번째 리소스 그룹이 자동으로 만들어집니다. 자세한 내용은 AKS를 통해 두 개의 리소스 그룹이 생성되는 이유는 무엇인가요?를 참조하세요.

기존 AKS 클러스터 업데이트

--enable-oidc-issuer--enable-workload-identity 매개 변수와 함께 az aks update 명령을 사용하여 AKS 클러스터를 업데이트하여 OIDC 발급자를 사용하고 워크로드 ID를 사용하도록 설정할 수 있습니다. 다음 예에서는 myAKSCluster라는 클러스터를 업데이트합니다.

az aks update -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity

OIDC 발급자 URL 찾기

OIDC 발급자 URL을 가져와서 환경 변수에 저장하려면 다음 명령을 실행합니다. 클러스터의 이름에 해당하는 인수 -n의 기본값을 바꿉니다.

export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -o tsv)"

변수에는 다음 예제와 유사한 발급자 URL이 포함되어야 합니다.

https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/

기본적으로 발급자는 기준 URL https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}를 사용하도록 설정됩니다. 여기서 {region}의 값은 AKS 클러스터가 배포된 위치와 일치합니다. 값 {uuid}는 OIDC 키를 나타냅니다.

관리 ID 만들기

Azure CLI az account set 명령을 사용하여 특정 구독을 현재 활성 구독으로 설정합니다. 그런 다음, 관리 ID를 만들려면 az identity create 명령을 사용합니다.

az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"

다음으로 관리 ID ID에 대한 변수를 만들어 보겠습니다.

export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"

Kubernetes 서비스 계정 만들기

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

az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"

Azure CLI에서 다음 여러 줄 입력을 복사하여 붙여넣습니다.

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}" --audience api://AzureADTokenExchange

참고 항목

페더레이션 ID 자격 증명이 처음 추가된 후 전파되는 데 몇 초 정도 걸립니다. 페더레이션 ID 자격 증명을 추가한 직후에 토큰 요청이 이루어진 경우 캐시가 이전 데이터와 디렉터리에 채워지기 때문에 몇 분 동안 실패할 수 있습니다. 이 문제를 방지하려면 페더레이션 ID 자격 증명을 추가한 후 약간의 지연을 추가하면 됩니다.

응용 프로그램 배포

애플리케이션 Pod를 배포할 때 매니페스트는 Kubernetes 서비스 계정 만들기 단계에서 만든 서비스 계정을 참조해야 합니다. 다음 매니페스트는 계정, 특히 메타데이터\namespacespec\serviceAccountName 속성을 참조하는 방법을 보여 줍니다.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: your-pod
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
  labels:
    azure.workload.identity/use: "true"  # Required, only the pods with this label can use workload identity
spec:
  serviceAccountName: "${SERVICE_ACCOUNT_NAME}"
  containers:
    - image: <your image>
      name: <containerName>
EOF

Important

워크로드 ID를 사용하는 애플리케이션 Pod가 Pod 사양에 다음 레이블 azure.workload.identity/use: "true"을(를) 추가했는지 확인하세요. 그렇지 않으면 Pod가 재시작된 후 실패합니다.

선택 사항 - Azure Key Vault에 액세스할 수 있는 권한 부여

이 단계는 Pod에서 Azure Key Vault에 탑재된 비밀, 키 및 인증서에 액세스해야 하는 경우에 필요합니다. 관리 ID로 액세스를 구성하려면 다음 단계를 수행합니다. 이러한 단계에서는 Azure Key Vault가 구독에 이미 만들어져 구성되어 있다고 가정합니다. 없는 경우 Azure CLI를 사용하여 Azure Key Vault 만들기를 참조하세요.

계속하기 전에 다음 정보가 필요합니다.

  • Key Vault의 이름
  • Key Vault를 보유한 리소스 그룹

Azure CLI 명령 az keyvault list를 사용하여 이 정보를 검색할 수 있습니다.

  1. 다음 명령을 실행하여 Key Vault의 비밀에 액세스하도록 관리 ID에 대한 액세스 정책을 설정합니다.

    export KEYVAULT_RESOURCE_GROUP="myResourceGroup"
    export KEYVAULT_NAME="myKeyVault"
    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"
    
    az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
    
  2. Key Vault에 비밀 만들기:

    export KEYVAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set --vault-name "${KEYVAULT_NAME}" \
       --name "${KEYVAULT_SECRET_NAME}" \
       --value "Hello\!"
    
  3. Key Vault URL 내보내기:

    export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    
  4. 위의 서비스 계정 및 Key Vault URL을 참조하는 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
    

모든 속성이 webhook에 의해 제대로 삽입되는지 여부를 확인하려면 kubectl describe 명령을 사용합니다.

kubectl describe pod quick-start | grep "SECRET_NAME:"

성공하면 출력은 다음과 유사해야 합니다.

      SECRET_NAME:                 ${KEYVAULT_SECRET_NAME}

Pod가 토큰을 가져와 리소스에 액세스할 수 있는지 확인하려면 kubectl logs 명령을 사용합니다.

kubectl logs quick-start

성공하면 출력은 다음과 유사해야 합니다.

I0114 10:35:09.795900       1 main.go:63] "successfully got secret" secret="Hello\\!"

워크로드 ID 사용 중지

사용하도록 설정 및 구성된 AKS 클러스터에서 Microsoft Entra 워크로드 ID를 사용하지 않도록 설정하려면 다음 명령을 실행할 수 있습니다.

az aks update --resource-group "${RESOURCE_GROUP}" --name myAKSCluster --disable-workload-identity

다음 단계

이 문서에서는 Kubernetes 클러스터를 배포하고 애플리케이션 워크로드가 해당 자격 증명으로 인증하도록 준비하기 위해 워크로드 ID를 사용하도록 구성했습니다. 이제 애플리케이션을 배포하고 최신 버전의 Azure ID 클라이언트 라이브러리와 함께 워크로드 ID를 사용하도록 구성할 준비가 되었습니다. 최신 클라이언트 라이브러리 버전을 사용하도록 애플리케이션을 다시 작성할 수 없는 경우 애플리케이션 Pod를 설정하여 단기 마이그레이션 솔루션으로 워크로드 ID가 있는 관리 ID를 사용하여 인증할 수 있습니다.