FrameWorks/Kubernetes

[Kubernetes] ArgoCD 사용해보기 (2) - ArgoCD Image Updater를 이용한 자동 배포

ABCD 2025. 3. 16.

Argo CD Image Updater 사용 이유

우리는 Jenkins Pipeline을 이용해서 빌드부터 자동 배포까지 동작하는 과정을 지난 게시글(CI/CD관련 게시글)에서 확인해 봤는데요.

Argo CD소스를 빌드하고 배포까지 한번에 하기가 상당히 까다롭습니다.


소스를 빌드하고, 컨테이너를 빌드해서 이미지를 Docker Hub에 올리고 .yaml파일을 수정하는 과정으로 자동배포까지 만들 수는 있지만 코드가 번잡해지죠.

 

이것을 해결하기 위해 Image Updater를 사용하게 됩니다.

 

Image UpdaterDocker Hub를 모니터링하고 있어, 변경감지가 발생하면 ArgoCD로 배포명령을 내리고 태그 규칙을 추가해 자동배포를 진행하게 됩니다.

 

아래 이미지를 보고 한번 이해해 보시기 바랍니다.

[스크린샷 2025-03-15 오후 11.47.09.png]

Argo CD Image Updater 설치

Jenkins에 접속해 이전에 만들어 놓은 Dashboard > add-on > deploy-argo > 파라미터와 함께 빌드 여기로 이동해 아래와 같이 설정하고 배포를 시작합니다.

DEPLOY_TYPE : helm_upgrade
TARGET_ARGO : argocd-image-updater

동작 확인

Kubernetes 대쉬보드에 들어가서 Pod가 정상 동작하는지 확인해 봅시다.

 

 

2분 간격으로 체크 중인지를 확인해보면 됩니다.

 

time="2025-03-15T15:45:26Z" level=info msg="Processing results: applications=1 images_considered=0 images_skipped=1 images_updated=0 errors=0"

time="2025-03-15T15:47:26Z" level=info msg="Starting image update cycle, considering 1 annotated application(s) for update"

time="2025-03-15T15:47:26Z" level=info msg="Processing results: applications=1 images_considered=0 images_skipped=1 images_updated=0 errors=0"

time="2025-03-15T15:49:26Z" level=info msg="Starting image update cycle, considering 1 annotated application(s) for update"

time="2025-03-15T15:49:26Z" level=info msg="Processing results: applications=1 images_considered=0 images_skipped=1 images_updated=0 errors=0"

time="2025-03-15T15:51:26Z" level=info msg="Starting image update cycle, considering 1 annotated application(s) for update"

time="2025-03-15T15:51:26Z" level=info msg="Processing results: applications=1 images_considered=0 images_skipped=1 images_updated=0 errors=0"

자동 배포 설정

설정 방법

Application > api-tester-2232 > DETAILS

해당 화면으로 들어가서 Annotations내용에 아래 내용을 입력합니다.

 

update-strategy
semver : 주어진 이미지 제약 조건에 따라 허용되는 가장 높은 버전으로 업데이트
latest : 가장 최근에 생성된 이미지 태그로 업데이트
name : 알파벳순으로 정렬된 목록의 마지막 태그로 업데이트
digest : 변경 가능한 태그의 최신 푸시 버전으로 업데이트

 

# 도커 허브에서 이미지 대상 지정
# argocd-image-updater.argoproj.io/image-list=<alias>=<Docker Username>/<Image Name>
argocd-image-updater.argoproj.io/image-list=1pro-api-tester=1pro/api-tester

# 업데이트 전략 선택
# argocd-image-updater.argoproj.io/<alias>.update-strategy=name
argocd-image-updater.argoproj.io/1pro-api-tester.update-strategy=name
# 태그 정규식 설정 (1.1.1-231220.175735) 

argocd-image-updater.argoproj.io/1pro-api-tester.allow-tags=regexp:^1.1.1-[0-9]{6}.[0-9]{6}$

[스크린샷 2025-03-16 오전 1.28.56.png]

SYNC POLICY 설정

