Azure Container Registry 및 AKS Arc를 사용하여 프라이빗 컨테이너 레지스트리에서 온-프레미스 Kubernetes로 배포

적용 대상: Azure Stack HCI, 버전 23H2

이 문서에서는 AKS Arc 배포의 자체 데이터 센터에서 실행할 수 있는 Azure Container Registry 사용하여 프라이빗 컨테이너 레지스트리에서 컨테이너 이미지를 배포하는 방법을 설명합니다. AKS에서 호스트하는 온-프레미스 Kubernetes 클러스터에 배포합니다. Azure Container Registry를 사용하면 모든 유형의 컨테이너 배포를 위해 이미지와 아티팩트를 프라이빗 레지스트리에 빌드, 저장 및 관리할 수 있습니다.

이 문서에서는 Azure에서 프라이빗 컨테이너 레지스트리를 만들고 컨테이너 이미지를 프라이빗 컨테이너 레지스트리에 푸시하는 방법을 설명합니다. 그런 다음 프라이빗 레지스트리에서 AKS Arc에서 호스트되는 온-프레미스 Kubernetes 클러스터로 배포할 수 있습니다.

Azure Container Registry 대한 자세한 내용은 Azure Container Registry 설명서를 참조하세요.

사전 요구 사항

다음 요구 사항이 있는지 확인합니다.

  • Kubernetes 개념에 대한 기본적인 이해.
  • 실행 중인 AKS 클러스터입니다.
  • Azure CLI 설치됨
  • AKS 클러스터를 가리키도록 구성된 로컬 kubectl 환경입니다.

Azure에서 프라이빗 컨테이너 레지스트리 만들기

컨테이너 레지스트리를 만들려면 리소스 그룹으로 시작합니다. Azure 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다. az group create 명령을 사용하여 리소스 그룹을 만듭니다. 다음 예제에서는 eastus 지역에 리소스 그룹을 만듭니다.

az group create --name <RESOURCE_GROUP_NAME> --location eastus

az acr create 명령을 사용하여 Container Registry instance 만들고 고유한 레지스트리 이름을 제공합니다. 레지스트리 이름은 Azure 내에서 고유해야 하며, 5~50자의 영숫자를 포함해야 합니다. 이 문서의 <acrName> 나머지 부분에는 가 컨테이너 레지스트리 이름의 자리 표시자로 사용되지만 고유한 레지스트리 이름을 제공할 수 있습니다. 기본 SKU는 스토리지와 처리량의 균형을 제공하는 개발 목적으로 비용 최적화 진입점입니다.

az acr create --resource-group <RESOURCE_GROUP_NAME> --name <REGISTRY_NAME> --sku Basic

컨테이너 레지스트리를 만든 후 다음 명령을 사용하여 서비스 주체를 만들므로 Kubernetes에서 컨테이너 레지스트리에 액세스할 수 있습니다.

az ad sp create-for-rbac /
--scopes /subscriptions/<SUBSCRIPTION_ID>/resourcegroups/<RG_NAME>/providers/Microsoft.ContainerRegistry/registries/<REGISTRY_NAME> /
--role Contributor /
--name <SERVICE_PRINCIPAL_NAME>

Azure Container Registry 세 가지 액세스 역할을 지원합니다. 기여자 역할은 애플리케이션 개발자가 가장 일반적으로 사용합니다. 그러나 실제 시나리오에서는 필요한 액세스 유형에 따라 여러 서비스 주체를 만들어야 할 수 있습니다.

  • 기여자: 이 역할은 리포지토리에 푸시 및 끌어오기 액세스 제공합니다.
  • 읽기 권한자: 이 역할은 리포지토리에 대한 끌어오기 액세스 허용합니다.
  • 소유자: 이 역할을 사용하면 리포지토리에 푸시 및 끌어오기 액세스 외에도 다른 사용자에게 역할을 할당할 수 있습니다.

이전 명령은 다음 텍스트와 유사한 출력을 생성해야 합니다.

