배포를 새로 해야하는 상황은 다음과 같다.
- 리소스 스펙 변경
- App 버전 업그레이드
1번은 담당자가 수작업으로 변경해 yaml이나 helm의 values 파일에서의 항목을 수정해주어야 한다.
하지만 2번은 컨테이너 이미지 변경, 즉 이미지의 tag를 변경하는 사항인데 이를 ArgoCD Image Updater를 이용하여 자동화할 수 있다. 특히 개발서버에서 App의 기능사항을 지속적으로 개발 업데이트하며 변경사항을 확인하는 경우가 잦아지는데, 이 때 직접 배포파일을 수정하지 않고 자동으로 업데이트 되기 때문에 굉장히 편리하고 유용하다.
배포 방식에 대한 차이점
Image Updater의 유용성을 알기 위해 App 컨테이너 이미지 업데이트 시 각 배포 방식에 따른 차이점을 알아보도록 하자.
Jenkins 배포
- 소스 빌드를 통해 jar파일 생성
- 컨테이너를 빌드하고 Docker Hub에 업로드
- 배포 yaml 파일에서 container image tag 수정. 다만 helm 사용 시 --set image.tag=1.0.0 과 같이 yaml 파일을 수정하지 않고 배포할 수 있다.
ArgoCD 배포
- 소스 빌드
- 컨테이너 빌드
- jenkins에서 yaml파일을 수정하여 git에 업데이트 해주는 script가 필요하다. 하지만 이러한 로직을 추가하는것이 번거롭고 복잡한 과정이 추가되는 것.
따라서 argoCD 사용시 jenkins에 비해 리소스 스펙 변경 시에는 단계가 줄어들지만, App 버전 업그레이드 시에는 불편해진 셈이다. 이러한 문제를 해결하기 위해 Image Updater를 사용한다.
ArgoCD에 Image Updater를 추가하여 배포
- 소스 빌드
- 컨테이너 빌드
- Image Updater가 Docker Hub를 주시하다가 이미지 업데이트를 감지하면 배포.
다만 이러한 이미지 자동 배포는 ArgoCD 배포 방식에서 Helm이나 kustomize 방식으로 배포시에만 가능하다.
그 이유는 위에서 언급한 --set image.tag=1.0.0 명령어를 사용하여 배포하기 때문이다.
ArgoCD Application에 Image Updater 연결하기
Image Updater 설치
Image Updater 설치는 ArgoCD가 미리 설치되어 있다는 가정을 하고 진행한다. 자세한 과정은 이전 포스팅 참고.
Image Updater 차트에 values-dev.yaml를 생성하고 아래 내용을 추가한다.
ArgoCD의 쿠버네티스 endpoint와 Docker Hub 접근을 위한 계정정보를 추가한다.
만약 Jenkins에서 Docker Hub Credential을 사용한다면 values 파일에는 추가하지 않아도 된다.
# values-dev.yaml
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
이후 아래 명령어로 배포를 수행한다. 각자 자신의 환경에 맞게 경로를 수정하여 배포하면 된다.
ArgoCD 설치와 마찬가지로 jenkins 관련하여 kubeconfig나 dockerhub credential은 제외한 명령어를 날려도 좋다.
helm upgrade argocd-image-updater ./argo/helm/argocd-image-updater
-f ./argo/helm/argocd-image-updater/values-dev.yaml
-n argo --install --kubeconfig ${KUBECONFIG}
--wait --timeout=10m
--set config.registries[0].credentials=env:DOCKER_HUB_CREDS=${USERNAME}:${PASSWORD}
helm 배포가 완료되면, image updater가 정상 작동하는지 파드 로그를 출력해보자.
정상 작동 시 아래와 같이 image updater가 docker hub를 주시하며 반복적인 로그를 출력한다.
k logs -n argo argocd-image-updater-66f967bf6c-q89kr --tail 5
# 정상기동 시 로그 내용
time="2024-10-14T06:49:21Z" level=info msg="Processing results: applications=0 images_considered=0 images_skipped=0 images_updated=0 errors=0"
time="2024-10-14T06:51:21Z" level=info msg="Starting image update cycle, considering 0 annotated application(s) for update"
time="2024-10-14T06:51:21Z" level=info msg="Processing results: applications=0 images_considered=0 images_skipped=0 images_updated=0 errors=0"
time="2024-10-14T06:53:21Z" level=info msg="Starting image update cycle, considering 0 annotated application(s) for update"
time="2024-10-14T06:53:21Z" level=info msg="Processing results: applications=0 images_considered=0 images_skipped=0 images_updated=0 errors=0"
Annotation 추가
현재 App의 버전 업데이트를 자동화하기 위해서는 도커 컨테이너 이미지의 tag 기준으로 수행하게 된다.
이 때 어떤 이미지를 업데이트 하는지 ArgoCD에 지정하기 위해 application 설정에서 annotation을 추가한다.
ArgoCD Applications -> App 선택 -> 왼쪽 상단 DETAILS -> Edit -> Annotations 추가
annotation에 추가할 항목은 다음과 같다. 도커 허브 이미지 대상, 업데이트 전략, 태그 정규식.
// 도커 허브에서 이미지 대상 지정
// 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}$
먼저 이미지 대상의 alias에 실제 도커 허브 repository 이름과 이미지 이름을 지정한다.
이후 alias 기준으로 annotation을 작성하며 업데이트 전략과 태그 정규식을 작성하면 된다.
태그 정규식은 일반적인 regex 문법을 따르며 업데이트 전략은 다음과 같은 옵션이 존재한다.
- semver: 주어진 이미지 제약 조건에 따라 허용되는 가장 높은 버전으로 업데이트
- latest: 가장 최근에 생성된 이미지 태그로 업데이트
- name: 알파벳순으로 정렬된 목록의 마지막 태그로 업데이트
- digest: 변경 가능한 태그의 최신 push 버전으로 업데이트
현재 regex는 1.1.1이라는 버전 뒤에 datetime을 붙여 업로드 한다는 가정을 하고 있다.
따라서 name으로 정렬하면 시간순으로 정렬되어 가장 최근에 업로드된 태그로 배포된다.
또한 이미지가 업데이트 될 때마다 자동으로 배포가 되도록 아래에서 [ENABLE AUTO-SYNC] 버튼을 눌러 아래와 같이 바꿔준다.
Prune Resources: Git에서 리소스가 삭제시 Kubernetes에서도 자원이 삭제됨.
Self Heal: Auto Sync 상태에서 항상 Git에 있는 내용이 적용된다. (이 때 ArgoCD나 Kubernetes에서 직접 수정한 내용이 삭제됨)
여기까지의 변경사항을 적용하고 새로운 docker image를 push하게 되면 image updater가 업데이트된 이미지를 확인하게 된다.
k logs -n argo argocd-image-updater-66f967bf6c-q89kr --tail 6
# 이미지 감지 로그
msg="Starting image update cycle, considering 1 annotated application(s) for update"
msg="Setting new image to taehokang/api-tester:1.1.1-241014.141715" alias=1pro-api-tester application=api-tester-2232 image_name=taehokang/api-tester image_tag=1.0.0 registry=
msg="Successfully updated image 'taehokang/api-tester:1.0.0' to 'taehokang/api-tester:1.1.1-241014.141715', but pending spec update (dry run=false)" alias=1pro-api-tester application=api-tester-2232 image_name=taehokang/api-tester image_tag=1.0.0 registry=
msg="Committing 1 parameter update(s) for application api-tester-2232" application=api-tester-2232
msg="Successfully updated the live application spec" application=api-tester-2232
msg="Processing results: applications=1 images_considered=1 images_skipped=0 images_updated=1 errors=0"
ArgoCD 대시보드를 확인하면 새로운 revision이 생성되며 업데이가 수행되는 것을 확인할 수 있다.
'DevOps' 카테고리의 다른 글
Ubuntu 서버에 Nexus Repository 구축하기 (1) | 2025.01.30 |
---|---|
[ArgoCD] Argo Rollouts를 이용한 고급 배포 전략 (4) | 2024.10.20 |
[ArgoCD] ArgoCD로 쿠버네티스 클러스터에 App 배포하기 (4) | 2024.10.18 |
[ArgoCD] ArgoCD 아키텍처에 대한 이해 (0) | 2024.10.17 |
[Helm] Helm 패키지 생성하고 배포하기 (2) | 2024.10.07 |