다음을 통해 공유


Azure Kubernetes Service(미리 보기)에서 Microsoft Entra Pod 관리 ID 사용

Microsoft Entra Pod 관리 ID는 Kubernetes 기본 요소를 사용하여 Azure 리소스에 대한 관리 ID 및 Microsoft Entra ID의 ID를 Pod와 연결합니다. 관리자는 Pod가 Microsoft Entra ID를 ID 공급자로 사용하는 Azure 리소스에 액세스할 수 있도록 하는 Kubernetes 기본 요소로 ID 및 바인딩을 만듭니다.

Important

Microsoft Entra 워크로드 ID를 검토해 보시기 바랍니다. 이 인증 방법은 Kubernetes 네이티브 기능과 통합되어 애플리케이션을 대신하여 외부 ID 공급자와 페더레이션하는 Pod 관리 ID(미리 보기)를 대체합니다.

Azure Kubernetes Service의 오픈 소스 Microsoft Entra Pod 관리 ID(미리 보기)는 2022년 10월 24일에 더 이상 사용되지 않으며 프로젝트는 2023년 9월에 보관되었습니다. 자세한 내용은 사용 중단 알림을 참조하세요. AKS 관리 추가 기능은 2024년 9월에 더 이상 사용되지 않습니다.

AKS 관리 추가 기능을 사용하지 않도록 설정하려면 다음 명령을 사용합니다. az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview".

시작하기 전에

Azure CLI 버전 2.20.0 이상이 설치되어 있어야 합니다.

제한 사항

  • 클러스터에는 최대 200개의 Pod 관리 ID가 허용됩니다.
  • 클러스터에 대해 최대 200개의 Pod 관리 ID 예외가 허용됩니다.
  • Pod 관리 ID는 Linux 노드 풀에서만 사용할 수 있습니다.
  • 이 기능은 Virtual Machine Scale Sets 지원 클러스터에서만 지원됩니다.

aks-preview Azure CLI 확장 설치

Important

AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.

aks-preview 확장을 설치하려면 다음 명령을 실행합니다.

az extension add --name aks-preview

다음 명령을 실행하여 릴리스된 확장의 최신 버전으로 업데이트합니다.

az extension update --name aks-preview

'EnablePodIdentityPreview' 기능 플래그 등록

다음 예제와 같이 az feature register 명령을 사용하여 EnablePodIdentityPreview 기능 플래그를 등록합니다.

az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

상태가 Registered로 표시되는 데 몇 분 정도 걸립니다. az feature show 명령을 사용하여 등록 상태를 확인합니다.

az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

상태가 등록됨으로 표시되면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 새로 고칩니다.

az provider register --namespace Microsoft.ContainerService

작업 모드 옵션

Microsoft Entra Pod 관리 ID는 두 가지 작동 모드를 지원합니다.

  • 표준 모드: 이 모드에서는 다음 두 구성 요소가 AKS 클러스터에 배포됩니다.
    • MIC(Managed Identity Controller): MIC는 Kubernetes API Server를 통해 Pod, AzureIdentityAzureIdentityBinding의 변경을 감시하는 Kubernetes 컨트롤러입니다. 관련 변경 내용이 검색되면 MIC는 필요에 따라 AzureAssignedIdentity를 추가하거나 삭제합니다. 특히 Pod가 예약되면 MIC는 만들기 단계 중 노드 풀에서 사용하는 기본 Virtual Machine Scale Set에 Azure의 관리 ID를 할당합니다. ID를 사용하는 모든 Pod가 삭제되면 동일한 관리 ID가 다른 Pod에서 사용되지 않는 한 노드 풀의 Virtual Machine Scale Set에서 ID를 제거합니다. MIC는 AzureIdentity 또는 AzureIdentityBinding을 만들거나 삭제할 때도 유사한 작업을 수행합니다.
    • NMI(Node Managed Identity): NMI는 AKS 클러스터의 각 노드에서 DaemonSet로 실행되는 Pod입니다. NMI는 각 노드에서 Azure Instance Metadata Service에 대한 보안 토큰 요청을 가로채고, 해당 요청을 자신에게 리디렉션하고, Pod가 토큰을 요청하는 ID에 액세스하고 애플리케이션을 대신하여 Microsoft Entra 테넌트에서 토큰을 가져올 수 있는지 확인합니다.
  • 관리 모드: 이 모드는 NMI만 제공합니다. AKS 클러스터 추가 항목을 통해 설치하는 경우 Azure는 사용자의 CLI 명령에 대한 응답으로 Kubernetes 기본 형식(AzureIdentity 및 AzureIdentityBinding) 및 ID 할당 만들기를 관리합니다. 그렇지 않으면 Helm 차트를 통해 설치되는 경우 ID를 사용자가 수동으로 할당하고 관리해야 합니다. 자세한 내용은 관리형 모드의 Pod ID를 참조하세요.

