Kubernetes 이야기

argo CD Image Updater 본문

Kubernetes/devops

argo CD Image Updater

kmaster 2022. 5. 20. 12:43
반응형

 

Argo CD Image updater는 ArgoCD 에서 관리하는 Kubernetes 워크로드의 컨테이너 이미지를 자동으로 업데이트하는 도구이다. 간단히 말해서 Argo CD 애플리케이션 리소스의 주석으로 지정된 이미지 버전을 추적하고 Argo CD API를 사용하여 매개변수 재정의를 설정하여 업데이트한다.

 

Application사용법은 간단한다. 각 이미지에 대해 허용되는 최대 새 버전을 제한하는 버전 제약 조건과 함께 업데이트를 고려할 이미지 목록으로 Argo CD 리소스에 주석을 추가한다 . 그런 다음 Argo CD Image Updater는 Argo CD에서 구성된 애플리케이션을 정기적으로 폴링하고 가능한 새 버전에 대해 해당 컨테이너 레지스트리를 쿼리한다. 새 버전의 이미지가 레지스트리에서 발견되고 버전 제약 조건이 충족되면 Argo CD Image Updater는 Argo CD에 새 이미지로 응용 프로그램을 업데이트하도록 지시한다.

애플리케이션에 대한 자동 동기화 정책에 따라 Argo CD는 자동으로 새 이미지 버전을 배포하거나 애플리케이션을 동기화되지 않은 것으로 표시하며, 사용자는 애플리케이션을 동기화하여 이미지 업데이트를 수동으로 트리거할 수 있다.

 

특징

  • Argo CD에서 관리하고 Helm 또는 Kustomize 도구 에서 생성된 앱의 이미지를 업데이트
  • 다양한 업데이트 전략에 따라 앱 이미지 업데이트

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

제한사항

 

  • 컨테이너 이미지를 업데이트하려는 응용 프로그램은 Argo CD를 사용하여 관리 해야 합니다 . Argo CD를 사용하여 관리되지 않는 워크로드는 지원하지 않는다.
  • 현재 Kustomize 또는 Helm 도구 를 사용하여 빌드된 애플리케이션에서만 작동합니다 . 일반 YAML 또는 사용자 정의 도구로 구축된 애플리케이션은 아직 지원되지 않는다.

 

Argo CD Image Updater는 현재 개발 중인 프로젝트이다. 중요한 프로덕션 워크로드 에는 아직 권장하지 않지만 개발기에서는 충분히 적용해 볼 수 있는 좋은 도구인 것으로 보인다.

 

설치

 

Argo CD Image updater는 아래의 kubectl 명령어로 설치가 가능하다.

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

 

실행하면 아래와 같이 argocd-image-updater pod가 생성된다.

pod/argocd-image-updater-84ffbd4747-2mhck               1/1     Running   0             32s

# kubectl logs -f -n argocd argocd-image-updater-84ffbd4747-2mhck
time="2022-05-18T13:44:29Z" level=info msg="argocd-image-updater v0.12.0+aee153d starting [loglevel:INFO, interval:2m0s, healthport:8080]"
time="2022-05-18T13:44:29Z" level=warning msg="commit message template at /app/config/commit.template does not exist, using default"
time="2022-05-18T13:44:29Z" level=warning msg="Registry configuration at /app/config/registries.conf could not be read: stat /app/config/registries.conf: no such file or directory -- using default configuration"
time="2022-05-18T13:44:29Z" level=info msg="ArgoCD configuration: [apiKind=kubernetes, server=argocd-server.argocd, auth_token=false, insecure=false, grpc_web=false, plaintext=false]"
time="2022-05-18T13:44:29Z" level=info msg="Starting health probe server TCP port=8080"
time="2022-05-18T13:44:29Z" level=info msg="Starting metrics server on TCP port=8081"
time="2022-05-18T13:44:29Z" level=info msg="Warming up image cache"
time="2022-05-18T13:44:29Z" level=info msg="Finished cache warm-up, pre-loaded 0 meta data entries from 1 registries"
time="2022-05-18T13:44:29Z" level=info msg="Starting image update cycle, considering 0 annotated application(s) for update"
time="2022-05-18T13:44:29Z" level=info msg="Processing results: applications=0 images_considered=0 images_skipped=0 images_updated=0 errors=0"

 

argoCD 앱 배포

 

먼저 argoCD 에 앱을 배포해보자. 앱은 https://github.com/kmaster8/argocd-image-updater 저장소에 있는 kustomize 샘플을 사용해 보자.

 

 

생성 후 배포된 현황을 보자.

 

화면에 보이듯 pod에 오류가 발생했다. 상태를 보면 아래와 같이 ImagePullBackOff 가 발생된 것을 볼 수 있다.

# k get all -n sample
NAME                                    READY   STATUS             RESTARTS   AGE
pod/kustomize-sample-56f6ffbc5b-k76nc   0/1     ImagePullBackOff   0          30s

NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kustomize-sample   ClusterIP   10.96.111.255   <none>        5000/TCP   30s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/kustomize-sample   0/1     1            0           30s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/kustomize-sample-56f6ffbc5b   1         1         0       30s

 

