MSA 인프라 구축하기 with Azure(3)-AKS & ACR

SeungJu(하늘하늘)·2022년 10월 6일
0

1. CI/CD 파이프 라인

CI/CD란 지속적 통합(Continuos Integration)/지속적 배포(Continuous Deployment)로, 양질의 서비스를 짧은 주기로 사용자에게 제공하기 위해
개발 단계를 자동화하는 것을 의미합니다.
CI란 빌드에서 테스트까지의 자동화하는 것이며, CD란 배포 자동화 과정을 의미합니다.
CI/CD가 도입 되기 전에는 개발자들이 직접 오류를 찾아 해결하고 수동 배포를 진행해야 했지만, CI/CD를 도입하면 이와 같은 과정이 자동화 되어 개발자가 개발에 더욱 집중할 수 있고,
테스트를 통해 더욱 좋은 품질의 코드를 제공할 수 있습니다.
아래는 저희 프로젝트의 CI/CD 파이프라인입니다.

해당 파이프 라인에서 Jenkins는 CI를 담당하고, Argo는 CD를 담당하도록 하여 역할을 분리하였습니다.
Git Branch에 Push가 되면 Jenkins로 Webhook을 통해 빌드 명령을 전달하고, 빌드와 테스트가 완료되면 ACR에 이미지를 저장하고
Argo의 설정을 관리하는 GitOps에 image number를 push합니다.
argoCd는 3분마다 gitOps의 manifest를 폴링하면서 업데이트를 감지하고 업데이트가 있으면 AKS에 배포가 되는 구조를 취했습니다.

Azure를 이용해서 CI/CD를 구축하는 또 다른 방법에는 Azure DevOps를 활용하는 방법이 있습니다.
해당 기능을 사용하지 않고 직접 구축한 이유는
1. Azure DevOps의 레퍼런스가 적기 때문입니다. 생소한 프로젝트를 진행할 때에 레퍼런스가 많다는 것은 프로젝트 진행 속도를 더욱 빠르게 해준다고 생각합니다.
2. Jenkins로 파이프라인을 구축하면 Azure와의 종속성이 떨어지기 때문입니다.
Azure DevOps을 이용한 파이프라인 구축은 Azure에서 제공하는 가이드를 참고하시기 바랍니다.
https://learn.microsoft.com/ko-kr/azure/architecture/example-scenario/apps/devops-dotnet-webapp

2. ACR과 AKS

이번 실습에서 진행할 ACR과 AKS의 생성에 앞서 ACR과 AKS가 무엇인지 간단하게 짚고 넘어가겠습니다.

ACR

컨테이너 이미지를 빌드하고 나면 해당 이미지들을 보관해야하는데 이를 위한 역할은 Container Registry가 해줄 수 있습니다.
대표적으로는 Docker Hub가 있고, 도커를 이용해서 개인 private registry를 구성할 수도 있습니다.
이와 같은 역할을 해주는 ACR은 Azure Container Registry로 Docker Registry 2.0을 기반으로 하는 관리형 레지스트리 서비스입니다.

AKS

CSP(Cloud Service Provider, 클라우드 서비스 제공업체로 AWS, Azure, Google 등을 의미합니다.)는 대부분 kubernetes와 관련된 서비스를 제공합니다.
AWS는 EKS, Google은 GKE, Azure은 AKS입니다. AKS 자체는 무료이지만, 클러스터 내의 에이전트 노드에 대한 비용은 지불해야 합니다.
AKS는 클러스터를 Azure에서 관리하기때문에 사용자는 클러스터에 대해 크게 걱정할 필요가 없다는 장점이 있습니다.
하지만 에이전트 노드와 같은 일부 구성요소에는 사용자가 직접 관리를 해야하는 부분이 있기 떄문에 공유 책임이 있습니다.

3. Dockerfile 작성

msa Project의 루트폴더에 Dockerfile을 생성합니다.
프로젝트 버전에 맞는 jdk 버전으로 베이스 이미지를 잡으시면 됩니다.

maven

