GitOps
GitOps는 소프트웨어 개발 및 운영 방식에서 CMS(Code Management System)으로 사용되는 Git을 중심으로 인프라와 애플리케이션을 관리하는 방법론입니다. GitOps는 코드로 인프라를 정의하고 관리하는 **Infrastructure as Code (IaC)**의 한 형태이기도 합니다. Kubenetes를 사용하는 환경에서는 배포할 때에도 Git에 저장된 Manifest로 클러스터에 배포하는 일련의 과정들을 의미합니다.

GitOps의 4가지 원칙
GitOps의 4가지 원칙은 인프라와 애플리케이션의 배포와 관리를 보다 Git과 동일한 형상으로 맞춤으로서 일관되고 안전하게 하기 위한 원칙들입니다.
1. Git은 단일 소스(Source of Truth)
인프라와 애플리케이션의 전체 상태는 Git에 정의되어야 합니다. 모든 설정, 구성, 인프라 리소스는 Git에 저장되어 관리되고, Git에 반영된 변경 사항만 시스템에 적용됩니다.
2. 자동화된 승인 및 배포 파이프라인
Git에 반영된 변경 사항은 자동화된 프로세스에 의해 운영 환경에 반영됩니다. 이를 통해 코드나 설정이 Git에 커밋되면, 자동으로 이를 감지하고 배포 파이프라인을 통해 시스템이 업데이트됩니다.
CI/CD 파이프라인, Kubernetes의 컨트롤러 등 자동화 도구들이 이 과정을 지원하며, 이를 통해 인프라 관리에서 사람의 개입이 최소화됩니다.
3. 선언적 정의 (Declarative)
시스템의 원하는 최종 상태는 선언적으로 정의되어야 합니다. 즉, "무엇"을 원하는지에 대해 명확히 기술하고, 자동화된 도구가 이를 달성하기 위한 "방법"을 결정하고 수행합니다.
4. 주기적인 상태 동기화 및 자가 복구 (Self-Healing)
시스템은 주기적으로 현재 상태와 Git에 저장된 상태(의도된 상태)를 비교하고, 차이가 발생하면 자동으로 이를 조정하여 일치시킵니다. 이를 통해 시스템은 스스로 복구(Self-Healing) 기능을 갖추게 됩니다.
GitOps의 장점
위의 4가지 원칙을 지킴으로서 GitOps는 아래와 같은 장점을 가지게 됩니다.
일관성: 모든 환경(개발, 테스트, 프로덕션)이 동일한 설정을 공유하므로, 배포 및 인프라 관리에서 일관성을 유지할 수 있습니다.
신뢰성: 인프라와 애플리케이션 변경 사항을 Git으로 관리하여 정확한 버전 관리를 수행할 수 있습니다. Git을 통한 관리를 함으로써 롤백 등의 운용도 Git을 통해 관리하므로 재현성이 있는 오퍼레이션이 가능합니다.
자동화: 변경 사항이 자동으로 배포되므로 수동 작업을 줄이고, 실수를 줄일 수 있습니다.
투명성: 모든 변경 사항이 Git에 기록되므로 감사 및 추적이 용이합니다.
GitOps의 방식(Push vs Pull)
GitOps의 방식으로는 크게 Push Based와 Pull Based로 구분할 수 있습니다.
Push Based
Push 기반의 GitOps는 Application 소스코드가 변경이 되면 빌드를 하게 되고, 빌드가 된 이후 배포되는 매니페스트를 업데이트하게 됩니다. 이 때 Environment Repository의 변경 사항을 반영하기 위해 배포 파이프라인이 트리거가 됩니다. 이렇게 구성하게 되면 배포 파이프라인을 돌리기 위해 배포 파이프라인에서 사용하는 역할을 큰 권한을 갖게 됩니다. 따라서 제한적으로 배포를 하기 위해서는 권한 분리를 철저히 해야합니다. 이 경우에는 수동으로 배포된 환경을 수정하더라도, Environment Repository와 Sync를 하지 않기 때문에 자동으로 수정되지 않습니다.

Pull Based Pull 기반의 GitOps는 Application 소스코드가 변경되면 빌드를 하게 되고, 빌드가 된 이후 배포되는 매니페스트를 업데이트하게 됩니다. 이 때 오퍼레이터가 주기적으로 Environment Repository의 매니페스트와 실제 배포된 매니페스트를 지속적으로 비교하면서 형상을 맞춥니다. 이 방법은 Push 기반의 GitOps에서 Environment Repository가 변경될 때마다 배포되는 방식의 문제점을 해결할 수 있습니다. 지속적으로 Environment Repository을 관찰하고 있기 때문에 수동으로 배포된 매니페스트를 수정하더라도 Git과 Sync를 통해서 자동으로 형상을 맞춥니다.

GitOps Tools
GitOps를 구현하는데는 다양한 Tools들이 있습니다. 그 중 대표적으로 사용되는 Tools로는 ArgoCD, FluxCD, JenkinsX가 있습니다.
ArgoCD 알기 쉬운 GUI를 제공해주고, GUI에서 Log를 확인하거나 Manifest를 수정하는 등의 작업을 할 수 있습니다. Multi Cluster로 구성하는 경우에는 각 Cluster에 배포된 Appilcation에 대한 RBAC을 제공합니다.

FluxCD ArgoCD와 동일한 역할을 하지만 기본적으로 제공되는 GUI가 없으며, 자동 동기화를 기본으로 제공합니다.
참고자료 : https://fluxcd.io/flux/

JenkinsX 위 두가지 툴은 CD만 가능합니다. JenkinsX는 Jenkins에서 Cloud Native를 지원하기 위해 만들어졌습니다. 이를 통해 CI부터 CD까지 지원하는 Flow를 구성할 수 있습니다.

Last updated