ArgoCD는 웹 UI가 있는 툴처럼 보이지만, 기술적으로는 K8s Custom Controller이다.
Pod, Deployment같은 리소스가 있다.
Application 객체를 생성하면, ArgoCD 컨트롤러가 이를 감지한다.
ArgoCD는 마이크로서비스 구조로 되어 있다. 내부 동작을 알아보자.
Live State(K8s의 현재 상태)와 Target State(Repo Server가 준 Git 상태)를 비교한다.Sync(동기화) 로직을 실행한다.ArgoCD에서 가장 많이 다루게 될 Application 리소스의 실제 모습이다.
이 YAML 하나가 서비스 하나의 배포 파이프라인을 정의한다.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: api # ArgoCD UI에 뜨는 이름
namespace: argocd # ArgoCD가 설치된 네임스페이스
spec:
project: default # 프로젝트 그룹 (권한 관리용)
# 1. 어디서 가져올까?
source:
repoURL: https://github.com/jon890/k8s-manifests.git
targetRevision: HEAD # 브랜치(main) 또는 태그 (v1.0.0)
path: api # Git 내부 경로
# 2. 어디에 배포할까?
destination:
server: https:.//kubernetes.default.svc # 타겟 클러스터 API 주소
namespace: api # 배포될 k8s 네임스페이스
# 3. 어떻게 동기화할까? (Sync Policy)
syncPolicy:
automated: # 자동 동기화 옵션
prune: # Git에서 파일 지우면 k8s 리ㅗㅅ스도 삭제
selfHeal: true # 누가 kubectl를 맘대로 고치면 원상 복구
syncOptions:
- CreateNamespace=true # 네임스페이스가 없으면 생성
K8s는 기본적으로 비동기 병렬로 뜬다.
하지만 백엔드 앱은 DB 마이그레이션이 끝나야 서버가 떠야 한다와 같은 순서가 필요한 경우도 있다.
이때 사용하는 것이 Wave와 Hook이다.
argocd.argoproj.io/sync-wave: "1"과 같은 어노테이션을 붙인다.PreSync: 배포 시작 전에 실행
PostSync: 배포 성공 후 실행
SyncFail: 실패 시 실행
Diff 탭을 눌러서 무엇이 다른지확인하는 습관이 필요하다.ignoreDifferences 설정으로 무시할 수 있다.SealedSecrets나 Vault, SOPS 같은 도구를 써서 암호화된 파일을 Git에 올리고, ArgoCD가 배포할 떄 복호화하거나 참조하도록 구성한다.정리 : ArgoCD는 단순 툴이 아니라,
Application이라는 CRD를 통해 Git의 상태를 K8s에 반영(Reconcile)하는 컨트롤러이다.