ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

    [참고 문서]

    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

     

    '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
Designed by Tistory.