구상한 아키텍처

일단 초반에 생각한 구조는 이런 식의 아키텍처였는데, 일단 EKS 클러스터도 하나밖에 없고 프로토 단계여서 분기처리는 추후 하도록 하고 간단하게 아래와 같은 흐름으로 진행하였습니다.

(1) 개발자가 main 브랜치에 push하면 bitbucket pipeline 실행
(2) 도커 이미지 빌드하여 ECR Push
(3) ArgoCd config repo 의 Tag Set 변경 (kustomize 사용)
(4) EKS 배포


사전 조건

  • ECR 및 EKS 가 사전에 구축되어 있어야 합니다.
  • ECR 에 레포지토리가 생성되어 있어야 합니다.
  • 이미 배포할 manifest는 모두 생성하였고 테스트까지 완료한 최종 버전이어야 합니다.

1. ArgoCD 설치


2. ArgoCD Config Repo 구성

  • 저는 레파지토리 이름을 manifest 라고 지었습니다.

  • 프로젝트 구조는 아래와 같습니다

  • manifest (root)

    • health (제가 배포할 application 이름입니다)
      • base (base 가 되는 리소스 매니페스트 파일들입니다)
      • overlay (base 에 있는 파일들을 환경에 맞게 덮어써야할 경우 patch 하여 사용)
        • dev (dev 환경에 배포될 파일들)
        • prod (prod 환경에 배포될 파일들)

이렇게 구성되있고, 기본적으로 kustomization.yaml 파일을 작성할줄 아셔야 합니다.


  • base/kustomization.yaml
resources:
- deployment.yaml
- service.yaml
  • overlay/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images:
- name: <ECR 레포지토리 URI>
  newTag: <배포할 이미지 태그>
resources:
- ../../base
patchesStrategicMerge:
- deployment-patch.yaml
generatorOptions:
  disableNameSuffixHash: true

일단 기본적으로 ArgoCD 는 배포할때 저 images.name의 레포지토리에서 images.newTag를 가진 이미지를 배포하게 됩니다.

즉, (3) 번 단계에서는 결국 저 overlay/dev/kustomization.yaml 파일의 newTag 값을 바꿔주는 작업이 됩니다.
kustomize 명령어로 간단히 수행 가능합니다.

kustomize edit set image <ECR 레포 URI>:<새로운 태그>


3. ArgoCD 구성

  • ArgoCD 페이지에 접속하셔서, Settings 으로 들어갑니다.

  • 여기서 Clusters에는 이미 디폴트 클러스터가 존재합니다. (ArgoCD 가 설치된 클러스터) 외부 클러스터에 배포하실 경우 추가하시면 됩니다. 네트워크 설정이 필요하게 될 수도 있습니다.

  • Projects 에 들어가서 프로젝트를 추가합니다. 여러 서비스가 배포될 수 있으므로 애플리케이션 단위로 나누는게 좋습니다. 환경에 따라 명명규칙이 달라질 수도 있겠네요.
    • 상단의 +NEW PROJECT 버튼을 클릭합니다.
    • 프로젝트 이름과 설명을 적고 CREATE 버튼을 클릭합니다.

  • Repositories 에 들어가서 2번에서 생성한 config repo의 git 저장소와 연결해줍니다.

    • Project 는 앞서 만든 프로젝트를 선택합니다.

    • Config Repo의 URL과 Username, Personal Access Token을 입력합니다.

    • 성공적으로 연결되면 아래처럼 연결 상태가 Successful 이라고 뜹니다.


  • 다시 앞서 만든 Projects 로 들어가서 마저 셋팅을 해줍니다. 박스친 부분만 설정해주면 됩니다
    • SOURCE REPOSITOREIS : 위에서 연결한 config repo
    • DESTINATIONS : 배포할 쿠버네티스 클러스터

  • 환경 셋팅을 해주었으니 이제 제가 배포할 애플리케이션을 ArgoCD 에 등록해봅시다. Applications 메뉴로 들어가 +NEW APP 버튼을 클릭합니다.

    • 아래 설정 설명을 참고하여 알맞게 셋팅하고 CREATE 합니다.
  • 설정 설명

    • Application Name: 배포할 App의 명칭
    • Project: 해당하는 Project 선택 (vps, vps-bd)
    • Sync Policy: 동기화 설정
      • Manual: 직접 클릭하여 동기화
      • Auto: 자동 동기화 (옵션 미선택 시 OutOfSync일 경우에만 동기화)
        • PRUNE RESOURCES: 정의되지 않은 리소스 삭제
        • SELF HEAL: 자동 동기화 (default 5s)
    • Repository URL: ArgoCD가 바라볼 Git 저장소
    • Revision: 동기화될 Git의 revision (HEAD, master branch 등)
    • Path: 구성 환경 설정파일의 위치(GitOps Repository에서의 Path)
    • Cluster: 배포할 Target Cluster
    • Namespace: 배포할 Namespace
    • Directory Recurse: path 아래의 디렉토리를 모니터링하여 변경 사항을 반영