ENABLE AUTO-SYNC를 클릭해서 아래 상태로 만들어 줍니다.

 

  • PRUNE RESOURCES
    • Git에서 리소스 삭제시 실제 Kubernetes에서도 자원이 삭제
  • SELF HEAL
    • Auto Sync 상태에서 항상 Git에 있는 내용이 적용됨 (이때 ArgoCD나 Kuberentes에서 직접 수정한 내용은 삭제됨)

[스크린샷 2025-03-16 오전 1.32.04.png]

Docker Build Job 생성

새보기 및 item 생성

Jenkins에서 Docker Image를 만들 수 있게 작업해 봅시다.

우선 새보기를 만들어 볼까요??

 

조회명 : 223
Type : List View

 

이젠 아이템을 생성해 봅시다.

 

Enter an item name : 2232-build-docker-for-image-updater
Pipeline을 선택하고 OK버튼 클릭해서 만들어 줍시다.

 

이번에는 일프로님 repo가 아닌 본인의 repo를 사용하시는게 좋습니다.

 

그래야 내가 만들 Docker Hub에 이미지가 올라가는걸 확인할 수 있고 그걸 바탕으로 감지하여 빌드가 완료되는 것을 확인 할 수 있으니까요.

 

Project url : ${본인 github repo}

# 예시
Project url : https://github.com/k8s-1pro/kubernetes-anotherclass-sprint2/
Definition : Pipeline script from SCM
Definition > SCM : Git

# 본인 repository url을 사용하세요. 밑에는 예시입니다.
Definition > SCM > Repositories > Repository URL : https://github.com/k8s-1pro/kubernetes-anotherclass-sprint2.git

Definition > SCM > Branches to build > Branch Specifier : */main
Definition > SCM > Branches to build > Additional Behaviours > Sparse Checkout paths > Path : 2232
Definition > Script Path : 2232/Jenkinsfile

자동 업데이트 실행해보기

빌드

방금 만든 것을 실행시켜 빌드하여 Image를 푸쉬하게 합니다.

자동 업데이트 확인

Argo CD Image Updater가 0~2분 이내에 Docker Hub에 이미지가 변경된 것을 감지하여 Pod를 생성하게 될 겁니다.

 

[스크린샷 2025-03-16 오전 1.44.12.png]

 

Pod이 올라갔다면 아래와 같이 Pod이 제거 되고 ReplicaSet만 남게 되는 것을 확인 할 수 있습니다.

 

[스크린샷 2025-03-16 오전 1.47.04.png]

마무리

작업 후에 다음 실습을 위해 기존 namespace는 삭제하도록 하겠습니다.

 

[스크린샷 2025-03-16 오전 1.49.15.png][스크린샷 2025-03-16 오전 1.49.50.png]


🚀TrubleShooing

싱크가 제대로 안될 경우 해결방법

  • detail에서 annotations 작성시 image path를 잘 적었는지 확인
    (1pro/api-tester -> ${docker username}/api-tester
  • repo URL 본인 것인지 확인
  • PATH 경로 잘 작성했는지 확인(저처럼 fork를 하지않고 특정 레포에 넣으신분들...)

image pull이 안되는 경우 해결방법

  • Jenkinsfile을 뒤져서 DOCKERHUB_USERNAME 및 GITHUB_URL변경했는지 확인
  • 2232/deploy/helm/api-tester 폴더에 들어가 values.yaml과 values-xx.yaml파일들의 images가 1pro-/api-tester가 아닌 ${docker username}/api-tester인지 확인
  • Docker Hub에 접속해 v1.0.0으로 태그가 달려있으면 삭제 후 212 List View의 container-build했던 부분의 Jenkinsfile에서 image생성시 사용한 태그가 v1.0.0인지 확인해보고 GitHub에 들어가 v를 삭제한 1.0.0으로 커밋한 후에 컨테이너 빌드를 다시 시작(이 때 CI/CD서버에 docker에 로그인이 되어 있어야합니다.)

 

이 글은 인프런의 일프로님 강의를 기반으로 작성되었습니다.
728x90
반응형

댓글

💲 추천 글