주요 정리 내용
- gitOps Operator 실습
- ArgoCD 와 operator 비교
- ArgoCD 핵심 구성 요소
- ArgoCD 실습 & 도전과제 (진행중)
riverjin@gangjin-ung-ui-Macmini basic-gitops-operator % go run main.go
go: downloading github.com/go-git/go-git/v5 v5.4.2
go: downloading github.com/go-git/go-billy/v5 v5.3.1
go: downloading github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7
go: downloading github.com/sergi/go-diff v1.1.0
go: downloading github.com/imdario/mergo v0.3.12
go: downloading github.com/emirpasic/gods v1.12.0
go: downloading github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99
go: downloading github.com/mitchellh/go-homedir v1.1.0
go: downloading golang.org/x/sys v0.0.0-20210616094352-59db8d763f22
go: downloading github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351
go: downloading github.com/xanzy/ssh-agent v0.3.0
go: downloading golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b
go: downloading golang.org/x/net v0.0.0-20210520170846-37e1c6afe023
go: downloading github.com/go-git/gcfg v1.5.0
go: downloading gopkg.in/warnings.v0 v0.1.2
start repo sync
Enumerating objects: 1261, done.
start repo sync
Enumerating objects: 1261, done.
Counting objects: 100% (125/125), done.
Compressing objects: 100% (32/32), done.
Total 1261 (delta 99), reused 97 (delta 93), pack-reused 1136 (from 1)
start manifests apply
namespace/nginx created
Error from server (NotFound): error when creating "/Users/riverjin/cicd-study/ArgoCD-in-Practice/ch01/basic-gitops-operator/tmp/ch01/basic-gitops-operator-config/deployment.yaml": namespaces "nginx" not found
manifests apply error: exit status 1
next sync in 5s
start repo sync
start manifests apply
deployment.apps/nginx created
namespace/nginx unchanged
next sync in 5s
start repo sync
start manifests apply
deployment.apps/nginx unchanged
namespace/nginx unchanged
next sync in 5s
start repo sync
start manifests apply
deployment.apps/nginx unchanged
namespace/nginx unchanged