{
"appId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"displayName": "akshci-service-principal",
"name": "http://akshci-service-principal",
"password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"tenant": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

서비스 주체가 성공적으로 만들어지면 안전한 위치에 appId 및 암호를 복사하여 배포의 뒷부분에서 사용합니다.

서비스 사용자 및 Azure Container Registry 사용에 대한 자세한 내용은 서비스 사용자로 Azure Container Registry 인증을 참조하세요.

프라이빗 컨테이너 레지스트리에 로그인

Container Registry instance 사용하려면 먼저 로그인해야 합니다. Azure CLI 또는 Docker CLI를 사용하여 로그인할 수 있습니다.

옵션 1: Azure CLI에서 로그인

az acr sign in 명령을 사용하고 이전 단계에서 컨테이너 레지스트리에 할당된 고유한 이름을 제공합니다.

az acr login --name <REGISTRY_NAME>

옵션 2: Docker CLI에서 로그인

Docker CLI를 사용하여 컨테이너 레지스트리에 액세스하려면 Bash 또는 PowerShell 터미널에 다음 명령을 입력합니다.

docker login <REGISTRY_NAME>.azurecr.io -u <appId> -p <password>

두 옵션 모두 명령이 완료되면 로그인 성공 메시지를 반환해야 합니다.

컨테이너 레지스트리에 이미지 푸시

성공적으로 로그인하면 컨테이너 레지스트리에 이미지 푸시를 시작할 수 있습니다. 먼저 docker images 명령을 실행하여 로컬 컴퓨터의 이미지 목록을 봅니다.

REPOSITORY TAG IMAGE ID CREATED SIZE

mcr.microsoft.com/azure-functions/dotnet 3.0 9f8ad1bdee67 5 months ago
540MB

poemfinder-app latest 2d9bef425603 6 months ago 208MB

시작하려면 docker tag 명령을 사용하여 이미지에 태그를 지정한 다음 docker push 를 사용하여 컨테이너 레지스트리에 푸시합니다.

docker tag poemfinder-app <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0

docker images 명령을 다시 실행하여 이미지에 올바르게 태그가 지정되었는지 확인합니다. 확인 후 를 실행 docker push 하여 다음과 같이 컨테이너 레지스트리로 푸시합니다.

docker push <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0

이미지가 컨테이너 레지스트리에 성공적으로 푸시되었는지 확인하려면 다음 명령을 실행합니다.

az acr repository list --name <REGISTRY_NAME>.azurecr.io --output table

컨테이너 레지스트리에서 AKS로 이미지 배포

컨테이너 레지스트리에서 Kubernetes 클러스터로 컨테이너 이미지를 배포하려면 Kubernetes 비밀을 만들어 레지스트리 자격 증명을 저장합니다. Kubernetes는 이미지 끌어오기 비밀을 사용하여 레지스트리 인증에 필요한 정보를 저장합니다. 컨테이너 레지스트리에 대한 끌어오기 비밀을 만들려면 서비스 주체 ID, 암호 및 레지스트리 URL을 제공합니다.

kubectl create secret docker-registry <secret-name> \
--namespace <namespace> \
--docker-server=<REGISTRY_NAME>.azurecr.io \
--docker-username=<appId> \
--docker-password=<password>

다음 표에서는 입력 매개 변수에 대해 설명합니다.

Description
secret-name 이미지의 이름은 비밀을 가져옵니다. 예를 들면 입니다 acr-secret.
namespace 비밀을 넣을 Kubernetes 네임스페이스입니다. 기본 네임스페이스가 아닌 네임스페이스에 비밀을 배치하려는 경우에만 필요합니다.
<REGISTRY_NAME> 컨테이너 레지스트리의 이름입니다. myregistry)을 입력합니다. 는 --docker-server 레지스트리 로그인 서버의 정규화된 이름입니다.
appId Kubernetes가 레지스트리에 액세스하는 데 사용하는 서비스 주체의 ID입니다.
password 서비스 주체 암호입니다.

이미지 끌어오기 비밀을 만든 후에는 이를 사용하여 Kubernetes Pod 및 배포를 만들 수 있습니다. 다음 예제와 같이 배포 파일의 아래 imagePullSecrets 비밀 이름을 입력합니다.

apiVersion: v1
kind: Pod
metadata:
name: poemfinder-app
namespace: mydemoapps
spec:
containers:
 - name: poemfinder-app
   image: <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0
   imagePullPolicy: IfNotPresent
 - imagePullSecrets:
   - name: acr-secret

이 예제 poemfinder-app:v1.0 에서 은 컨테이너 레지스트리에서 끌어올 이미지의 이름이며 acr-secret 레지스트리에 액세스하기 위해 만든 끌어오기 비밀의 이름입니다. Pod를 배포할 때 Kubernetes는 이미지가 클러스터에 아직 없는 경우 레지스트리에서 이미지를 자동으로 가져옵니다.

위의 Pod 구성을 pod-example.yaml 과 같은 파일에 저장한 다음 다음과 같이 Kubernetes에 배포할 수 있습니다.

kubectl create -f pod-example.yaml

컨테이너 레지스트리의 컨테이너 이미지를 사용하여 Pod가 성공적으로 만들어졌는지 확인하려면 Pod를 만드는 데 사용되는 컨테이너 이미지를 표시해야 하는 kubectl describe Pod <POD_NAME> 실행합니다.

다음 단계