Argo CD에서는 Sync 는 Git 리포지토리의 선언된 상태와 Kubernetes 클러스터의 실제 상태를 동기화하는 과정이다. 여기서 Resource Hook은 이러한 배포 프로세스 중 특정 시점에 추가적인 작업(PreSync, Sync, PostSync 등)을 실행하는 기능을 ArgoCD에서 제공을 해준다. 이를 통해 배포 전에 준비 작업 (ex. DB 스키마 마이그레이션)을 하거나 배포 후 검증 작업 (ex. notification)을 수행할 수 있다.
ArgoCD Hook 실행순서
ArgoCD에서 제공하는 Resource Hook은 다음과 같다.
Hook
설명
PreSync
매니페스트 적용 전에 실행된다
Sync
모든 PreSync 훅이 완료되고 성공한 후, 매니페스트 적용과 동시에 실행된다
Skip
Argo CD에서 해당 매니페스트의 적용을 건너뛰도록 지정한다
PostSync
모든 Sync 훅이 완료되고 성공한 후, 성공적인 매니페스트 적용과 모든 리소스가 Healthy 상태인 경우에 실행된다
SyncFail
동기화 작업이 실패했을 때 실행된다
PostDelete
모든 애플리케이션 리소스가 삭제된 후 실행된다 (v2.10 버전부터 사용 가능)
2. Resource Hook 설정하는 방법
2.1 Resource Hooks 설정하기
어플리케이션에 Resource Hook 을 어떻게 적용할 수 있는지 알아보자.
Resource Hook을 설정하는 방법은 간단한 어노테이션을 추가하면 된다. 다음은 PreSync에서 echo 명령어로 화면에 메시지를 출력하는 예제이다.
Kubernetes Job에서 실패한 작업을 재시도하는 횟수를 지정하는 속성이다. Job의 컨테이너가 실패할 경우, 지정된 backoffLimit 값에 따라 재시도하며, 재시도 횟수가 이 값을 초과하면 Job은 실패한 것으로 간주된다.
backoffLimit: 2: 실패 시 두 번까지 재시도 하겠다는 의미이다
2.1.1 Hook 삭제 정책
argocd.argoproj.io/hook-delete-policy 어노테이션에 의해서 Hook이 어떻게 삭제될지 정할 수 있다. ArgoCD에서 제공하는 삭제 정책은 다음과 같다. 어노테이션을 지정하지 않은 경우에는 기본적으로 BeforeHookCreation로 지정이 된다.
정책
설명
HookSucceeded
훅 리소스가 성공한 후 삭제된다 (예: Job/Workflow가 성공적으로 완료된 경우)
HookFailed
훅 리소스가 실패한 후 삭제된다
BeforeHookCreation
새로운 훅이 생성되기 전에 기존 훅 리소스가 삭제된다 (v1.3 버전부터 사용 가능). 이는 /metadata/name과 함께 사용하도록 설계된다
2.1.2 ArgoCD 실행 화면
실제 Sync를 실행하면 ArgoCD UI 화면에서는 아래와 같이 표시된다. Anchor 표시가 있는 블록이 생성이 되었고 클릭하고 LOGS에서 프로그램 화면에 출력된 값도 확인할 수 있다.
ArgoCD 화면ArgoCD Hook Logs
PreSync, PostSync로 실행된 Pod는 hook-delete-policy가 설정이 안되어서 삭제가 안되었다. HookSucceeded로 설명하면 실행후 ArgoCD나 Pod가 살아지기 때문에 실제 결과를 UI 상에서 확인할수가 없어서 삭제 정책 없이 실행하였다.
k9s
2.2 Sync Wave란?
Sync Wave는 여러 리소스를 동기화할 때 실행 순서를 제어하는 기능이다. 예를 들어, 네트워크 설정 리소스가 먼저 적용된 후 애플리케이션이 배포되기를 원할 때, 각 리소스에 Sync Wave 값을 설정해 순차적으로 실행되게 할 수 있다.
각 리소스는 기본적으로 sync-wave: “0” 을 가진다
Wave 번호가 낮은 리소스가 먼저 실행된다
여러 개의 Pre Job이 있는 경우
여러 개의 PreSync Job을 정의하는 경우, 각각의 Job에 대해 SyncWave를 설정해 순서를 지정할 수 있다. 만약 동일한 Wave 값을 가진 Job이 여러 개 있으면, 병렬로 실행된다. 예를 들어 다음과 같이 설정할 수 있다.