go run main.go
main.go는 Git 저장소(또는 로컬 매니페스트)를 주기적으로 동기화(sync)하고, start repo sync # Git 저장소 동기화 시작
start manifests apply # 매니페스트 적용 시작
deployment.apps/nginx unchanged # 변경 없음 (이미 존재)
namespace/nginx unchanged # 변경 없음 (이미 존재)
next sync in 5s # 5초 후 재동기화 예약kubectl get deploy,pod -n nginx
의미:
GitOps Operator가 적용한 매니페스트가 실제 클러스터에 정상적으로 배포되었는지 검증합니다.
결과 해석:
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx 1/1 1 1 63s # 배포 성공
NAME READY STATUS RESTARTS AGE
pod/nginx-5869d7778c-229mz 1/1 Running 0 63s # 파드 실행 중
READY 1/1: 배포된 파드가 정상 상태임을 의미.kubectl delete deploy -n nginx nginx
nginx 배포를 삭제.# 삭제 후 5초 이내에 다시 확인
kubectl get deploy -n nginx
# 출력: deployment.apps/nginx가 다시 생성됨basic-gitops-operator-config 디렉터리의 YAML 파일이 "원하는 상태(Desired State)" 를 정의합니다.Auto-Sync 모드와 동일한 동작.GitRepository + Kustomization 리소스와 유사한 역할.이 테스트는 다음과 같은 실제 사례에 적용될 수 있습니다:
1. CI/CD 파이프라인 통합:
| 한계점 | 개선 방안 |
|---|---|
| 로컬 매니페스트만 사용 | Git 저장소 연동 (e.g., git clone 추가) |
| 고정된 5초 주기 | 이벤트 기반 트리거 (e.g., Kubernetes Watch API) |
| 단순 상태 비교 | 헬스 체크(Health Check) 및 롤백 기능 추가 |
| 에러 핸들링 부재 | 로깅 및 알림 시스템 연동 |
이 테스트는 "GitOps의 핵심 = 코드로 정의된 상태와 실제 인프라의 지속적 동기화" 를 경험하게 합니다.
아래 테스트에서 구현한 간단한 GitOps 운영자와 ArgoCD의 핵심 차이점을 기능, 아키텍처, 사용 사례 중심으로 비교합니다.
| 구분 | 간단한 GitOps 운영자 (테스트용) | ArgoCD |
|---|---|---|
| 구성 요소 | 단일 Go 바이너리 (main.go) | 마이크로서비스 아키텍처 (API Server, Repo Server, Application Controller, Redis) |
| 상태 저장소 | 로컬 파일 시스템 (basic-gitops-operator-config) | Kubernetes CRD (Custom Resource Definition) |
| 동기화 방식 | 고정된 주기 폴링 (5초 간격) | 폴링 (기본 3분) + 웹훅 기반 실시간 트리거 |
| Git 연동 | 로컬 매니페스트만 지원 | Git/S3/Helm Chart/Kustomize 등 다양한 소스 지원 |
| 확장성 | 단일 클러스터, 단순 배포용 | 멀티 클러스터, 복잡한 배포 파이프라인 지원 |
| 기능 | 간단한 GitOps 운영자 | ArgoCD |
|---|---|---|
| 자동 복구(Self-Healing) | ✅ (기본 구현) | ✅ (고급 설정 가능: selfHeal 옵션) |
| UI/대시보드 | ❌ (CLI 전용) | ✅ (풍부한 웹 UI: 애플리케이션 상태, 동기화 이력) |
| 상태 비교 | 단순 리소스 존재 여부 확인 | 드리프트(Drift) 감지: 상세한 상태 차이 분석 |
| 롤백 | 수동으로 Git 되돌림 필요 | ✅ (UI/CLI로 한 클릭 롤백) |
| 알림 | ❌ | ✅ (Slack, Email 등 다양한 알림 채널) |
| RBAC | ❌ | ✅ (세분화된 역할 기반 접근 제어) |
| Helm/Kustomize 지원 | ❌ (순수 YAML) | ✅ (Helm, Kustomize, Jsonnet 등 템플릿 지원) |
| 멀티 테넌시 | ❌ | ✅ (프로젝트 단위 격리) |
| 시나리오 | 간단한 GitOps 운영자 | ArgoCD |
|---|---|---|
| 학습용/프로토타입 | ✅ (간단한 구현으로 개념 이해) | ⚠️ (설치 및 설정 복잡) |
| 프로덕션 환경 | ❌ (보안/모니터링 부재) | ✅ (CNCF 졸업 프로젝트, 엔터프라이즈급 안정성) |
| 복잡한 배포 | ❌ (단순 YAML만 지원) | ✅ (Helm 차트, Kustomize 오버레이 등) |
| 멀티 클러스터 관리 | ❌ | ✅ (하나의 ArgoCD로 여러 클러스터 관리) |
| 팀 협업 | ❌ | ✅ (UI 기반 협업, 감사 로그) |
| 특징 | 간단한 운영자 | ArgoCD |
|---|---|---|
| 트리거 | 고정된 주기 폴링 (5초) | 폴링 + 웹훅 기반 실시간 동기화 |
| 효율성 | 불필요한 리소스 소모 (주기적 실행) | 이벤트 기반으로 리소스 효율적 |
kubectl apply를 통해 단순히 리소스 존재 여부만 확인. argocd app diff 명령으로 변경 사항 시각화. kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
nginx-app.yaml)apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nginx-app
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/your-repo/basic-gitops-operator-config.git' # Git 저장소
targetRevision: HEAD
path: . # 매니페스트 경로
destination:
server: 'https://kubernetes.default.svc'
namespace: nginx
syncPolicy:
automated:
prune: true # 불필요한 리소스 자동 삭제
selfHeal: true # 드리프트 자동 복구
kubectl apply -f nginx-app.yaml
argocd app get nginx-app # 동기화 상태 확인
kubectl delete deploy -n nginx nginx
→ ArgoCD가 selfHeal 설정에 따라 3분 내 자동 복구 (웹훅 사용 시 즉시 복구).
- ArgoCD: "GitOps를 실제 환경에 적용하는 엔터프라이즈 도구" 입니다.
구성 드리프트(Configuration Drift)란?
"시간이 지남에 따라 인프라 자원들이 원래 의도한 상태(코드로 정의된 상태)와 달라지는 현상"
즉, Git 저장소에 정의된 선언적 구성(Desired State)과 실제 운영 환경의 현재 상태(Current State) 사이에 불일치가 발생하는 문제입니다.
kubectl edit deployment를 통해 직접 파드 이미지를 변경하거나,# deployment.yaml (Git 저장소)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx:1.21 # 고정된 버전
kubectl edit deployment nginx를 실행해 수동으로 이미지 버전을 변경:image: nginx:1.22 # 임시로 최신 버전으로 변경nginx:1.21로 기록되어 있지만, 실제 클러스터에는 nginx:1.22가 실행 중.nginx:1.21에 의존하는 코드를 배포 → 호환성 오류 발생.nginx:1.21로 복구되지만, 의존성 문제로 애플리케이션 충돌.nginx:1.22에 알려진 취약점이 존재하지만, Git에는 반영되지 않아 감지 불가.| 영역 | 드리프트 예시 |
|---|---|
| Kubernetes | - 파드 이미지 버전 불일치 - 레플리카 수 수동 변경 - ConfigMap/Secret 값 변경 |
| 클라우드 인프라 | - AWS 보안 그룹 규칙 수동 추가 - Azure VM 사이즈 변경 - GCP 디스크 타입 수정 |
| 네트워크 | - 로드 밸런서 설정 변경 - DNS 레코드 수동 수정 - 방화벽 포트 개방 |
| 데이터베이스 | - 스키마 변경 미반영 - 사용자 권한 수동 부여 - 백업 설정 변경 |
replicas: 1로 수동 변경된 상태에서 트래픽 증가 → 서비스 다운.replicas: 3으로 기록되어 있어 모니터링 시스템이 정상으로 판단.readOnlyRootFilesystem: true여야 한다"는 정책을 수립했지만,false로 변경 → 감사 실패.graph LR
A[Git 저장소] -->|Desired State| B(ArgoCD)
B -->|상태 비교| C[클러스터]
C -->|Drift 감지| B
B -->|자동 복구| Ckubectl edit 같은 수동 변경을 차단.syncPolicy:
automated:
selfHeal: true # 드리프트 자동 복구
prune: true # 불필요한 리소스 자동 삭제| 도구 | 기능 |
|---|---|
| ArgoCD | UI에서 드리프트 시각화, argocd app diff로 상세 비교 |
| Checkov | IaC(Infrastructure as Code) 보안 및 구성 검사 |
| Opa/Gatekeeper | Kubernetes 정책 엔진으로 구성 준수 여부 실시간 검증 |
💡 간단한 GitOps 운영자의 한계:
이전 테스트의 간단한 운영자는 리소스 존재 여부만 확인하지만, 세부적인 드리프트(이미지 버전, 환경 변수 등)는 감지하지 못합니다.
ArgoCD는 상태 비교 알고리즘으로 이를 해결하며, 프로덕션 환경에서의 구성 드리프트를 방지합니다.
역할: Argo CD의 중앙 제어 탑으로 모든 외부 시스템과의 통합을 담당
| 기능 | 설명 |
|---|---|
| 애플리케이션 관리 | 애플리케이션 생성/수정/삭제 및 상태 보고 |
| 인증/인가 | RBAC, SSO(SAML, OIDC, LDAP) 지원 |
| CI/CD 통합 | 외부 시스템과의 API 상호작용 |
| 트리거 관리 | 수동/자동 동기화 작업 트리거 |
| 웹 UI 제공 | 대시보드 및 관리 인터페이스 |

역할: Git 저장소의 로컬 캐시를 유지하며 매니페스트 제공
Git 리포지터리 캐싱
매니페스트 렌더링

역할: 실제 상태 동기화 및 자기 치유(Self-Healing) 담당
상태 모니터링
드리프트 감지
자동 복구


# 특정 애플리케이션 동기화
argocd app sync myapp
# 전체 애플리케이션 동기화
argocd app sync --all
작동 원리:
1. Git 저장소에 웹훅 설정
2. 코드 푸시 시 Argo CD API 서버로 이벤트 전송
3. 즉시 동기화 프로세스 트리거


💡 Argo CD의 핵심 가치:
"Git 저장소에 정의된 상태를 클러스터의 실제 상태로 자동 동기화함으로써,
인프라 관리의 예측 가능성과 안정성을 극대화하는 GitOps 구현 도구"