
일단 초반에 생각한 구조는 이런 식의 아키텍처였는데, 일단 EKS 클러스터도 하나밖에 없고 프로토 단계여서 분기처리는 추후 하도록 하고 간단하게 아래와 같은 흐름으로 진행하였습니다.
(1) 개발자가 main 브랜치에 push하면 bitbucket pipeline 실행
(2) 도커 이미지 빌드하여 ECR Push
(3) ArgoCd config repo 의 Tag Set 변경 (kustomize 사용)
(4) EKS 배포
저는 레파지토리 이름을 manifest 라고 지었습니다.
프로젝트 구조는 아래와 같습니다

manifest (root)
이렇게 구성되있고, 기본적으로 kustomization.yaml 파일을 작성할줄 아셔야 합니다.
resources:
- deployment.yaml
- service.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>:<새로운 태그>


Repositories 에 들어가서 2번에서 생성한 config repo의 git 저장소와 연결해줍니다.
Project 는 앞서 만든 프로젝트를 선택합니다.
Config Repo의 URL과 Username, Personal Access Token을 입력합니다.

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

SOURCE REPOSITOREIS : 위에서 연결한 config repoDESTINATIONS : 배포할 쿠버네티스 클러스터
환경 셋팅을 해주었으니 이제 제가 배포할 애플리케이션을 ArgoCD 에 등록해봅시다. Applications 메뉴로 들어가 +NEW APP 버튼을 클릭합니다.

설정 설명
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 ClusterNamespace: 배포할 NamespaceDirectory Recurse: path 아래의 디렉토리를 모니터링하여 변경 사항을 반영여기까지 하면 ArgoCD를 배포할 준비는 다되었습니다.

# 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에 올려놓았지만 알아서 빌드해서 쓰시면 됩니다.
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 하고 나면 끝입니다...
차차 보완할 부분이 많지만 간단한 프로토타입 정도로 생각해주시면 감사하겠습니다.