Azure Kubernetes Service(AKS)의 Azure Container Registry(ACR)를 사용하여 인증

AKS(Azure Kubernetes Service)에서 ACR(Azure Container Registry)을 사용하는 경우 인증 메커니즘을 설정해야 합니다. Azure CLI, Azure PowerShell 또는 Azure Portal을 사용하여 ACR과 AKS 간에 필요한 권한을 구성할 수 있습니다. 이 문서에서는 Azure CLI 또는 Azure PowerShell을 사용하여 이러한 Azure 서비스 간에 인증을 구성하는 예제를 제공합니다.

AKS-ACR 통합은 AKS 클러스터의 에이전트 풀과 연결된 Microsoft Entra ID 관리 IDAcrPull 역할을 할당합니다. AKS 관리 ID에 대한 자세한 내용은 관리 ID 요약을 참조하세요.

Important

ACR을 연결할 때 Microsoft Entra 그룹에 대기 시간 문제가 있습니다. AcrPull 역할이 Microsoft Entra 그룹에 부여되고 RBAC 구성을 완료하기 위해 kubelet ID가 그룹에 추가되는 경우 RBAC 그룹이 적용되기 전에 지연이 있을 수 있습니다. RBAC 구성을 완료해야 하는 자동화를 실행하는 경우 해결 방법으로 자체 kubelet ID 사용을 사용하는 것이 좋습니다. 사용자가 할당한 ID를 미리 만들고, Microsoft Entra 그룹에 추가한 다음, ID를 kubelet ID로 사용하여 AKS 클러스터를 만들 수 있습니다. 이렇게 하면 kubelet에서 토큰을 생성하기 전에 ID가 Microsoft Entra 그룹에 추가되므로 대기 시간 문제가 방지됩니다.

참고 항목

이 문서에서는 AKS와 ACR 간의 자동 인증을 다룹니다. 프라이빗 외부 레지스트리에서 이미지를 풀해야 하는 경우 이미지 풀 비밀을 사용합니다.

시작하기 전에

  • Azure 구독에 소유자, Azure 계정 관리자 또는 Azure 공동 관리자 역할이 있어야 합니다.
  • 이 문서를 진행하려면 Azure CLI 버전 2.7.0 이상을 실행하고 있어야 합니다. az --version을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.
  • Azure PowerShell을 사용하는 경우 이 문서에서는 Azure PowerShell 버전 5.9.0 이상을 실행해야 합니다. Get-InstalledModule -Name Az을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure PowerShell 설치를 참조하세요.
  • ACR을 구성하기 위해 Terraform을 사용하는 예제 및 구문은 Terraform 참조에서 찾을 수 있습니다.

새 ACR 만들기

  • ACR이 아직 없는 경우 az acr create 명령을 사용하여 만듭니다. 다음 예제에서는 MYACR 변수를 ACR, mycontainerregistry의 이름으로 설정하고, 변수를 사용하여 레지스트리를 만듭니다. ACR 이름은 전역적으로 고유해야 하며 소문자만 사용해야 합니다.

    MYACR=mycontainerregistry
    
    az acr create -n $MYACR -g myContainerRegistryResourceGroup --sku basic
    

새 AKS 클러스터를 만들고 기존 ACR과 통합

  • 새 AKS 클러스터를 만들고 az aks create 명령과 --attach-acr 매개 변수를 함께 사용하여 기존 ACR과 통합합니다. 이 명령을 사용하여 구독의 기존 ACR에 권한을 부여하고 관리 ID에 적절한 AcrPull 역할을 구성할 수 있습니다.

    MYACR=mycontainerregistry
    
    az aks create -n myAKSCluster -g myResourceGroup --generate-ssh-keys --attach-acr $MYACR
    

    이 명령을 완료하는 데는 몇 분 정도 걸릴 수 있습니다.

    참고 항목

    AKS 클러스터와 다른 구독에 있는 ACR을 사용하거나 ACR 이름 대신 ACR 리소스 ID를 사용하려는 경우 다음 구문을 사용하면 그렇게 할 수 있습니다.

    az aks create -n myAKSCluster -g myResourceGroup --generate-ssh-keys --attach-acr /subscriptions/<subscription-id>/resourceGroups/myContainerRegistryResourceGroup/providers/Microsoft.ContainerRegistry/registries/myContainerRegistry
    

기존 AKS 클러스터에 대한 ACR 통합 구성

기존 AKS 클러스터에 ACR 연결

  • az aks update 명령과 --attach-acr 매개 변수acr-name 또는 acr-resource-id에 유효한 값과 함께 사용하여 기존 ACR을 기존 AKS 클러스터와 통합합니다.

    # Attach using acr-name
    az aks update -n myAKSCluster -g myResourceGroup --attach-acr <acr-name>
    
    # Attach using acr-resource-id
    az aks update -n myAKSCluster -g myResourceGroup --attach-acr <acr-resource-id>
    

    참고 항목

    az aks update --attach-acr 명령은 명령을 실행하는 사용자의 권한을 사용하여 ACR 역할 할당을 만듭니다. 이 역할은 kubelet 관리 ID에 할당됩니다. AKS 관리 ID에 대한 자세한 내용은 관리 ID 요약을 참조하세요.

AKS 클러스터에서 ACR 분리

  • az aks update 명령을 --detach-acr 매개 변수acr-name 또는 acr-resource-id에 유효한 값을 사용하여 ACR과 AKS 클러스터 간의 통합을 제거합니다.

    # Detach using acr-name
    az aks update -n myAKSCluster -g myResourceGroup --detach-acr <acr-name>
    
    # Detach using acr-resource-id
    az aks update -n myAKSCluster -g myResourceGroup --detach-acr <acr-resource-id>
    

ACR 및 AKS 사용

ACR로 이미지 가져오기

  • az acr import 명령을 사용하여 Docker Hub에서 ACR로 이미지를 가져옵니다.

    az acr import  -n <acr-name> --source docker.io/library/nginx:latest --image nginx:v1
    

ACR에서 AKS로 샘플 이미지 배포

  1. az aks get-credentials 명령을 사용하여 적절한 AKS 자격 증명을 보유해야 합니다.

    az aks get-credentials -g myResourceGroup -n myAKSCluster
    
  2. 다음 샘플 YAML을 사용하여 acr-nginx.yaml이라는 파일을 만들고 acr-name을 ACR 이름으로 바꿉니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx0-deployment
      labels:
        app: nginx0-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx0
      template:
        metadata:
          labels:
            app: nginx0
        spec:
          containers:
          - name: nginx
            image: <acr-name>.azurecr.io/nginx:v1
            ports:
            - containerPort: 80
    
  3. kubectl apply 명령을 사용하여 AKS 클러스터에서 배포를 실행합니다.

    kubectl apply -f acr-nginx.yaml
    
  4. kubectl get pods 명령을 사용하여 배포를 모니터링합니다.

    kubectl get pods
    

    출력은 다음 예제 출력과 같이 두 개의 실행 중인 Pod를 표시해야 합니다.

    NAME                                 READY   STATUS    RESTARTS   AGE
    nginx0-deployment-669dfc4d4b-x74kr   1/1     Running   0          20s
    nginx0-deployment-669dfc4d4b-xdpd6   1/1     Running   0          20s
    

문제 해결

  • az aks check-acr 명령을 사용하여 AKS 클러스터에서 레지스트리에 액세스할 수 있는지 확인합니다.
  • ACR 모니터링에 대해 자세히 알아봅니다.
  • ACR 상태에 대해 자세히 알아봅니다.