설치 가이드에 표시된 대로 Helm 차트 또는 YAML 매니페스트를 통해 Microsoft Entra Pod 관리 ID를 설치할 때 standardmanaged 모드 중에서 선택할 수 있습니다. 대신 이 문서에 표시된 대로 AKS 클러스터 추가 기능을 사용하여 Microsoft Entra Pod 관리 ID를 설치하기로 결정한 경우 설정에서는 managed 모드를 사용합니다.

Azure CNI(Container Networking Interface)를 사용하여 AKS 클러스터 만들기

참고 항목

이는 기본 권장 구성입니다.

Azure CNI 및 Pod 관리 ID를 사용하도록 설정하여 AKS 클러스터를 만듭니다. 다음 명령은 az group create를 사용하여 myResourceGroup이라는 리소스 그룹을 만들고 az aks create 명령을 사용하여 myResourceGroup 리소스 그룹에 myAKSCluster라는 AKS 클러스터를 만듭니다.

az group create --name myResourceGroup --location eastus
az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --enable-pod-identity \
    --network-plugin azure \
    --generate-ssh-keys

AKS 클러스터에 로그인하려면 az aks get-credentials를 사용합니다. 또한 이 명령은 개발 컴퓨터에서 kubectl 클라이언트 인증서를 다운로드하고 구성합니다.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

참고 항목

AKS 클러스터에서 Pod 관리 ID를 사용하도록 설정하면 aks-addon-exception이라는 AzurePodIdentityException이 kube-system 네임스페이스에 추가됩니다. AzurePodIdentityException을 사용하면 특정 레이블이 있는 Pod가 Azure IMDS(Instance Metadata Service) 엔드포인트에 액세스할 수 있으며 NMI 서버가 해당 Pod를 가로채지 못합니다. aks-addon-exception을 사용하면 Microsoft Entra Pod 관리 ID와 같은 AKS 자사 추가 기능이 AzurePodIdentityException을 수동으로 구성하지 않고도 작동할 수 있습니다. 필요에 따라 az aks pod-identity exception add, az aks pod-identity exception delete, az aks pod-identity exception update 또는 kubectl을 사용하여 AzurePodIdentityException을 추가, 제거 및 업데이트할 수 있습니다.

Azure CNI를 사용하여 기존 AKS 클러스터 업데이트

Pod 관리 ID를 포함하도록 Azure CNI를 사용하여 기존 AKS 클러스터를 업데이트합니다.

az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity

Microsoft Entra Pod 관리 ID와 함께 Kubenet 네트워크 플러그 인 사용

Important

Kubenet이 포함된 클러스터에서 Microsoft Entra Pod 관리 ID를 실행하는 것은 보안 문제로 인해 권장되는 구성이 아닙니다. 기본 Kubenet 구성은 ARP 스푸핑을 방지하지 못합니다. 이 스푸핑은 Pod가 다른 Pod 역할을 하고 의도되지 않은 ID에 액세스하는 데 사용될 수 있습니다. Kubenet이 있는 클러스터에서 Microsoft Entra Pod 관리 ID를 사용하도록 설정하기 전에 완화 단계를 따르고 정책을 구성하세요.

완화

클러스터 수준에서 취약점을 완화하기 위해 Azure 기본 제공 정책 "Kubernetes 클러스터 컨테이너는 허용된 기능만 사용해야 합니다."를 사용하여 CAP_NET_RAW 공격을 제한할 수 있습니다.

"필수 삭제 기능"에 NET_RAW 추가

이미지

Azure Policy를 사용하지 않는 경우 OpenPolicyAgent 허용 컨트롤러를 Gatekeeper 유효성 검사 웹후크와 함께 사용할 수 있습니다. 클러스터에 이미 Gatekeeper가 설치된 경우 K8sPSPCapabilities 형식의 ConstraintTemplate을 추가합니다.

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/capabilities/template.yaml

NET_RAW 기능을 사용하여 Pod 생성을 제한하는 템플릿을 추가합니다.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPCapabilities
metadata:
  name: prevent-net-raw
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - "kube-system"
  parameters:
    requiredDropCapabilities: ["NET_RAW"]

Kubenet 네트워크 플러그 인을 사용하여 AKS 클러스터 만들기

Kubenet 네트워크 플러그 인 및 Pod 관리 ID를 사용하여 AKS 클러스터를 만듭니다.

az aks create \
    --resource-group $MY_RESOURCE_GROUP \
    --name $MY_CLUSTER \
    --enable-pod-identity \
    --enable-pod-identity-with-kubenet \
    --generate-ssh-keys

Kubenet 네트워크 플러그 인을 사용하여 기존 AKS 클러스터 업데이트

Pod 관리 ID를 포함하도록 Kubenet 네트워크 플러그 인을 사용하여 기존 AKS 클러스터를 업데이트합니다.

az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

ID 만들기

Important

ID를 만들려면 구독에 관련 권한(예: 소유자)이 있어야 합니다.

az identity create을 사용하여 데모 Pod에서 사용할 ID를 만들고 IDENTITY_CLIENT_ID 변수 및 IDENTITY_RESOURCE_ID 변수를 설정합니다.

