kubernetes/udemy

[udemy] Azure Container Registry for AKS (2)

bbiyak2da 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

 

[참고 문서]

https://github.com/stacksimplify/azure-aks-kubernetes-masterclass/tree/master/18-Azure-Container-Registry-ACR/18-02-ACR-not-attached-to-AKS-Schedule-to-NodePools