ArgoCD Image Updater 를 활용한 Kubernetes 자동 배포

CI/CD 환경에서 컨테이너 이미지의 변경 사항을 자동으로 배포하는 것은 운영 효율성을 크게 향상시킬 수 있습니다. ArgoCD는 GitOps 방식의 배포를 지원하며, ArgoCD Image Updater는 컨테이너 이미지의 변경을 자동으로 감지하여 Git 리포지토리에 반영하고 ArgoCD가 이를 감지해 배포를 트리거할 수 있도록 합니다. 본 포스트에서는 Jenkins를 활용한 자동 이미지 빌드 이후, ArgoCD Image Updater를 통해 Kubernetes 클러스터에 자동 배포가 이루어지는 과정을 단계별로 설명합니다.

목차

1. 환경 구성
2. ArgoCD 구성
3. ArgoCD Image Updater 배포 및 구성
4. 결론

1. 환경 구성

  • kubernetes : v1.32.2
  • argocd : v3.0.5

2. ArgoCD 구성

ArgoCD가 설치되어있는 상태에서 진행해야합니다.

해당 포스트는 NGINX STORE k8s Jenkins 자동 이미지 빌드 구성 에서 이어지는 포스트입니다.

(NGINX STORE ArgoCD 배포 포스트)

Settings로 이동하여 Github Repository와 연동합니다.

Password는 k8s Jenkins 자동 이미지 빌드 구성에서 사용했던 Token을 적용합니다.

Application을 생성합니다.

Repository의 manifest path에는 Kubernetes의 Manifest가 존재해야합니다.

생성 전 ArgoCD Image Updater가 Deployment의 이미지 태그를 변경하기 때문에 kustomize 옵션의 구성과 github repository의 manifest가 필요합니다.

(kustomize : Kubernetes 리소스를 코드 수정 없이 재사용하고 오버레이할 수 있도록 해주는 도구입니다. 해당 예제에서는 Image의 태그를 변경하는데 사용됩니다.)

resource란에 Deployment의 Manifest 이름을 작성합니다.

Directory을 클릭하여 Kustomize로 변경합니다.

application를 생성합니다.

3. ArgoCD Image Updater 배포 및 구성

ArgoCD Image Updater는 컨테이너 이미지의 새 버전을 확인하고 ArgoCD를 사용하여 최신 버전으로 자동으로 업데이트합니다.

ArgoCD Image Updater를 배포합니다.

ArgoCD Image Updater는 ArgoCD가 배포된 Namespace에 배포해야합니다.
ArgoCD와 배포된 Namespace가 아닌 다른 Namespace에 배포 할 경우 Service Account에 Namespace 권한을 추가하여야합니다.

kubectl apply -n [namespace] -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml

배포가 완료되면 아래와 같은 리소스가 배포됩니다.

argocd-image-updater-597678bbf9-5bhxr 1/1 Running 0 6d

ArgoCD Image Updater를 배포하게 되면 argocd-image-updater-config Configmap이 배포되게 됩니다.

Configmap을 수정하여 Docker hub registry를 등록합니다.

apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-image-updater-config
data:
log.level: debug
registries.conf: |
registries:
- name: Docker Hub
prefix: docker.io
api_url: https://registry-1.docker.io
defaultns: library
default: true
# credentials: "pullsecret:cicd/dockerconfig" # private Repository의 경우 credentials를 추가로 넣습니다.

위의 구성을 Apply 및 ArgoCD image Updater를 재배포합니다.

구성을 완료 한 후 ArgoCD Image Updater에서 ArgoCD의 Application을 인식할 수 있도록 Annotaion을 추가합니다.

argocd-image-updater.argoproj.io/image-list: pythonapp=registry-1.docker.io/asdfkco/jenkinstest:latest
# ArgoCD Image Updater가 감시할 이미지 목록을 정의합니다.
argocd-image-updater.argoproj.io/jenkinstest.version.constraint: '".*"'
# 모든 태그를 허용하는 정규식 제약 조건입니다.
argocd-image-updater.argoproj.io/pythonapp.update-strategy: digest
# 이미지 태그가 동일하더라도 Digest(SHA256)가 바뀌면 Git에 패치합니다.
argocd-image-updater.argoproj.io/write-back-method: git
# 업데이트 결과를 Kubernetes 리소스가 아닌 Git에 커밋하여 ArgoCD가 감지하고 자동 배포하게 합니다.

ArgoCD의 DETAIL에서 수정하여 Annotaions를 추가합니다.

이후 Github Repository의 내용을 수정하여 Jenkins를 이용하여 이미지를 빌드합니다.

이미지를 빌드하게 되면 아래와 같은 yaml이 추가되게 됩니다.

해당 yaml은 ArgoCD Image updater가 kustomize를 수정하고 이미지 태그를 수정하여 Repository에 Push된 것을 확인할 수 있습니다.

ArgoCD는 해당 변경사항을 감지하여 /manifest/ 폴더의 리소스들을 업데이트합니다.

이미지가 업데이트 된 것을 확인할 수 있습니다.

4. 결론

ArgoCD Image Updater를 통해 이미지가 변경될 때마다 Git 저장소에 자동으로 업데이트되며, ArgoCD는 이를 감지하여 Kubernetes 클러스터에 새로운 버전의 이미지를 자동으로 배포합니다. 이 과정은 수동 배포 과정을 줄이고, 지속적인 배포(Continuous Delivery)를 실현하는 데 매우 효과적입니다. Jenkins, ArgoCD, Image Updater를 연동함으로써 이미지 빌드부터 배포까지 완전 자동화된 파이프라인을 구성할 수 있으며, 운영 안정성과 생산성 모두를 향상시킬 수 있습니다.

Kubernetes 환경에서의 CI/CD 에 관련된 더 많은 정보를 알고싶으시다면 NGINX STORE CI/CD 카테고리를 방문해주세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required