-
[udemy] Azure Container Registry for AKS (2)kubernetes/udemy 2025. 2. 26. 17:18
Azure Container Registry (2)
Docker image 빌드 후,
이를 ACR에 push해서 해당 이미지로 컨테이너까지 배포해보자 (with Service Principal)
https://bbiyak-cloud.tistory.com/150
[udemy] Azure Container Registry for AKS
Azure container Registry Docker image 빌드 후,이를 ACR에 push해서 해당 이미지로 컨테이너까지 배포해보자 사전 작업 # AKS 자격증명 획득az aks get-credentials --name --resource-group # ACR 생성 후 연결az aks update
bbiyak-cloud.tistory.com
사전 작업
# AKS 자격증명 획득
az aks get-credentials --name <aks 명> --resource-group <리소스 그룹명>
Docker image 생성
먼저, 이미지를 생성하기 위한 Dockerfile과 index.html 파일을 작성하자.
docker-manifests 폴더 내에 파일을 작성한다.
# docker-manifests 폴더 생성
mkdir docker-manifests cd docker manifests
# Dockerfile 파일 작성
vi Dockerfile
FROM nginx COPY index.html /usr/share/nginx/html
# index.html 파일 작성
vi index.html
<!DOCTYPE html> <html> <body style="background-color:rgb(135, 230, 216);"> <h1>Welcome to Stack Simplify - Azure Container Registry (ACR)</h1> <h2>ACR not attached to AKS</h2> <h2>Access ACR from Kubernetes using k8s Secrets & Azure Service Principal</h2> <p>Application Version: V1</p> </body> </html>
# Docker image 빌드docker build -t acr-app2:v1 .
# Docker image 확인
docker images
# 해당 image로 컨테이너 실행
docker run --name acr-app2 --rm -p 80:80 -d acr-app2:v1
# 컨테이너 접근
http://localhost
# 컨테이너 중단
docker stop acr-app2
Docker image를 ACR로 push
# ACR > 설정 > 액세스 키의 관리 사용자 활성화
ACR > 설정 > 액세스 키의 관리 사용자 활성화 후
사용자 이름과 password를 기록해둔다.
# 환경 변수 지정
export ACR_REGISTRY=serahpacr.azurecr.io export ACR_NAMESPACE=app2 export ACR_IMAGE_NAME=acr-app2 export ACR_IMAGE_TAG=v1 echo $ACR_REGISTRY, $ACR_NAMESPACE, $ACR_IMAGE_NAME, $ACR_IMAGE_TAG
# Docker 명령어를 통해 ACR에 로그인
docker login $ACR_REGISTRY
로그인 후, 사용자는 ACR에 이미지를 푸시하거나 풀 수 있는 권한을 가지게 된다.여기서 Username은 ACR 액세스 키의 사용자 이름, Password는 ACR 액세스 키의 패스워드를 입력한다.
# Docker tag
docker tag acr-app2:v1 $ACR_REGISTRY/$ACR_NAMESPACE/$ACR_IMAGE_NAME:$ACR_IMAGE_TAG
acr-app2:v1 이미지를 $ACR_REGISTRY/$ACR_NAMESPACE/$ACR_IMAGE_NAME:$ACR_IMAGE_TAG 형식의 새로운 태그로 지정하게 됩니다.
# Docker image를 ACR로 push
docker push $ACR_REGISTRY/$ACR_NAMESPACE/$ACR_IMAGE_NAME:$ACR_IMAGE_TAG
# 확인
ACR에 접근하기 위한 Service Principal 생성
Azure Service Principal은 Entra ID에서 애플리케이션이나 서비스가 Azure 리소스에 접근할 수 있도록 인증하는 보안 주체입니다. Service Principal은 일반적으로 다음과 같은 목적으로 사용됩니다.
1. 자동화: CI/CD 파이프라인, 스크립트 또는 애플리케이션이 Azure 리소스에 접근할 수 있도록 자동화된 방식으로 인증할 수 있습니다.
2. 권한 관리: Service Principal은 특정 리소스에 대한 권한을 부여받을 수 있으며, 이를 통해 최소 권한 원칙을 적용할 수 있습니다. 즉, 필요한 권한만 부여하여 보안을 강화할 수 있습니다.
3. 비밀 관리: Service Principal은 클라이언트 ID와 클라이언트 비밀(또는 인증서)을 사용하여 인증합니다. 이 정보는 안전하게 관리되어야 하며, 애플리케이션 코드에 하드코딩하지 않는 것이 좋습니다.# Service Principal 생성 및 권한 부여
az ad sp create-for-rbac --name <Service Principal 명> --role AcrPull --scopes /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ContainerRegistry/registries/<acr-name>
내 ACR에 Acrpull 권한을 가지는 Service principal을 생성하자
{ "appId": "***", "displayName": "***", "password": "***", "tenant": "***" }
정상적으로 생성되게 되면, 해당 값들이 출력된다.
해당 값들을 기록해놓자
앱 등록에서도 해당 Service Principal이 정상적으로 조회된다.
Secret 생성
# Secret 생성
kubectl create secret docker-registry <secret-name> \ --namespace <namespace> \ --docker-server=<container-registry-name>.azurecr.io \ --docker-username=<service-principal-ID> \ --docker-password=<service-principal-password>
위의 명령어는 Kubernetes에서 Azure Container Registry (ACR)에서 이미지를 가져오기 위한 비밀(Secret)을 생성하는 방법을 보여줍니다. 이 비밀은 Kubernetes 클러스터가 ACR에 접근할 수 있도록 인증 정보를 제공합니다.
- kubectl create secret docker-registry <secret-name>: 새로운 Docker 레지스트리 비밀을 생성합니다. <secret-name>은 생성할 비밀의 이름으로 대체해야 합니다.
- --namespace <namespace>: 비밀이 생성될 Kubernetes 네임스페이스를 지정합니다. <namespace>를 원하는 네임스페이스로 대체해야 합니다.
- --docker-server=<container-registry-name>.azurecr.io: ACR의 URL을 지정합니다. <container-registry-name>을 실제 ACR 이름으로 대체해야 합니다.
- --docker-username=<service-principal-ID>: ACR에 접근할 수 있는 Azure Service Principal의 ID를 입력합니다.
- --docker-password=<service-principal-password>: Azure Service Principal의 비밀번호를 입력합니다.
# Secret 확인
kubectl get secrets --- NAME TYPE DATA AGE serahpacr-secret kubernetes.io/dockerconfigjson 1 2m14s
샘플 애플리케이션 배포
# 01-acr-Deployment.yaml 파일 작성
apiVersion: apps/v1 kind: Deployment metadata: name: acrdemo2ss-deployment labels: app: acrdemo2ss spec: replicas: 1 selector: matchLabels: app: acrdemo2ss template: metadata: labels: app: acrdemo2ss spec: containers: - name: acrdemo2ss image: serahpacr.azurecr.io/app2/acr-app2:v1 # Update Image Name imagePullPolicy: Always ports: - containerPort: 80 imagePullSecrets: # Update Image Pull Secret Name we creted - name: serahpacr-secret
애플리케이션을 배포할 때, 내 acr의 이미지를 가져오고
내 레지스트리에서 이미지를 가져오기 위해
이전에 만들었던 secret을 활용한다.
# 02-acr-LoadBalancer-Service.yaml 파일 작성
apiVersion: v1 kind: Service metadata: name: acrdemo2ss-loadbalancer-service labels: app: acrdemo2ss spec: type: LoadBalancer selector: app: acrdemo2ss ports: - port: 80 targetPort: 80
# 생성
kubectl apply -f 01-acr-Deployment.yaml
kubectl apply -f 02-acr-LoadBalancer-Service.yaml
# 확인
kubectl get pods --- NAME READY STATUS RESTARTS AGE acrdemo2ss-deployment-79dcb85f7b-k7v6k 1/1 Running 0 42s
kubectl get svc --- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE acrdemo2ss-loadbalancer-service LoadBalancer 10.0.45.163 20.249.115.129 80:31892/TCP 50s kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 24h
Load Balancer의 External IP로 접근해본다.
# 샘플 애플리케이션 접근
정상적으로 접근할 수 있다.
[참고 영상]
Udemy - Azure Kubernetes Service with Azure DevOps and Terraform
섹션 19 : Azure Contaienr Registry for Azure AKS
[참고 문서]
'kubernetes > udemy' 카테고리의 다른 글
[udemy] Azure Container Registry for AKS (0) 2025.02.26 [udemy] Namespace (0) 2025.02.23 [udemy] Ingress - SSL with Let's Encrypt (0) 2025.02.23 [udemy] Ingress - ExternalDNS (2) (0) 2025.02.22 [udemy] Ingress - ExternalDNS (0) 2025.02.22 - kubectl create secret docker-registry <secret-name>: 새로운 Docker 레지스트리 비밀을 생성합니다. <secret-name>은 생성할 비밀의 이름으로 대체해야 합니다.