
GitOps는 애플리케이션 배포와 운영 환경 변경을 Git 저장소를 기준으로 관리하는 운영 방식이다.
쉽게 말하면, 운영 환경이 어떤 상태여야 하는지를 Git에 선언하고, 실제 시스템이 그 Git 상태를 기준으로 동기화되도록 만드는 방식이다.
즉, GitOps에서는 Git 저장소가 단순히 소스코드 저장소 역할만 하는 것이 아니라, 다음까지 포함하는 기준점이 됨.
전통적인 배포 방식에서는 CI 도구가 서버에 접속해 명령어를 보내만, GitOps에서는 Git에 기록된 태그나 커밋 해시가 기준이 된다.
deployment.yaml 내의 image: my-app:v1.2.0 처럼 이미지 태그가 수정되는 순간이 곧 "배포 시작"을 의미한다.애플리케이션이 실행될 인프라의 상태를 선언적(Declarative)으로 관리한다.
동일한 애플리케이션을 여러 환경(Dev, Staging, Prod)에 배포할 때 사용하는 템플릿 관리 도구의 설정값입니다.
values.yaml에 정의하여 관리합니다.보안이 필요한 비밀번호(Secrets)를 제외한 환경 변수나 설정 데이터를 포함한다.
누가, 언제, 무엇을 변경했는지에 대한 모든 기록이 Git 커밋 메시지로 남는다.
git log를 통해 배포 이력을 확인하므로 별도의 운영 일지가 없어도 완벽한 추적이 가능하다.git revert를 사용하여 이전 상태로 즉시 되돌릴 수 있다.즉, GitOps는 "Git을 이용해 배포한다"가 아니라 Git을 운영 상태의 기준점으로 삼는다는 것이 핵심이다.
기존 CI/CD 환경에서는 보통 CI 서버나 배포 서버가 운영 환경에 직접 배포하는 구조가 많았음.
예:
kubectl apply이 방식도 충분히 동작하지만, 규모가 커질수록 다음 문제가 생기기 쉬움.
GitOps는 이런 문제를 줄이기 위해 등장한 방식이다.
핵심은 운영 환경의 중심을 Git으로 옮기고, 실제 시스템은 Git에 선언된 상태를 맞추도록 동작하게 만드는 것이다.
GitOps를 제대로 이해하려면 몇 가지 핵심 철학을 먼저 정리해야 함.
GitOps는 보통 선언형 방식과 함께 설명됨.
선언형이란 "어떻게 할지"보다 "원하는 상태가 무엇인지"를 정의하는 방식이다.
예를 들어 명령형 방식은 다음 느낌이다.
반면 선언형 방식은 다음 느낌이다.
myapp:1.0.3이어야 한다즉, GitOps는 "작업 절차"보다
원하는 최종 상태(desired state) 를 Git에 적어두고, 시스템이 그 상태를 향해 동기화되도록 하는 방식이다.
GitOps에서 매우 중요한 표현이 Single Source of Truth다.
뜻은, 운영 환경이 어떤 상태여야 하는지에 대한 가장 신뢰할 수 있는 기준이 Git이라는 뜻이다.
즉, 다음 질문에 대한 답이 Git에 있어야 함.
이 구조가 중요한 이유는 다음과 같음.
즉, GitOps는 Git을 단순한 코드 저장소가 아니라 운영 상태 기록과 통제의 중심으로 활용함.
GitOps에서는 실제 시스템 상태와 Git에 적힌 상태가 다를 수 있음.
예를 들면 다음 상황이 가능함.
이때 GitOps 도구는 Git의 원하는 상태와 실제 상태를 비교하고, 차이가 있으면(drift) 다시 맞추려고 시도함.
이 과정을 보통 Reconciliation, 즉 동기화/수렴 과정이라고 볼 수 있음.
즉, GitOps는 한 번 배포하고 끝나는 구조가 아니라 계속해서 원하는 상태를 유지하려는 운영 모델이다.
GitOps를 이해하려면 기존 CD 방식과 비교하는 것이 가장 효과적임.
전통적인 CI/CD에서는 보통 CI 도구가 운영 환경에 직접 변경을 밀어 넣는 구조가 많았음.
예:
개발자 코드 변경
↓
CI 도구 빌드 / 테스트
↓
CI 도구가 운영 환경에 직접 배포
이 구조에서는 배포 도구가 운영 환경에 직접 접속할 수 있어야 함.
예:
즉, 배포의 주체가 CI 서버다.
GitOps에서는 운영 환경 쪽의 에이전트 또는 배포 도구가 Git을 감시하고, 변경이 생기면 그 상태를 가져와 반영함.
예:
개발자 코드 변경
↓
CI 도구 빌드 / 테스트 / 이미지 Push
↓
Git 저장소에 배포 매니페스트 변경 반영
↓
GitOps 도구가 Git 변경 감지
↓
클러스터에 동기화
즉, GitOps에서는 운영 환경이 외부에서 명령을 받기보다
스스로 Git에서 원하는 상태를 가져와 반영하는 구조에 가까움.
Push 방식은 단순하고 익숙하지만, 운영 환경에 대한 직접 접근 권한을 배포 도구가 가져야 한다는 부담이 있음.
반면 Pull 기반 GitOps는 다음 장점이 생김.
즉, GitOps는 단순한 기술 차이보다 운영 통제 방식의 변화라고 보는 것이 더 정확함.
GitOps라고 해서 무조건 애플리케이션 소스코드 저장소를 그대로 쓰는 것은 아님.
보통 GitOps 저장소는 운영 반영에 필요한 선언형 설정을 저장함.
즉, GitOps 저장소는 애플리케이션 코드 저장소와 역할이 다를 수 있음.
이렇게 분리하면 장점이 있음.
즉, GitOps에서는 저장소 설계도 중요한 주제다.
GitOps의 전체 흐름을 단순화하면 보통 다음과 같음.
개발자 코드 변경
↓
CI 실행
├─ Build
├─ Test
└─ Image Push
↓
GitOps 저장소의 이미지 태그 또는 매니페스트 갱신
↓
GitOps 도구가 변경 감지
↓
클러스터에 적용
↓
실제 상태와 Git 상태 동기화 유지
이 흐름에서 중요한 점은 CI와 GitOps의 역할이 분리된다는 것이다.
즉, GitOps는 CI를 대체하는 것이 아니라 CD와 운영 반영 방식을 재구성하는 접근이다.
GitOps가 주목받는 이유는 단순히 "요즘 많이 쓰이기 때문"이 아니라, 운영상 분명한 장점이 있기 때문임.
모든 운영 변경이 Git commit으로 남기 쉬움.
즉, 다음 질문에 대한 답을 찾기가 쉬워짐.
이것은 감사 추적성과 운영 투명성 측면에서 매우 중요함.
Git에 이전 상태가 남아 있으므로, 특정 커밋 상태로 되돌리는 방식이 가능함.
즉, 문제가 발생했을 때 "이전 커밋 기준 상태"로 복원하기가 쉬워짐.
물론 데이터 마이그레이션 같은 요소까지 자동 해결되는 것은 아니지만,
적어도 배포 상태 기준으로는 롤백 논리가 단순해짐.
Git만 보면 원하는 상태를 알 수 있다는 점이 큼.
특히 Kubernetes처럼 선언형 리소스를 많이 쓰는 환경에서는 큰 장점이 됨.
즉, "현재 무엇이 운영돼야 하는가"를 설명할 때 클러스터에 직접 들어가기보다 Git을 보는 구조가 가능해짐.
운영 환경에서 누군가 수동으로 바꿔도 Git과 실제 상태가 달라지면 이를 감지할 수 있음.
도구에 따라 자동으로 원래 상태로 되돌릴 수도 있음.
이 점은 "수동 변경이 누적되면서 운영 환경이 망가지는" 문제를 줄이는 데 유리함.
Push 기반 배포에서는 CI 서버가 운영 환경에 직접 접속해야 하는 경우가 많음.
GitOps는 운영 환경이 Git을 감시하고 가져오는 Pull 기반이므로, 인바운드 접근을 줄이는 구조를 만들기 쉬움.
즉, 배포 권한을 Git 변경 권한과 운영 환경 동기화 권한으로 나눠서 볼 수 있음.
GitOps의 핵심은 Git이 기준이라는 점임.
그런데 운영자가 클러스터에서 직접 수정해버리면 Git과 실제 상태가 어긋남.
이런 상황이 반복되면 GitOps의 장점이 약해짐.
즉, GitOps는 기술 도입만이 아니라 운영 원칙 준수가 매우 중요함.
GitOps는 선언형 상태 관리에는 매우 잘 맞지만,
다음 같은 작업은 별도 고민이 필요할 수 있음.
즉, GitOps는 배포와 상태 관리에 강하지만, 모든 운영 절차를 단순 선언형으로 만들 수 있는 것은 아님.
GitOps를 도입하면 Git 변경이 곧 운영 반영과 연결될 수 있음.
따라서 다음이 중요해짐.
즉, GitOps는 Git만 있으면 자동으로 되는 것이 아니라 저장소 전략과 권한 정책이 함께 설계돼야 함.
GitOps는 빌드와 테스트를 대신하는 것이 아님.
보통 역할은 다음처럼 나뉨.
즉, GitOps는 주로 CD와 운영 반영 측면의 방식이다.
전통적인 CD는 CI 서버가 직접 배포할 수 있음.
반면 GitOps는 Git을 통해 배포 상태를 선언하고, 운영 환경이 그 선언을 따라가게 함.
즉, GitOps는
배포를 없애는 개념이 아니라, 배포 반영의 주체와 경로를 바꾸는 개념이다.
GitOps는 선언형 리소스와 매우 잘 맞기 때문에 Kubernetes와 궁합이 좋음.
이미지 태그를 바꾸는 방식으로 배포 상태를 표현하기 쉬움.
dev, stage, prod를 Git 구조로 명확히 분리해 관리하기 좋음.
누가 어떤 변경을 반영했는지 Git 이력으로 관리하기 좋음.
운영 표준화를 강하게 가져가고 싶을 때 유리함.
명령형 배포에 익숙한 조직은 사고방식 전환이 필요함.
GitOps의 장점이 상대적으로 줄어들 수 있음.
Git 기준 운영 원칙이 지켜지지 않으면 혼란이 커질 수 있음.
GitOps 도입만 하고 권한/리뷰 구조를 안 잡으면 오히려 위험할 수 있음.
핵심은 Git 명령이 아니라, Git을 원하는 상태의 기준점으로 쓰는 것이다.
다른 환경에도 아이디어를 적용할 수 있지만, 실제로는 Kubernetes에서 가장 널리 활용됨.
Argo CD나 Flux 같은 도구가 GitOps를 구현하는 수단이지, GitOps 자체가 특정 제품명은 아님.
운영 정책, 긴급 대응, 승인 절차, 데이터 작업은 별도 고려가 필요함.
GitOps의 기본 구조를 단순화하면 다음과 같음.
Application Source Repository
↓
CI Pipeline
├─ Build
├─ Test
└─ Image Push
↓
GitOps Repository
└─ Deployment Manifest / Image Tag / Config
↓
GitOps Controller
↓
Kubernetes Cluster
이 구조에서 중요한 점은 다음임.
즉, GitOps는 배포 구조를 "명령 실행"에서 "상태 동기화" 중심으로 바꾼다.
이 장에서는 GitOps의 개념과 핵심 철학을 정리했음.
핵심만 다시 정리하면 다음과 같음.