여기까지 하면 ArgoCD를 배포할 준비는 다되었습니다.



4. bitbucket pipeline 작성

  • 이제 health 라는 제 애플리케이션에 아래 파일을 루트경로에 추가하면 됩니다.

  • bitbucket-pipelines.yml

# Template docker-push

# This template allows you to build and push your docker image to a Docker Hub account.
# The workflow allows running tests, code linting and security scans on feature branches (as well as master).
# The docker image will be validated and pushed to the docker registry after the code is merged to master.

# Prerequisites: $DOCKERHUB_USERNAME, $DOCKERHUB_PASSWORD setup as deployment variables

image:
  name: <Base 이미지>
  aws:
    access-key: $AWS_ACCESS_KEY_ID # 레포지토리 변수
    secret-key: $AWS_SECRET_ACCESS_KEY # 레포지토리 변수

pipelines:
  branches:
    main:
      - step:
          name: Build docker image and push to AWS ECR
          services:
            - docker
          caches:
            - pip
            - docker
          script:
            - aws --version
            - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.ap-northeast-2.amazonaws.com # ECR 주소
            - IMAGE_NAME="<account-id>.dkr.ecr.ap-northeast-2.amazonaws.com/test" # ECR 레포지토리 URI
            - IMAGE_TAG=${BITBUCKET_COMMIT}  # 이미지 태그
            - echo ${IMAGE_TAG}
            - echo "export IMAGE_TAG=${IMAGE_TAG}" >> set_env.sh # 변수 저장
            - echo "export IMAGE_NAME=${IMAGE_NAME}" >> set_env.sh # 변수 저장
            - docker build --no-cache --tag "${IMAGE_NAME}:${IMAGE_TAG}" .
            - docker push ${IMAGE_NAME}:${IMAGE_TAG}
          artifacts: # 변수 다음 step 으로 넘기기위해 아티팩트로 저장
            - set_env.sh
      - step:
          name: Set Image Tag
          services:
            - docker
          script:
            - source set_env.sh
            - echo "${IMAGE_NAME}:${IMAGE_TAG}"
            - kustomize version
            - git clone --branch=main https://<username>:<Personal Access Token>@bitbucket.org/~~~~/config.git # argocd config-repo url
            - cd config/health/overlay/dev # argocd config-repo 경로
            - kustomize edit set image ${IMAGE_NAME}:${IMAGE_TAG}  # 태그 수정
            - git config user.name "bitbucket-pipelines"
            - git config user.email "commits-noreply@bitbucket.org"
            - git add -A
            - git commit -m 'Update kustomization.yaml'
            - git push -u origin main



여기서 끝이 아닌데요. 일단 저 Base 이미지가 뭔지 궁금하실 겁니다.
원래 기본으로 bitbucket에서 제공해주는 atlassian/default-image:4 를 사용했었는데 aws-cli 도 설치되어 있지 않고 kustomize도 파이프라인 돌릴때마다 설치하는게 번거로워서 아예 둘 다 설치된 이미지로 재빌드했습니다.
이미지는 제 ECR Private Repository에 올려놓았지만 알아서 빌드해서 쓰시면 됩니다.

  • Dockerfile
FROM atlassian/default-image:4

WORKDIR /usr/local/bin
RUN apt-get update \
    && apt-get install -y python3-pip \
    && pip3 install awscli \
    && curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash \
    && apt-get clean && rm -rf /var/lib/apt/lists* /tmp/* /var/tmp/*

이미지 설정하는 법은 공식페이지에 자세히 나와있습니다.
https://support.atlassian.com/bitbucket-cloud/docs/use-docker-images-as-build-environments/


이렇게 다 push 하고 나면 끝입니다...
차차 보완할 부분이 많지만 간단한 프로토타입 정도로 생각해주시면 감사하겠습니다.

profile
안녕하세요 :) 제 개인 공부 정리 블로그입니다. 틀린 내용 수정, 피드백 환영합니다.

0개의 댓글