Skip to main content

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 applyGit을 감시하고 자동 동기화
보안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 핵심 개념

개념설명
ApplicationArgoCD의 핵심 CRD. Git 소스 + 타겟 클러스터/네임스페이스
SyncGit → 클러스터 동기화
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

ArgoCDFlux
웹 UI✅ 풍부❌ (별도 대시보드 필요)
멀티클러스터✅ (중앙 집중)✅ (분산)
CRDApplicationGitRepository, 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 접근 권한이 필요 없어 보안 개선.


정리

개념핵심
GitOpsGit = Single Source of Truth. 선언적, 자동 동기화, 감사 추적
ArgoCD✅ 가장 많이 사용되는 GitOps 도구. 웹 UI, 멀티클러스터
FluxCNCF 졸업. CLI/CRD 기반
Pull 기반클러스터 내부에서 Git을 감시 → 보안, 감사에 유리
분리 레포앱 레포 + 배포 레포 분리가 프로덕션 권장 패턴

이것으로 기본편(#1~#12) 완료. CKA 시험 범위의 이론을 커버함.


다음 글

→ #13 Service Mesh — Istio & Linkerd (심화편 시작)


🔗 관련 문서


📝 참고 자료