az group create --name myIdentityResourceGroup --location eastus
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query clientId -o tsv)"
export IDENTITY_RESOURCE_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query id -o tsv)"

관리 ID에 대한 권한 할당

Pod에 할당될 관리 ID에는 수행할 작업에 맞는 권한이 부여되어야 합니다.

데모를 실행하려면 IDENTITY_CLIENT_ID 관리 ID에 AKS 클러스터의 Virtual Machine Scale Set가 포함된 리소스 그룹에서 가상 머신 기여자 권한이 있어야 합니다.

# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group 
NODES_RESOURCE_ID=$(az group show --name $NODE_GROUP -o tsv --query "id")

# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID

Pod ID 만들기

az aks pod-identity add를 사용하여 클러스터에 대한 Pod 관리 ID를 만듭니다.

export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}

참고 항목

“POD_IDENTITY_NAME”은 RFC 1123에 정의된 대로 유효한 DNS 하위 도메인 이름이어야 합니다.

참고 항목

pod-identity add를 사용하여 Pod 관리 ID를 할당하면 Azure CLI는 Pod 관리 ID(IDENTITY_RESOURCE_ID)에 대한 관리 ID 운영자 역할을 클러스터 ID에 부여하려고 시도합니다.

Azure는 클러스터에서 Azure의 ID를 나타내는 AzureIdentity 리소스와 AzureIdentity를 선택기로 연결하는 AzureIdentityBinding 리소스를 만듭니다. 다음을 사용하여 이러한 리소스를 볼 수 있습니다.

kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE

샘플 애플리케이션 실행

Pod가 Microsoft Entra Pod 관리 ID를 사용하려면 Pod에 AzureIdentityBinding의 선택기와 일치하는 값이 있는 aadpodidbinding 레이블이 필요합니다. 기본적으로 선택기는 Pod 관리 ID의 이름과 일치하지만 az aks pod-identity add 호출 시 --binding-selector 옵션을 사용하여 설정할 수도 있습니다.

Microsoft Entra Pod 관리 ID를 사용하여 샘플 애플리케이션을 실행하려면 다음 콘텐츠로 demo.yaml 파일을 만듭니다. POD_IDENTITY_NAME, IDENTITY_CLIENT_IDIDENTITY_RESOURCE_GROUP을 이전 단계의 값으로 바꿉니다. SUBSCRIPTION_ID를 구독 ID로 바꿉니다.

참고 항목

이전 단계에서는 POD_IDENTITY_NAME, IDENTITY_CLIENT_IDIDENTITY_RESOURCE_GROUP 변수를 만들었습니다. echo와 같은 명령을 사용하여 변수에 대해 설정한 값(예: echo $POD_IDENTITY_NAME)을 표시할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: $POD_IDENTITY_NAME
spec:
  containers:
  - name: demo
    image: mcr.microsoft.com/oss/azure/aad-pod-identity/demo:v1.6.3
    args:
      - --subscriptionid=$SUBSCRIPTION_ID
      - --clientid=$IDENTITY_CLIENT_ID
      - --resourcegroup=$IDENTITY_RESOURCE_GROUP
    env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: MY_POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  nodeSelector:
    kubernetes.io/os: linux

Pod 정의에는 이전 단계에서 az aks pod-identity add를 실행한 Pod 관리 ID 이름과 일치하는 값을 가진 aadpodidbinding 레이블이 있습니다.

kubectl apply를 사용하여 Pod 관리 ID와 동일한 네임스페이스에 demo.yaml을 배포합니다.

kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE

샘플 애플리케이션이 kubectl logs를 사용하여 성공적으로 실행되는지 확인합니다.

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

로그에 토큰이 성공적으로 획득되고 GET 작업이 성공했다고 표시되는지 확인합니다.

...
successfully doARMOperations vm count 0
successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
successfully made GET on instance metadata
...

여러 ID를 사용하여 애플리케이션 실행

애플리케이션에서 여러 ID를 사용하도록 설정하려면 Pod ID를 만들 때 --binding-selector를 동일한 선택기로 설정합니다.

az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector

그런 다음, Pod YAML의 aadpodidbinding 필드를 지정한 바인딩 선택기로 설정합니다.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: myMultiIdentitySelector
...

기존 클러스터에서 Pod 관리 ID 사용 안 함

기존 클러스터에서 Pod 관리 ID를 사용하지 않도록 설정하려면 클러스터에서 Pod 관리 ID를 제거합니다. 그런 다음 클러스터에서 기능을 사용하지 않도록 설정합니다.

az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity

정리

클러스터에서 Microsoft Entra Pod 관리 ID를 제거하려면 클러스터에서 샘플 애플리케이션과 Pod 관리 ID를 제거합니다. 그런 다음 클러스터 ID의 ID 및 역할 할당을 제거합니다.

kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az identity delete --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

다음 단계

관리 ID에 대한 자세한 내용은 Azure 리소스에 대한 관리 ID를 참조하세요.