Azure Kubernetes Service의 Azure Container Registry를 사용하여 인증

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

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

중요

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

참고

이 문서에서는 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 통합을 사용하여 새 AKS 클러스터 만들기

AKS 클러스터를 만들 때 AKS 및 ACR 통합을 설정할 수 있습니다. AKS 클러스터가 ACR과 상호 작용하도록 Azure AD 관리 ID가 사용됩니다.

ACR 만들기

ACR이 아직 없는 경우 다음 명령을 사용하여 만듭니다.

# Set this variable to the name of your ACR. The name must be globally unique.

MYACR=myContainerRegistry

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

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

ACR이 이미 있는 경우 다음 명령을 사용하여 ACR 통합을 사용하여 새 AKS 클러스터를 만듭니다. 이 명령을 사용하여 구독의 기존 ACR에 권한을 부여하고 관리 ID에 적절한 AcrPull 역할을 구성할 수 있습니다. 아래 매개 변수에 대한 유효한 값을 제공합니다.

# Set this variable to the name of your ACR. The name must be globally unique.

MYACR=myContainerRegistry

# Create an AKS cluster with ACR integration.

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

또는 다음 형식의 ACR 리소스 ID를 사용하여 ACR 이름을 지정할 수 있습니다.

/subscriptions/\<subscription-id\>/resourceGroups/\<resource-group-name\>/providers/Microsoft.ContainerRegistry/registries/\<name\>

참고

AKS 클러스터와는 다른 구독에 있는 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 연결

아래와 같이 --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 분리

--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로 이미지 가져오기

다음 명령을 실행하여 Docker Hub에서 ACR로 이미지를 가져옵니다.

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

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

적절한 AKS 자격 증명을 보유해야 합니다.

az aks get-credentials -g myResourceGroup -n myAKSCluster

아래 샘플 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

파일을 만든 후 AKS 클러스터에서 다음 배포를 실행합니다.

kubectl apply -f acr-nginx.yaml

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 상태에 대해 자세히 알아봅니다.