summary: "GitOps의 핵심 개념(선언형/SSOT)과 Jenkins → Registry → GitOps Repo → Argo CD → Kubernetes로 이어지는 배포 자동화 흐름을 7단계로 정리합니다."
"Git이 운영의 단일 진실(Single Source of Truth)이 되면 생기는 일"
컨테이너 기반 서비스가 늘고, 멀티 서버/클라우드 환경이 보편화되면서 인프라 운영에서 반복 작업과 수동 배포는 더 이상 "사람이 버티는 방식"으로 유지되기 어렵습니다.
이 글은 GitOps 기반 DevOps 시스템을 바탕으로 다음을 한 번에 잡는 것을 목표로 합니다.
- GitOps의 핵심 개념(선언형, SSOT)
- 구성 요소(Jenkins/Registry/GitOps Repo/Argo CD)의 역할
- CI/CD가 실제로 움직이는 전체 흐름
목표 문장
"Jenkins로 빌드하고, Registry(Harbor 등)에 이미지를 올리고, GitOps Repo에 배포 상태를 선언하면, Argo CD가 Kubernetes 상태를 맞춘다."
이 한 문장이 왜 강력한지 운영 관점에서 이해하는 것이 1편의 목표입니다.
1. GitOps란?
GitOps는 Weaveworks에서 처음 사용한 용어로, 클라우드 네이티브 애플리케이션의 지속적 배포(Continuous Deployment) 에 초점을 둔 DevOps 실천 방식 중 하나입니다.
핵심 아이디어는 다음 3가지로 요약됩니다.
- 배포에 관련된 모든 설정을 선언형(Declarative) 기술서 형태로 작성한다.
- 선언형 기술서를 Config Repository(Git 저장소) 에서 관리한다.
- 자동화 시스템이 Git에 기록된 상태와 운영 환경의 실제 상태를 지속적으로 비교하고, 둘이 같아지도록 동기화한다.
즉, 운영의 "정답 상태"는 서버에 있지 않고 Git에 있습니다.
2. GitOps의 특징: 선언형 + SSOT
2.1 선언형(Declarative) 기술서
GitOps에서 말하는 선언형은 "어떻게(How)"가 아니라 "무엇을(What)"을 적는 방식입니다.
현업에서 가장 이해가 쉬운 예시는 Kubernetes 리소스입니다.
- 명령형(Imperative) 예시(즉흥 조치)
kubectl scale deployment api --replicas=6kubectl set image deployment api api=registry.example.com/api:2026-02-07-1
- 선언형(Declarative) 예시(원하는 상태를 기록)
- GitOps Repo의 매니페스트(또는 Kustomize/Helm values)에 다음처럼 "원하는 상태"를 적어둠
replicas: 6image: registry.example.com/api:2026-02-07-1
- GitOps Repo의 매니페스트(또는 Kustomize/Helm values)에 다음처럼 "원하는 상태"를 적어둠
요점은, 명령형은 "지금 당장 바꾸기"이고, 선언형은 "정답 상태를 문서(코드)로 남기기"입니다.
장점은 명확합니다.
- OS/환경별 절차에 덜 의존한다.
- 사람이 수동으로 재현하는 단계가 줄어든다.
- 원하는 상태가 한 곳(Git)에 명확히 기록된다.
2.2 단일 진실 공급원(SSOT: Single Source of Truth)
SSOT는 "어떤 상태(Truth)의 원인은 단 하나의 원천(Source)에 의해 결정된다"는 개념입니다.
GitOps에서는 이 원천을 Git으로 고정합니다.
- Git 저장소(시스템 소스)와 운영 환경을 1:1로 결합
- 모든 운영 활동의 시작이 Git 커밋/머지
- Git의 강력한 기능(History, Merge Request/Review, Revert)을 운영에서도 그대로 사용
결과적으로 "누가/언제/왜/어디를" 바꿨는지가 운영에서도 추적 가능해집니다.
3. GitOps의 주요 장점(운영 관점)
3.1 신뢰할 수 있는 정보 공유
운영에서 자주 나오는 질문(진짜로 자주 나옵니다):
- "지금 프로덕션에 떠 있는 API 이미지 태그가 뭐였지? 핫픽스가 들어간 버전이 맞나?"
- "지난주에 Ingress 경로(/api, /admin) 라우팅이 왜 바뀌었지? 누가 MR을 머지했지?"
- "이번 장애 이후에 HPA/리소스 limit를 조정했다는데, 현재 값이 정확히 뭐지?"
GitOps에서는 답이 단순합니다.
- Git 이력을 보면 현재 상태는 물론 변경 이유까지 파악 가능
- 서버에 직접 SSH로 들어가 확인할 필요가 줄어듦
- 별도의 문서화 부담도 감소(이력 자체가 문서)
3.2 에러 복구 시간 감소
새 배포 후 장애가 발생하면:
git revert로 선언 상태를 되돌리고- 자동화 시스템이 운영 환경을 이전 상태로 동기화(롤백)
복구가 "수동 조치"가 아니라 정답 상태를 되돌리는 행위로 단순화됩니다.
3.3 익숙한 절차(교육 비용 감소)
개발자에게 익숙한 Git 워크플로우:
commit -> push -> merge request -> review -> merge
이 흐름이 운영에도 확장되면:
- 별도 배포 절차/교육이 줄고
- 리뷰로 휴먼 에러를 조기에 발견
- 책임 분담(승인/변경 기록)이 명확해집니다
4. 시스템 아키텍처(역할 분담)
대표적인 GitOps 구성 요소를 역할 기준으로 정리하면 아래와 같습니다.
- Jenkins: 빌드/테스트/이미지 생성(CI)
- Registry(Harbor 등): Docker 이미지(및 Helm chart) 저장소
- GitOps Repository: 배포 매니페스트(선언 상태) 저장소
- Argo CD: GitOps 구현체. Git을 모니터링하고 Kubernetes로 동기화(CD)
핵심 포인트:
- Jenkins가 배포를 직접 "실행"하기보다는,
- 배포 상태를 Git에 반영(선언) 하는 쪽으로 역할이 이동합니다.
5. GitOps 기반 CI/CD 동작 흐름(7단계)
문서의 흐름을 운영 관점으로 재정리하면 다음 7단계입니다.
- 코드 커밋(Commit Code)
- 개발자가 Source Repo에 커밋/푸시
- 빌드 파이프라인 트리거
- Jenkins가 Webhook 또는 Polling으로 변경 감지
- 이미지 빌드 & 푸시(Push Image)
- Jenkins가 Docker 이미지를 만들고 Registry에 Push
- 설정 업데이트(Update Values) - GitOps의 핵심
- 새 이미지 태그(버전)를 GitOps Repo 매니페스트에 반영하고 커밋
- Repo 변경 감지(Pull Repo)
- Argo CD가 GitOps Repo 변경을 감지
- 상태 동기화(State Sync)
- Argo CD가 Kubernetes 리소스를 Git 상태에 맞게 Sync
- 이미지 Pull & 배포 완료(Pull Images)
- 워커 노드가 Registry에서 이미지를 Pull하여 Pod 기동
6. 설치 요구사항(요약): "어디에 설치하느냐"로 다시 보기
GitOps 파이프라인은 특정 OS 버전보다 어떤 환경에 배포/운영할지가 더 중요합니다. 실무에서는 보통 아래 3가지 시나리오로 나뉩니다.
시나리오 A) 관리형 Kubernetes(EKS/GKE/AKS 등)를 쓰는 경우
- Kubernetes 클러스터: 클라우드가 컨트롤 플레인/노드 관리를 상당 부분 대신해줌
- GitOps 컨트롤러(Argo CD 등): 클러스터 안에 설치
- CI(Jenkins/GitHub Actions 등): 클라우드/사내 어디든 가능(보통은 별도 실행 환경)
- Registry(ECR/GAR/ACR 또는 Harbor 등): 관리형 레지스트리 또는 사내 레지스트리
이 경우 요구사항은 "OS"가 아니라:
- Argo CD가 동작할 네임스페이스/리소스 여유
- 클러스터 ↔ Registry ↔ Git 접근 네트워크/권한
- Ingress/도메인/TLS(필요 시)
시나리오 B) 내부 서버(온프레/사내 VM)에서 클러스터를 직접 운영하는 경우
- kubeadm/kubespray/RKE2 등으로 클러스터를 직접 구성
- 로드밸런서/스토리지/인증서(또는 외부 프록시)까지 포함해 "플랫폼"을 스스로 책임져야 함
이 경우 체크해야 할 것은:
- 노드 리소스(특히 Registry/CI까지 같이 올릴지 여부)
- 영구 스토리지(PV) 제공 방식(NFS/CSI/로컬 등)
- 외부 노출 방식(NodePort + 프록시 / MetalLB / 사내 L4)
시나리오 C) 1대(또는 소수) 서버에서 여러 환경(dev/stage/prod)을 굴리는 경우
- 엄밀한 의미의 고가용성보다는 "환경 분리"와 "업데이트 자동화"에 초점
- 방법 예시
- 네임스페이스를 dev/stage/prod로 분리
- GitOps Repo에서 overlays로 환경 차이를 관리
- Argo CD는 1개(또는 프로젝트 분리)로 운영
이 경우 핵심 요구사항은:
- 한 서버에 올라갈 컴포넌트(Argo CD/Registry/CI/앱)가 공유할 수 있는 리소스 여유
- 장애/업데이트 시 영향 범위가 커지므로 백업/롤백 전략(특히 DB/PV)
결론: 설치 요구사항은 "OS 버전"보다도, (1) 어떤 Kubernetes를 쓰는지 (2) Git/Registry/클러스터 간 권한과 네트워크가 연결되는지 (3) 환경을 어떻게 분리/롤백할지가 품질을 좌우합니다.
7. Harbor와 Jenkins를 많이 쓰는 이유
7.1 Harbor(Registry)
Harbor는 기업 환경에서 컨테이너 이미지와 Helm 차트를 안전하게 저장/관리/배포하기 위한 오픈소스 엔터프라이즈 레지스트리입니다.
- 기본 Docker Registry 대비 보안/거버넌스/멀티 테넌시 기능 강화
- 대규모 Kubernetes/클라우드 네이티브 환경에 적합
7.2 Jenkins(CI)
Jenkins는 대표적인 오픈소스 CI 도구로, 빌드/테스트 자동화와 플러그인 생태계가 강점입니다.
- Credentials(자격 증명) 관리로 토큰/SSH 키/인증서 등을 안전하게 보관
- Git 기반 워크플로우와 결합하기 쉬움
8. 정리
GitOps는 단순히 "배포 자동화"가 아니라, 운영의 기준점을 Git으로 바꾸는 것입니다.
- 운영 상태의 기준이 서버가 아니라 Git
- 변경은 버튼이 아니라 커밋/리뷰/머지
- 복구는 수동 조치가 아니라 revert
다음 글(2편)에서는 Kubernetes 클러스터(kubeadm) 구성과 Argo CD 설치/동기화 흐름을 실전 체크리스트 형태로 정리합니다.
9. 참고 링크
https://www.samsungsds.com/kr/insights/gitops.html https://techblog.gccompany.co.kr/여기어때-ci-cd-개선기-part-1-문제-파악-ed6aa91f0d7b https://blog.bizspring.co.kr/테크/argocd를-이용한-kubernetes-ci-cd-구현/ https://blog.pages.kr/3026 https://www.linkedin.com/pulse/devops-day-87-argo-cd-maninder-singh/ https://kimjingo.tistory.com/79#toc1 https://beer1.tistory.com/46