FROM openjdk:12-jdk-alpine
COPY target/*SNAPSHOT.jar app.jar
EXPOSE 8080
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ARG ENVIRONMENT
ENV SPRING_PROFILES_ACTIVE=${ENVIRONMENT}

ENTRYPOINT ["java","-jar","/app.jar"]

gradle

FROM openjdk:12-jdk-alpine
COPY build/libs/*.jar app.jar
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ARG ENVIRONMENT
ENV SPRING_PROFILES_ACTIVE=${ENVIRONMENT}

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

3. ACR 생성 및 이미지 올리기

아래 실습 진행을 위해선 [AKS에 MSA 인프라 구축하기(1)]이 선행되어야 합니다.

ACR(Azure Container Registry) 생성

msa-project-group 리소스 그룹에 msaprojectregistry001이라는 ACR을 생성합니다.
이 때 ACR의 명명규칙은 5~50자 내의 소문자와 숫자만 가능하며, 이름은 고유해야합니다.

az acr create --resource-group msa-project-group --name msaprojectregistry001 --sku Basic

ACR에 이미지 올리기

아래의 실습은 CI/CD를 구축하기 전 Jenkins파일에 들어갈 명령들을 직접 테스트 하는 부분입니다.
굳이 하지 않으셔도 CI/CD를 구축하는데에는 문제가 없습니다.

먼저 acr에 로그인합니다. 성공하면 Login Succeeded 메시지를 반환합니다.

az acr login --name msaprojectregistry001

msa Project 루트에서 docker 빌드로 이미지를 생성합니다.

  • ${ENVIRONMENT} : 빌드할 환경을 의미합니다.(dev / prod)
  • ${IMAGE_REPO} : 생성한 acr의 주소를 의미합니다. portal에서 acr에 들어간 후 개요의 로그인 서버에서 확인 가능합니다.
    • ex) msaprojectregistry001.azurecr.io
  • ${IMAGE_NAME} : 생성할 레포지토리 이름을 의미합니다.
    • ex) msaproject/dev/project-name
docker build --build-arg ENVIRONMENT=${ENVIRONMENT} -t ${IMAGE_REPO}/${IMAGE_NAME}:latest .

이미지를 acr에 push합니다.

docker push ${IMAGE_REPO}/${IMAGE_NAME}:latest

portal의 Acr에서 리포지토리에서 확인 가능합니다.

4. AKS 클러스터 생성 및 ACR과 연결

클러스터 생성

msa-project-group 그룹 안에 msa-project-kubernetes라는 AKS 클러스터를 생성합니다.
이때 시스템 할당 관리 ID를 사용하도록 설정(--enable-managed-identity)하고, 노드의 갯수는 1개(--node-count 1), monitoring addon(--enable-addons monitoring)을 추가하였습니다.
필요에 따라 해당 명령어를 맞게 바꿔주시면 됩니다.

  • windows
az aks create -g msa-project-group -n msa-project-kubernetes --enable-managed-identity --node-count 1 --enable-addons monitoring  --generate-ssh-keys
  • 그 외 운영체제
az aks create -g msa-project-group -n msa-project-kubernetes --enable-managed-identity --node-count 1 --enable-addons monitoring

클러스터 연결

먼저 kubectl을 설치합니다.

az aks install-cli

그리고 msa-project-group 그룹 안에 msa-project-kubernetes라는 AKS 클러스터와 연결합니다.

az aks get-credentials --resource-group msa-project-group --name msa-project-kubernetes

연결 확인은 아래의 명령을 통해 가능합니다.

kubectl get nodes

클러스터와 ACR 인증 연결

msa-project-kubernetes클러스터와 msa-project-group 에 속해있는 msaprojectregistry001라는 레지스트리를 연결합니다.
연결하지 않을 경우 ACR에서 이미지를 pull할 수 없습니다.

az aks update -n msa-project-kubernetes -g msa-project-group --attach-acr msaprojectregistry001

이제는 ACR과 AKS 생성까지는 완료하였습니다.
다음에는 Azure VM을 이용하여 Jenkins 를 설치하는 과정을 진행해보겠습니다.

profile
나의 개발 세상

0개의 댓글