아직 샘플앱을 빌드하지 않아서 발생된 문제로 Sample App을 빌드해 보자. 샘플앱은 https://github.com/kmaster8/kubernetes 의 simple-flask를 사용해 보자. 여기서는 간단히 Dockerfile을 이용해서 빌드해 보겠다.

# docker build -t ghcr.io/kmaster8/sample:1.0 .
# docker push ghcr.io/kmaster8/sample:1.0
The push refers to repository [ghcr.io/kmaster8/sample]
526ef014a62f: Pushed
6e73e176155d: Pushed
636a99438d3d: Pushed
bbd7c79a9d2f: Pushed
37d61557a82e: Pushed
8711af342595: Pushed
9eb82f04c782: Pushed
1.0: digest: sha256:47407b030e73fa9154004332c0ee825522a5e164fdc77a2d6eb4a172bc38b070 size: 1789

 

빌드가 완료되면 정상적으로 앱이 생성된 것을 볼 수 있다.

 

배포가 정상적으로 되었으면, 서비스를 호출해 보자.

참고로 현재 배포된 deployment는 아래와 같다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample
  template:
    metadata:
      labels:
        app: sample
    spec:
      containers:
      - image: ghcr.io/kmaster8/sample:1.0
        name: sample
        ports:
        - containerPort: 5000

 

argoCD Image Updater 설정

 

argoCD Image Updater 설정 방법은 몇가지가 있는데 annotation 방식으로 테스트 해보자. 

# kubectl annotate app sample -n argocd \
    argocd-image-updater.argoproj.io/image-list=ghcr.io/kmaster8/sample \
    argocd-image-updater.argoproj.io/my-image.update-strategy=latest
application.argoproj.io/sample annotated

 

위와 같이 CLI로 설정해도 되고, UI에서 입력해도 된다.

 

설정 후 이제 docker 이미지를 변경해보자. 기존 v1.0에서 v1.1로 앱을 수정 후 다시 container image를 Registry에 Push 한다.

# vi app.py
...
return "Hello World! V1.1"

# docker build -t ghcr.io/kmaster8/sample:1.1 .
# docker push ghcr.io/kmaster8/sample:1.1

 

이미지 Push가 완료되면 아래와 같이 Image Updater 가 자동으로 인식한다.

time="2022-05-20T03:04:33Z" level=info msg="Starting image update cycle, considering 1 annotated application(s) for update"
time="2022-05-20T03:04:33Z" level=info msg="Setting new image to ghcr.io/kmaster8/sample:1.1" alias= application=sample image_name=kmaster8/sample image_tag=1.0 registry=ghcr.io
time="2022-05-20T03:04:33Z" level=info msg="Successfully updated image 'ghcr.io/kmaster8/sample:1.0' to 'ghcr.io/kmaster8/sample:1.1', but pending spec update (dry run=false)" alias= application=sample image_name=kmaster8/sample image_tag=1.0 registry=ghcr.io
time="2022-05-20T03:04:33Z" level=info msg="Committing 1 parameter update(s) for application sample" application=sample
time="2022-05-20T03:04:33Z" level=info msg="Successfully updated the live application spec" application=sample
time="2022-05-20T03:04:33Z" level=info msg="Processing results: applications=1 images_considered=1 images_skipped=0 images_updated=1 errors=0"

브라우저에서 다시 호출하면 위와 같은 화면이 나타난다. 

 

Argo CD Image Updater는 응용 프로그램의 이미지를 업데이트하는 방법에 대해 두 가지 고유한 방법을 지원한다.

  • Argo CD API를 통한 명령형
  • 선언적 , Git 리포지토리에 변경 사항 푸시

설정은 annotation에 아래의 값을 선택한다. ( 기본값은 argocd 이다. )

argocd-image-updater.argoproj.io/write-back-method=argocd or git

 

git으로 선택하려면 argoCD Repositories에 계정 정보를 연동해 놓아야 한다.

 

 

위와 같이 Repository를 등록 후 argocd-image-updater.argoproj.io/write-back-method:git annotation을 추가한 후 이미지를 업데이트 하면 아래와 같이 git 저장소가 보인다.

기존 git 저장소에 .argocd-source-sample.yaml 이라는 파일이 생성된다. 내용은 이미지 버전 정보이다.

kustomize:
  images:
  - ghcr.io/kmaster8/sample:1.2

 

지금까지 argoCD Image Updater를 살펴보았는데 차이점을 간단히 그림으로 그리면 아래와 같다.

 

ArgoCD

 

ArgoCD Image Updater

 

참고

https://argocd-image-updater.readthedocs.io/en/stable/configuration/applications/

반응형

'Kubernetes > devops' 카테고리의 다른 글

Keptn (활용)  (0) 2022.08.04
Ketpn (설치)  (0) 2022.07.28
argocd (활용 - helm chart 및 Kustomize 배포)  (0) 2022.05.18
argocd (활용 - Git 연동)  (0) 2022.05.17
argocd와 keycloak을 사용하여 SSO 구축하기  (0) 2022.05.14
Comments