CI/CD & GitOps
Git이 진실의 원천 — 선언적 인프라의 자연스러운 귀결
1. K8s CI/CD 패턴
1.1 기본 흐름
flowchart LR
Code["코드 변경<br/>(Git Push)"] --> CI["CI<br/>(빌드 + 테스트)"]
CI --> Image["이미지 빌드<br/>(Docker Build)"]
Image --> Push["레지스트리 Push<br/>(ECR/Harbor)"]
Push --> Update["매니페스트 업데이트<br/>(이미지 태그 변경)"]
Update --> CD["CD<br/>(K8s에 배포)"]
1.2 Push vs Pull 기반 배포
| Push 기반 | Pull 기반 (GitOps) | |
|---|---|---|
| 방식 | CI가 직접 kubectl apply | Git을 감시하고 자동 동기화 |
| 보안 | CI에 K8s 접근 권한 필요 | ✅ 클러스터 내부에서만 접근 |
| 감사 | CI 로그에 의존 | ✅ Git 이력 = 배포 이력 |
| 도구 | Jenkins, GitHub Actions | ✅ ArgoCD, Flux |
| 드리프트 감지 | ❌ | ✅ Git과 클러스터 자동 비교 |
2. GitOps
2.1 핵심 원칙
| 원칙 | 설명 |
|---|---|
| 선언적 | 원하는 상태를 Git에 YAML로 선언 |
| 버전 관리 | 모든 변경이 Git 커밋으로 추적됨 |
| 자동 동기화 | Git의 상태와 클러스터의 상태를 자동으로 일치 |
| 자가 치유 | 수동 변경(kubectl edit)을 감지하고 Git 상태로 되돌림 |
2.2 레포 구조 패턴
| 패턴 | 설명 | 적합 |
|---|---|---|
| 모노레포 | 앱 코드 + K8s 매니페스트 같은 레포 | 소규모 |
| 분리 레포 | 앱 레포 + 배포 레포 분리 | ✅ 프로덕션 권장 |
# 분리 레포 구조
app-repo/ # 앱 소스코드
└── Dockerfile
deploy-repo/ # K8s 매니페스트 (GitOps)
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
└── overlays/
├── dev/
├── staging/
└── prod/
3. ArgoCD
3.1 ArgoCD란
가장 많이 사용되는 GitOps 도구. Git 레포를 감시하고 K8s 클러스터에 자동 동기화.
flowchart LR
Git["Git Repo<br/>(매니페스트)"] -->|"Watch"| Argo["ArgoCD<br/>(클러스터 내부)"]
Argo -->|"Apply"| Cluster["K8s Cluster"]
Argo -->|"비교"| Diff["Git 상태 vs<br/>클러스터 상태"]
Diff -->|"불일치"| Sync["자동 Sync"]
3.2 핵심 개념
| 개념 | 설명 |
|---|---|
| Application | ArgoCD의 핵심 CRD. Git 소스 + 타겟 클러스터/네임스페이스 |
| Sync | Git → 클러스터 동기화 |
| Health | 앱의 건강 상태 (Healthy, Degraded, Progressing) |
| Sync Policy | 자동(auto) vs 수동(manual) 동기화 |
| Self-Heal | 수동 변경을 감지하고 Git 상태로 되돌림 |
3.3 Application 예시
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: web-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/myorg/deploy-repo.git
path: overlays/prod
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true # Git에서 삭제하면 클러스터에서도 삭제
selfHeal: true # 수동 변경 자동 되돌림
3.4 ArgoCD 웹 UI
- 앱별 동기화 상태, 리소스 트리, 로그 확인
- 수동 Sync, Rollback
- 여러 클러스터 관리 (멀티클러스터)
4. Flux
4.1 Flux란
CNCF 졸업 프로젝트. ArgoCD와 같은 GitOps 도구이지만 CLI/API 중심 (웹 UI 없음).
4.2 ArgoCD vs Flux
| ArgoCD | Flux | |
|---|---|---|
| 웹 UI | ✅ 풍부 | ❌ (별도 대시보드 필요) |
| 멀티클러스터 | ✅ (중앙 집중) | ✅ (분산) |
| CRD | Application | GitRepository, Kustomization |
| Helm 지원 | ✅ | ✅ (HelmRelease CRD) |
| 커뮤니티 | ✅ 더 큼 | CNCF 졸업 |
| 추천 | ✅ 대부분의 경우 | CRD 기반 자동화 선호 시 |
5. CI + GitOps 통합 예시
flowchart TB
Dev["개발자<br/>코드 Push"] --> CI["CI (GitHub Actions)"]
subgraph CI_Steps["CI"]
Build["1. Docker Build"]
Test["2. 테스트"]
Push_Img["3. 이미지 Push<br/>(v1.2.3)"]
UpdateManifest["4. deploy-repo의<br/>이미지 태그 업데이트"]
end
CI --> Build --> Test --> Push_Img --> UpdateManifest
UpdateManifest -->|"Git Commit"| DeployRepo["deploy-repo<br/>(매니페스트)"]
DeployRepo -->|"ArgoCD Watch"| ArgoSync["ArgoCD Sync"]
ArgoSync --> Cluster_CD["K8s 클러스터<br/>새 버전 배포"]
핵심: CI는 이미지 빌드와 매니페스트 업데이트까지만 담당. 실제 K8s 배포는 ArgoCD가 담당 (Pull 기반). CI에 K8s 접근 권한이 필요 없어 보안 개선.
정리
| 개념 | 핵심 |
|---|---|
| GitOps | Git = Single Source of Truth. 선언적, 자동 동기화, 감사 추적 |
| ArgoCD | ✅ 가장 많이 사용되는 GitOps 도구. 웹 UI, 멀티클러스터 |
| Flux | CNCF 졸업. CLI/CRD 기반 |
| Pull 기반 | 클러스터 내부에서 Git을 감시 → 보안, 감사에 유리 |
| 분리 레포 | 앱 레포 + 배포 레포 분리가 프로덕션 권장 패턴 |
이것으로 기본편(#1~#12) 완료. CKA 시험 범위의 이론을 커버함.
다음 글
→ #13 Service Mesh — Istio & Linkerd (심화편 시작)
🔗 관련 문서
- Pipeline — CI/CD — 블로그 자체의 CI/CD 파이프라인
- Kubernetes Series Index — 시리즈 목차