쿠버네티스에 배포할 때 kubectl apply를 직접 치다 보면 "지금 클러스터에 실제로 뭐가 떠 있지?"라는 질문에 답하기 어려워집니다. 누가 손으로 바꿨는지, 무엇이 최신인지 추적이 안 됩니다. GitOps는 이 문제를 깃 저장소를 단일 진실 공급원(single source of truth)으로 삼아 해결하고, ArgoCD는 그 방식을 쿠버네티스에서 구현해 주는 도구입니다.
GitOps의 핵심 원리
GitOps는 "원하는 상태를 깃에 선언하고, 도구가 클러스터를 그 상태로 맞춘다"는 발상입니다. 사람이 클러스터를 직접 건드리는 대신, 깃에 커밋(PR 병합)하면 그 변경이 자동으로 반영됩니다. 배포 이력이 곧 깃 히스토리이므로 롤백은 이전 커밋으로 되돌리는 일과 같아집니다.
| 항목 | 전통적 배포 | GitOps |
|---|---|---|
| 변경 출발점 | kubectl·CI 스크립트 | 깃 커밋/PR |
| 진실 공급원 | 클러스터 현재 상태 | 깃 저장소 |
| 롤백 | 수동 재배포 | 이전 커밋으로 revert |
| 감사 추적 | 흩어짐 | 깃 히스토리에 일원화 |
| 드리프트 감지 | 어려움 | 도구가 자동 비교 |
ArgoCD가 하는 일
ArgoCD는 클러스터 안에서 돌면서 지정한 깃 저장소를 주기적으로 들여다봅니다. 저장소의 매니페스트(원하는 상태)와 클러스터의 실제 상태를 비교해, 둘이 다르면 OutOfSync로 표시하고 동기화(sync) 시 그 차이를 클러스터에 적용합니다.
배포 대상은 Application이라는 리소스로 정의합니다.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: shop-frontend
namespace: argocd
spec:
source:
repoURL: https://github.com/myorg/shop-manifests
path: frontend
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: shop
syncPolicy:
automated:
prune: true # 깃에서 지워진 리소스는 클러스터에서도 제거
selfHeal: true # 누가 손으로 바꿔도 깃 상태로 되돌림
selfHeal: true가 핵심입니다. 누군가 클러스터를 손으로 수정해도 ArgoCD가 깃 상태로 다시 되돌리므로, 클러스터가 항상 깃과 일치합니다.
동기화 상태 확인하기
CLI로 애플리케이션 상태와 차이를 직접 볼 수 있습니다.
argocd app list
argocd app get shop-frontend
argocd app diff shop-frontend
argocd app sync shop-frontend
diff는 깃과 클러스터의 차이를, sync는 그 차이를 적용하는 명령입니다. 자동 동기화를 켜 두면 커밋만으로 배포가 끝납니다.
요점 정리
- GitOps는 깃 저장소를 진실 공급원으로 삼아 클러스터 상태를 선언적으로 관리한다.
- 배포는
kubectl이 아니라 깃 커밋/PR에서 출발하고, 롤백은 이전 커밋으로 되돌리는 것이다. - ArgoCD는
Application리소스로 대상을 정의하고, 깃과 클러스터를 비교·동기화한다. prune과selfHeal로 클러스터가 항상 깃과 일치하도록 유지한다.
ArgoCD를 직접 띄우고 Application을 만들어 동기화 흐름을 눈으로 확인하는 실습은 쿠버네티스 트랙에서 할 수 있습니다 — 회원가입 없이 무료로.