* 본 게시물은 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2 강의와 강의 자료를 바탕으로 작성되었습니다.
Argo CD Image Updater를 이용한 이미지 자동 배포

배포를 해야 하는 상황
1. YAML 리소스 스펙 변경
2. App 버전 업그레이드
- YAML 리소스 스펙 변경 (Release 전용 Repo에서 발생하는 변경)
- Jenkins만 사용할 경우, 리소스가 변경되고 Jenkins Job을 통해 배포
- Argo CD를 사용할 경우, Argo CD에서 Git Repo를 주기적으로 가져와 변경이 되면 자동으로 배포
- App 버전 업그레이드 (Project 소스 전용 Repo에서 발생하는 변경)
- Jenkins만 사용할 경우, Jenkins Job을 통해 실행 파일을 Build하고, Container Image로 Build하여 Docker Hub에 업로드
-> 하지만, Docker Hub에 새로운 태그 업로드로 인해 Release Repo에서 YAML 파일에 Tag가 수정이 되어야 원하는 버전 배포가 이루어짐 (Helm이나, Kustomize를 사용하면 추가 옵션을 주는 것으로 해결 가능) - Argo CD를 사용할 경우, Docker Hub에 업로드하는 과정까지는 같으나, YAML 파일이 수정이 되어야 Argo CD가 이를 감지하여 자동으로 배포를 해줌 (때문에, Jenkins에서 YAML을 수정해주는 Pipeline을 만들기도 함)
- Image Updater의 경우, Image Updater는 Argo CD와 Docker Hub를 연결하여 Docker Hub에서 Image의 변경이 감지되면 Argo CD에 정의해둔 조건에 맞으면 배포 명령을 내리는 것으로 자동화
(Helm, Kustomize 배포만 사용 가능 -> 오버레이 방식을 이용하여 배포를 진행하기 때문)
- Jenkins만 사용할 경우, Jenkins Job을 통해 실행 파일을 Build하고, Container Image로 Build하여 Docker Hub에 업로드
Image Updater 적용 & 자동 배포
자동 배포를 위해서 먼저, Image Updater를 Pod로 띄우고 Docker Hub와 Argo CD를 연결해야 한다.
Image Updater와 Docker Hub 연결
(이전 강의에서 Artifact Hub에서 Image Updater(Package)를 다운로드 받아 Github로 올렸기 때문에 과정 생략)
- argocd의 주소(Cluster 내부라 name을 이용한 통신)와 사용할 Registry를 정의
config:
argocd:
serverAddress: "https://argo-cd-argocd-server"
registries:
- name: Docker Hub
api_url: https://registry-1.docker.io
#credentials: env:DOCKER_HUB_CREDS=username:passowrd
- Image Updater 설치 시, Docker Credentials를 Job 단계에 주입하는 것으로 log 어디에도 남기지 않음
HELM_DEPLOY_COMMAND = "helm upgrade ${params.TARGET_ARGO} ./${INSTALL_PATH}/helm/${params.TARGET_ARGO} " +
" -f ./${INSTALL_PATH}/helm/${params.TARGET_ARGO}/values-dev.yaml" + " -n argo --install --kubeconfig " + '${KUBECONFIG}' +
" --wait --timeout=10m "
// image-updater일 경우 도커허브 credentials 주입
if (params.TARGET_ARGO == "argocd-image-updater") {
withCredentials([usernamePassword(credentialsId: 'docker_password', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
HELM_DEPLOY_COMMAND += " --set config.registries[0].credentials=env:DOCKER_HUB_CREDS="+ '${USERNAME}' + ":" + '${PASSWORD}'
}
}
sh "eval ${HELM_DEPLOY_COMMAND}"
Jenkins Job을 통하여 helm upgrade 명령으로 Image Updater(Pod)를 올리는데 성공하면, log를 확인했을 때 2분 간격으로 Image 변경 여부를 확인하는 것을 알 수 있음

Image Updater와 Argo CD 연결
[Applications > api-tester-2232 > DETAILS > SUMMARY > EDIT]
- ANNOTATIONS (여기에 해당하는 이미지가 변경되면, 배포를 진행)
// 도커 허브에서 이미지 대상 지정
argocd-image-updater.argoproj.io/image-list=<alias>=<Dockerhub-Username>/api-tester
// ex) argocd-image-updater.argoproj.io/image-list=1pro-api-tester=1pro/api-tester
// 업데이트 전략 선택
argocd-image-updater.argoproj.io/<alias>.update-strategy=name
// ex) argocd-image-updater.argoproj.io/1pro-api-tester.update-strategy=name
// 태그 정규식 설정 (1.1.1-231220.175735)
argocd-image-updater.argoproj.io/<alias>.allow-tags=regexp:^1.1.1-[0-9]{6}.[0-9]{6}$
// ex) argocd-image-updater.argoproj.io/1pro-api-tester.allow-tags=regexp:^1.1.1-[0-9]{6}.[0-9]{6}$
▶ update-strategy
semver : 주어진 이미지 제약 조건에 따라 허용되는 가장 높은 버전으로 업데이트
latest : 가장 최근에 생성된 이미지 태그로 업데이트
name : 알파벳순으로 정렬된 목록의 마지막 태그로 업데이트
digest : 변경 가능한 태그의 최신 푸시 버전으로 업데이트
- SYNC POLICY

PRUNE RESOURCES: Git에서 리소스 삭제 시, k8s에서도 자원이 삭제됨
SELF HEAL: 항상 Git의 내용이 반영됨 -> k8s에서 내용이 수정되더라도, 다시 Git의 내용으로 되돌아감
자동 배포 확인
- Jenkins에서 Container Image 파일을 만들어 Docker Hub에 업로드

- Image Updater에서 2분 간격으로 변화를 감지

- Argo CD에서 새로운 Pod가 생성되는 것을 확인

[미션 6]
1. Argo CD로 App 생성 및 배포 - 2232-build-push-git
1-1. App 생성하기 - [+ New App] 클릭
▶ GENERAL
Application Name: api-tester-2232-build-push-git
Project Name: default
SYNC POLICY: Manual
▶ SOURCE
Repository URL: https://github.com/ONE0x393/kubernetes-anotherclass-sprint2.git
Revision: main
Path: 2232-build-push-git/deploy/helm/api-tester
▶ DESTINATION
Cluster URL: https://kubernetes.default.svc
Namespace: anotherclass-223
▶ HELM 확인 후 Values files 지정
VALUES FILES: values-dev.yaml
▶ 화면 상단 [CREATE] 클릭
1-2. 자동 배포 설정 - api-tester-2232-build-push-git > details > SYNC POLICY

1-3. 자동 배포 확인 - ArgoCD 상태 및 Dashboard Pod 생성 유무


2. Jenkins에 Github Token 등록
2-1. Github에서 Credential 확인
▶ GitHub → Settings
▶ Developer settings : 왼쪽 메뉴 가장 하단에 위치
▶ Personal access tokens (classic) 선택 후 [Generate new token]
▶ 권한 설정
Note: Update for Jenkins
Expiration: No expiration
Select scopes: repo [체크]

2-2. Jenkins에 Credential 등록
▶ Dashboard > Jenkins 관리 > Credentials > System > Global credentials (unrestricted) 에서 [Add Credentials] 클릭 후 아래 내용 입력

2-3. Jekinsfile 에서 Credential 사용 확인
▶ 2232-build-push-git > Jenkinsfile
def valuesFile = "./${CLASS_NUM}/deploy/helm/api-tester/values-${params.PROFILE}.yaml"
// image 수정
sh """
sed -i 's|^ repository:.*| repository: ${DOCKERHUB_USERNAME}/api-tester|' ${valuesFile}
sed -i 's|^ tag:.*| tag: "${TAG}"|' ${valuesFile}
"""
// github로 업데이트
withCredentials([usernamePassword(credentialsId: 'github_token', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
sh """
git config user.email "${GITHUB_USERNAME}@email.com"
git config user.name "${GITHUB_USERNAME}"
git remote set-url origin https://${USERNAME}:${PASSWORD}@github.com/${GITHUB_USERNAME}/kubernetes-anotherclass-sprint2.git
git add ${valuesFile}
git commit -m "Update ${valuesFile} with new image tag: ${TAG}"
git push origin HEAD:main
"""
}
3. Jeknins에서 Source/Container 빌드 후 Docker로 업로드 하기
3-1. 새보기 및 item 생성
[새보기] 만들기
조회명 : 223
Type : List View
[item name] 만들기
Enter an item name : 2232-build-push-git
[Pipeline] 선택
[OK] 버튼 클릭
3-2. Configure
▶ Configure > General > GitHub project > Project url
Project url: https://github.com/ONE0x393/kubernetes-anotherclass-sprint2/
▶ Configure > Advanced Project Options > Pipeline > [저장]
Definition : Pipeline script from SCM
Definition > SCM : Git
Definition > SCM > Repositories > Repository URL : https://github.com/ONE0x393/kubernetes-anotherclass-sprint2.git
Definition > SCM > Branches to build > Branch Specifier : */main
Definition > SCM > Branches to build > Additional Behaviours > Sparse Checkout paths > Path : 2232-build-push-git
Definition > Script Path : 2232-build-push-git/Jenkinsfile
3-3. [저장] 후 [지금 빌드] 실행

3-4. [파라미터와 함께 빌드] 선택 후 본인의 DockerHub와 Github의 Username 입력 후 [빌드] 실행

3-5. Stage View 결과 확인

3-6. ArgoCD에서 자동 배포 확인


3-7. 다시 빌드 후 재확인


'Tech > Kubernetes(K8s)' 카테고리의 다른 글
| [쿠버네티스 어나더 클래스 (지상편) - Sprint 2] 15. ArgoCD 빠르게 레벨업-3 (0) | 2025.06.19 |
|---|---|
| [쿠버네티스 어나더 클래스 (지상편) - Sprint 2] 15. ArgoCD 빠르게 레벨업-1 (0) | 2025.06.17 |
| [쿠버네티스 어나더 클래스 (지상편) - Sprint 2] 14. Helm과 Kustomize 비교하며 사용-2 (0) | 2025.06.16 |
| [쿠버네티스 어나더 클래스 (지상편) - Sprint 2] 13. Helm과 Kustomize 비교하며 사용-1 (0) | 2025.06.14 |
| [쿠버네티스 어나더 클래스 (지상편) - Sprint 2] 12. Jenkins Pipeline (기초부터 Blue/Green까지 (0) | 2025.06.12 |
잘못된 정보가 있다면 말씀해주세요!