문제 상황 📌
CI 과정에서 Git commit Hash로 Docker image tag를 설정해서 DockerHub에 Push 하였다.
근데, ArgoCD는 Git만 바라보므로, Image 태그가 변경되었다는 Manifest를 변경해주어야 ArgoCD가 배포를 다시 해준다.
CI 과정에서 다른 Repo에 있는 Manifest를 직접 수정하는게 좋은 방법은 아닌 것 같다고 생각해서
ArgoCD에서 제공하는 ArgoCD Image Updater를 사용하기로 했다!
ArgoCD Image Updater란? 📌
https://argocd-image-updater.readthedocs.io/en/stable/
Docker Hub 또는 다른 이미지 레지스트리에서 새로운 이미지가 발견될 때 Manifest를 자동으로 업데이트해준다!!
❗️제한 사항 ❗️
Argo CD에서 관리되는
Kustomize나 Helm 기반 애플리케이션만 Argo CD Image Updater로 컨테이너 이미지 업데이트 가능
- Helm의 경우 image.tag와 같은 매개변수를 지원해야 한다.
ArgoCD는 개발중이므로 비핵심 환경에서 사용하는 것을 권장
개발 진행에 따라 릴리스마다 (아마도 많은) 호환성 문제가 발생할 수도
처리 흐름
- CI 과정에서 커밋 해시를 태그로 가지고 있는 이미지 빌드 후 DockerHub에 푸시
- ArgoCD image updater가 docker hub에서 변경된거 확인
- GitHub에 있는 kustomization.yaml파일 변경
- AutoSync가 된 ArgoCD가 manifest 변경된것 감지 후, 자동 배포
구현 📌
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml
## argocd/fe-application.yaml
...
metadata:
annotations:
argocd-image-updater.argoproj.io/write-back-method: git
argocd-image-updater.argoproj.io/write-back-target: kustomization
argocd-image-updater.argoproj.io/image-list: fe_image=hyeushim/dododocs-fe
argocd-image-updater.argoproj.io/fe_image.update-strategy: newest-build
argocd-image-updater.argoproj.io/fe_image.tag-pattern: "^[a-f0-9]{7}$"
...
- Update Methods
- https://argocd-image-updater.readthedocs.io/en/stable/basics/update-methods/
- Argo CD 리소스 패치 방식(Update via Argo CD API)
- Image Updater가 Argo CD API를 통해 Application 리소스를 직접 패치하여 이미지 태그를 변경
- Git 방식(write-back to Git)
- 새로운 이미지 태그를 감지하면 Image Updater가 Git 리포지토리의 매니페스트 파일을 직접 수정하고 커밋/푸시 → GitOps 흐름 유지
- write-back-target : 이미지 태그 변경 사항을 어떤 형태(Helm 또는 Kustomize)로 관리되는 매니페스트에 반영할지를 지정
- Update Strategy
- https://argocd-image-updater.readthedocs.io/en/stable/basics/update-strategies/
- digest:
- 이미지 다이제스트(digest, SHA256 해시) 기반으로 업데이트하는 전략
- 예: 이미지 태그보다는 immutable한 다이제스트를 기준으로 업데이트를 관리하고 싶을 때
- semver:
- Semver(유의적 버전) 규칙에 따라 가장 높은 버전 번호를 가진 태그를 선택
- 예: v1.0.0, v1.2.0, v1.2.1 등이 있을 경우 v1.2.1이 가장 최신으로 간주.
- newest-build (이전명: latest):
- 빌드/푸시 시간이 가장 최근인 이미지를 선택
- name, date, or custom:
- 특정 패턴(이름 규칙, 날짜 태그, 커스텀 정렬 함수 등)을 이용해 원하는 태그를 선택
- 예: argocd-image-updater.argoproj.io/myimage.tag-match: "^release-(?P<version>.*)$"와 같이 정규식을 사용하거나, allow-tags, deny-tags 설정을 통해 허용되는 태그 패턴을 제한 가능
** Image Updater가 linux/amd64 플랫폼용 이미지를 요청
설정 및 인증
# argocd-image-updater-config.yaml
apiVersion: v1
kind: ConfigMap
...
data:
git_providers: |
- name: github
api: "https://api.github.com"
tokenRef:
key: password
name: repo-creds
registries: |
- name: Docker Hub
prefix: docker.io
api_url: https://registry-1.docker.io
prefix: docker.io
credentials: {}
# repo-creds.yaml
apiVersion: v1
kind: Secret
...
data:
password: # GitHub Personal Access Token
username: # GitHub User name
- Git repo에 접근 자격 증명 설정
- GitHub에서 PAT 생성 - scope: repo, org_write, read
- ArgoCD에 Git 리포지토리 자격 증명 등록
# ArgoCD 서버 로그인
argocd login <ARGOCD_SERVER> --username <ARGOCD_USERNAME> --password <ARGOCD_PASSWORD>
# Git 리포지토리 등록
argocd repo add https://github.com/DoDoDocs/dododocs-cloud.git \
--username ******* \
--password ghp_**********************
결과물 📌
⇒ Pulled 된 것 확인!!
time="2024-12-10T08:03:00Z" level=info msg="Successfully updated the live application spec" application=ai
time="2024-12-10T08:03:00Z" level=info msg="Processing results: applications=3 images_considered=3 images_skipped=0 images_updated=2 errors=0"
⇒ GitHub에 Update 된것 확인!!
'DevOps' 카테고리의 다른 글
[자동화] n8n이란? (0) | 2025.02.25 |
---|---|
[ArgoCD][트러블 슈팅] ArgoCD path 설정 (0) | 2024.12.05 |
[CI/CD] Github Actions와 ArgoCD를 활용한 CI/CD (0) | 2024.11.05 |
[Kafka] Docker로 Kafka 구축 (0) | 2024.08.19 |
[Kafka] Kafka란? (0) | 2024.08.19 |