클라우드 인프라

GitOps로 쿠버네티스 클러스터 배포 및 애플리케이션 관리 자동화 마스터하기

강코의 코딩 일기 2026. 4. 20. 08:08
반응형

GitOps를 활용해 쿠버네티스 클러스터 배포부터 애플리케이션 관리까지 완벽하게 자동화하는 방법을 친절하게 설명합니다. 개발과 운영의 생산성을 극대화하는 비법을 알아보세요.

안녕하세요! 복잡한 클라우드 환경에서 헤매고 계신가요? 특히 쿠버네티스(Kubernetes) 클러스터를 운영하고 애플리케이션을 배포하면서 수많은 설정 파일과 명령어 때문에 골머리를 앓고 계신 분들이 많을 텐데요. 혹시 수동 작업으로 인한 실수배포 과정의 불확실성 때문에 불안감을 느껴본 적은 없으신가요? 개발자와 운영자 모두에게 스트레스를 안겨주는 이런 문제들을 해결할 마법 같은 방법이 있다면 어떠실 것 같으세요? 바로 GitOps가 그 해답이 될 수 있답니다!

오늘은 GitOps를 활용해서 쿠버네티스 클러스터 배포부터 애플리케이션 관리까지 완벽하게 자동화하는 방법에 대해 쉽고 친근하게 이야기해보려고 해요. GitOps가 무엇인지부터 어떻게 동작하는지, 그리고 어떤 툴을 사용해서 실전에 적용할 수 있는지까지 꼼꼼히 알려드릴 테니, 앞으로 클라우드 인프라 관리에 자신감을 뿜뿜 키워나가시길 바랍니다!

GitOps, 왜 필요할까요? 개발과 운영의 딜레마

클라우드 환경, 특히 쿠버네티스 같은 컨테이너 오케스트레이션 시스템은 강력한 유연성과 확장성을 제공하죠. 하지만 이 강력함 뒤에는 엄청난 복잡성이 숨어있다는 사실, 다들 공감하실 거예요. 수많은 마이크로서비스, 복잡한 네트워크 설정, 지속적인 배포와 업데이트까지… 이 모든 것을 수동으로 관리한다는 건 거의 불가능에 가깝거든요.

기존의 전통적인 방식은 어땠나요? 개발팀은 열심히 코드를 짜서 배포하면, 운영팀은 서버에 접속해서 수많은 스크립트와 명령어를 실행하며 환경을 구축하고 애플리케이션을 띄웠죠. 이 과정에서 휴먼 에러가 발생하기 쉽고, 개발 환경과 운영 환경의 불일치(Drift) 문제가 자주 발생했어요. "제 로컬에서는 잘 되는데요?"라는 말, 참 익숙하죠? 게다가 문제 발생 시 누가 어떤 변경을 했는지 추적하기도 어렵고요.

여기에 CI/CD(지속적 통합/지속적 배포) 파이프라인을 도입했지만, 여전히 인프라 자체의 변경은 CI/CD 파이프라인의 바깥 영역에 머무는 경우가 많았어요. 애플리케이션 배포는 자동화되었지만, 쿠버네티스 클러스터의 버전 업그레이드나 새로운 노드 추가 같은 인프라 변경은 여전히 수동으로 이루어지거나 별도의 복잡한 스크립트에 의존해야 했거든요. 이런 비효율과 불안정성을 해소하기 위해 등장한 것이 바로 GitOps랍니다. GitOps는 이런 딜레마를 해결하고 개발과 운영의 경계를 허무는 데 결정적인 역할을 해요.

GitOps란 무엇일까요? Git을 중심으로 한 인프라 관리

자, 그럼 GitOps가 정확히 무엇인지 알아볼까요? GitOps는 한마디로 Git을 인프라 및 애플리케이션의 유일한 진실 공급원(Single Source of Truth)으로 삼아, 모든 인프라와 애플리케이션 배포를 관리하는 운영 프레임워크라고 할 수 있어요. 좀 더 쉽게 설명하자면, 우리가 소프트웨어 코드를 Git으로 관리하듯이, 서버 설정, 쿠버네티스 매니페스트, 애플리케이션 배포 설정 등 모든 인프라 관련 설정을 코드처럼 Git 리포지토리에 저장하고 관리하는 방식인 거죠.

핵심은 선언적(Declarative) 인프라라는 개념이에요. 우리가 원하는 최종 상태(Desired State)를 Git에 선언적으로 명시해두면, GitOps 툴이 이 상태와 실제 클러스터의 현재 상태(Actual State)를 지속적으로 비교하고, 만약 불일치하는 부분이 있다면 Git에 선언된 최종 상태로 자동 동기화(Sync)해주는 방식이랍니다. 마치 "이 클러스터는 이렇게 생겨야 해!"라고 Git에 적어두면, 누군가 계속해서 그 모습이 유지되는지 확인하고 맞춰주는 것과 같아요. 참 편리하죠?

이렇게 되면 모든 변경 이력이 Git에 남기 때문에 버전 관리는 물론, 누가 언제 무엇을 변경했는지 감사(Audit)하기가 매우 쉬워져요. 문제가 발생했을 때도 Git의 이전 버전으로 손쉽게 롤백(Rollback)할 수 있고요. 개발팀과 운영팀이 동일한 Git 리포지토리를 바라보면서 협업하게 되니, 소위 데브옵스(DevOps) 문화를 자연스럽게 정착시키는 데도 큰 도움이 된답니다.

GitOps의 핵심 원칙들

GitOps는 몇 가지 중요한 원칙 위에 세워져 있어요. 이 원칙들을 이해하면 GitOps의 가치를 더 명확하게 파악할 수 있을 거예요.

  1. 모든 시스템은 선언적으로 기술되어야 합니다 (Declarative).
    인프라와 애플리케이션의 최종 상태는 YAML이나 JSON 같은 선언적 형식으로 Git에 저장되어야 해요. "어떻게"가 아니라 "무엇"을 원하는지에 집중하는 거죠. 예를 들어, 쿠버네티스 디플로이먼트 파일에 컨테이너 이미지 버전, 리소스 제한 등을 명확히 선언하는 것처럼 말이에요.
  2. 시스템의 최종 상태는 Git에 버전 관리되어야 합니다 (Versioned and Immutable).
    Git은 유일한 진실 공급원이자 모든 변경의 기록이 됩니다. 모든 변경은 Git 커밋으로 기록되고, 이는 변경 불가능한 기록으로 남아요. 특정 시점의 모든 환경 상태를 Git을 통해 정확히 재현할 수 있다는 뜻이죠.
  3. 승인된 변경 사항은 자동으로 적용되어야 합니다 (Pulled Automatically).
    Git 리포지토리에 새로운 변경 사항이 커밋되고 승인되면, 시스템은 이 변경 사항을 감지하고 자동으로 클러스터에 적용해야 합니다. 여기서 중요한 건 'Push' 방식이 아닌 'Pull' 방식이라는 점이에요. 즉, 클러스터 내부의 GitOps 에이전트가 Git 리포지토리의 변경 사항을 주기적으로 감지하고 가져와서 적용하는 방식이죠. 이는 보안과 안정성 측면에서 큰 이점을 제공합니다.
  4. 불일치 발생 시 자동으로 복구되어야 합니다 (Continuously Reconciled).
    GitOps 컨트롤러는 Git에 정의된 최종 상태와 실제 클러스터의 현재 상태를 지속적으로 비교(Reconciliation)하고, 만약 불일치가 발생하면 자동으로 Git에 정의된 상태로 복원시켜야 합니다. 누군가 수동으로 클러스터 설정을 변경했더라도, GitOps는 이를 감지하고 원래 상태로 되돌려놓는 강력한 자가 치유 능력을 가지게 되는 거죠.

이 네 가지 원칙은 GitOps가 왜 그렇게 강력하고 안정적인 배포 및 관리 방식을 제공하는지를 명확히 보여준답니다.

GitOps, 어떻게 동작할까요? 워크플로우와 구성 요소

GitOps의 개념과 원칙을 이해했으니, 이제 실제로 어떻게 동작하는지 워크플로우를 통해 살펴볼까요? GitOps는 크게 두 개의 Git 리포지토리와 하나의 GitOps 컨트롤러(에이전트)로 구성되는 경우가 많아요.

  1. 애플리케이션 코드 리포지토리 (App Repo): 개발자들이 비즈니스 로직을 담은 애플리케이션 코드를 관리하는 곳이에요.
  2. 설정/매니페스트 리포지토리 (Config/Manifest Repo): 쿠버네티스 배포를 위한 YAML 파일들(Deployment, Service, Ingress 등)이나 Helm 차트, Kustomize 설정 등 인프라 및 애플리케이션의 최종 상태를 선언하는 파일들이 저장되는 곳이에요. 이게 바로 GitOps의 핵심인 ‘Desired State’를 담고 있는 리포지토리죠.
  3. GitOps 컨트롤러/에이전트: 쿠버네티스 클러스터 내부에 배포되어 Config Repo를 지속적으로 모니터링하고, Git에 선언된 상태와 클러스터의 실제 상태를 비교하여 동기화하는 역할을 하는 툴이에요. (예: Argo CD, Flux CD)

일반적인 GitOps 워크플로우

일반적인 GitOps 워크플로우는 다음과 같은 단계로 진행된답니다.

  1. 개발자의 코드 변경 및 CI (Continuous Integration):개발자는 App Repo에 애플리케이션 코드를 푸시해요. 이 변경은 CI 파이프라인을 트리거하고, 코드는 빌드, 테스트를 거쳐 컨테이너 이미지로 만들어져 이미지 레지스트리에 푸시되죠. 이때 중요한 건, 이 이미지의 태그가 고유하게 지정되어야 한다는 거예요 (예: my-app:v1.0.0 또는 my-app:git-commit-hash).
  2. CD (Continuous Delivery) to Config Repo:CI 파이프라인의 다음 단계는 Config Repo를 업데이트하는 거예요. 애플리케이션의 새로운 버전이 준비되면, CI 파이프라인은 Config Repo에 있는 쿠버네티스 매니페스트(예: Deployment.yaml)의 이미지 태그를 새로운 버전으로 업데이트하고, 이를 Config Repo에 푸시(커밋)합니다. 이 과정은 PR(Pull Request)을 통해 코드 리뷰를 거친 후 머지(Merge)될 수도 있고요.
  3. # 예시: Config Repo의 deployment.yaml 변경 apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app-container image: my-registry/my-app:v1.0.1 # <-- CI 파이프라인이 이 부분을 업데이트 ports: - containerPort: 80
  4. GitOps 컨트롤러의 동기화 (Synchronization):쿠버네티스 클러스터 내부에 배포된 GitOps 컨트롤러(예: Argo CD)는 Config Repo를 지속적으로 감시해요. 새로운 커밋이 감지되면, 컨트롤러는 Git에 정의된 'Desired State'와 현재 클러스터의 'Actual State'를 비교합니다. 만약 두 상태가 다르다면, 컨트롤러는 클러스터의 리소스들을 Git에 정의된 상태로 자동으로 동기화(Sync)시켜요. 즉, 새로운 버전의 애플리케이션 이미지가 클러스터에 배포되는 거죠.
  5. 클러스터 상태의 수렴 (Convergence):컨트롤러의 동기화 작업이 완료되면, 클러스터는 Config Repo에 정의된 최종 상태로 수렴하게 됩니다. 이 모든 과정은 Git을 중심으로 자동으로 이루어지기 때문에 수동 개입을 최소화하고 일관된 배포를 보장할 수 있어요.

이처럼 GitOps는 Git을 중심으로 개발과 운영의 모든 변경 사항을 관리하고 자동화하여, 더욱 빠르고 안정적인 소프트웨어 딜리버리를 가능하게 한답니다.

주요 GitOps 툴 비교: Argo CD vs Flux

GitOps의 개념을 이해했다면, 이제 실제로 GitOps를 구현할 때 어떤 툴을 사용할 수 있는지 궁금하실 텐데요. 현재 가장 널리 사용되는 두 가지 GitOps 툴은 Argo CDFlux CD입니다. 이 두 툴은 모두 GitOps 원칙을 충실히 따르며 강력한 기능을 제공하지만, 몇 가지 차이점이 있어요. 아래 표를 통해 비교해볼까요?

특징 Argo CD Flux CD
개발 주체 Argoproj (CNCF 프로젝트) Weaveworks (CNCF 프로젝트)
UI/UX 매우 강력하고 직관적인 웹 UI 제공. 클러스터 상태 시각화에 강점. CLI 중심. 웹 UI는 별도 플러그인이나 커뮤니티 툴을 통해 제공.
쿠버네티스 리소스 관리 애플리케이션 단위로 관리. 각 애플리케이션은 특정 Git 리포지토리 경로와 연결. 하나의 Flux 인스턴스가 여러 Git 리포지토리를 모니터링하여 전체 클러스터 상태 관리.
배포 전략 다양한 배포 전략 지원 (롤링 업데이트, 카나리, 블루/그린). Argo Rollouts와 통합. 기본적인 롤링 업데이트 지원. 고급 전략은 Flagger와 같은 별도 툴과 통합.
설정 동기화 방식 명시적 'Application' 리소스 정의를 통해 동기화 대상을 지정. GitRepository, Kustomization 등 여러 CRD를 조합하여 유연하게 동기화.
커밋 훅 (Webhook) 웹훅을 통한 즉각적인 동기화 지원. 웹훅과 더불어 주기적인 폴링(Polling) 방식 지원.
멀티 클러스터 관리 중앙 Argo CD 인스턴스에서 여러 클러스터 관리 용이. 각 클러스터에 Flux 인스턴스를 설치하는 방식이 일반적.

어떤 툴을 선택할지는 팀의 요구사항과 선호도에 따라 달라질 수 있어요. 시각적 관리와 직관적인 UI를 선호한다면 Argo CD가 좋은 선택이 될 수 있고요. CLI 중심의 자동화와 유연한 확장성을 중요하게 생각한다면 Flux CD가 더 적합할 수 있답니다. 두 툴 모두 강력한 기능을 제공하니, 직접 사용해보면서 어떤 툴이 우리 팀에 더 잘 맞을지 탐색해보시는 걸 추천해요!

GitOps 실제 적용 시나리오: 간단한 Nginx 배포 예시

말로만 들으면 좀 어렵게 느껴질 수도 있으니, 간단한 시나리오를 통해 GitOps가 어떻게 동작하는지 실제 예시를 살펴볼까요? 여기서는 Argo CD를 사용하는 예시를 들어볼게요.

1. Config Git 리포지토리 준비

먼저, 쿠버네티스 리소스를 정의할 Git 리포지토리를 준비해야 합니다. 예를 들어, kubernetes-config라는 리포지토리를 만들고 그 안에 Nginx 배포를 위한 YAML 파일을 넣는 거죠.


# kubernetes-config/nginx/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.23.4  # 초기 Nginx 이미지 버전
        ports:
        - containerPort: 80
---
# kubernetes-config/nginx/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
            

이 파일들을 kubernetes-config 리포지토리에 커밋하고 푸시합니다.

2. Argo CD 설치 및 애플리케이션 등록

쿠버네티스 클러스터에 Argo CD를 설치하고, 위에서 만든 kubernetes-config 리포지토리를 Argo CD에 애플리케이션으로 등록합니다.


# Argo CD CLI를 사용하여 애플리케이션 등록
argocd app create nginx-app \
  --repo https://github.com/your-org/kubernetes-config.git \
  --path nginx \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default \
  --sync-policy automated
            

여기서 --sync-policy automated는 Git 리포지토리의 변경 사항이 감지되면 Argo CD가 자동으로 클러스터에 동기화하도록 설정하는 거예요. 이제 Argo CD는 kubernetes-config 리포지토리의 nginx 경로를 지속적으로 모니터링하기 시작합니다.

3. 애플리케이션 버전 업데이트 (Git 변경)

이제 Nginx 버전을 1.23.4에서 1.24.0으로 업데이트하고 싶다고 해볼까요? 개발자나 CI 파이프라인이 kubernetes-config/nginx/deployment.yaml 파일을 수정하고 Git에 커밋합니다.


# kubernetes-config/nginx/deployment.yaml (변경 후)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0  # <-- 이미지 버전 업데이트
        ports:
        - containerPort: 80
            

이 변경 사항이 Git 리포지토리에 푸시되면, Argo CD는 이를 감지하고 자동으로 클러스터에 Nginx 1.24.0 버전으로 롤링 업데이트를 시작합니다. 여러분은 kubectl apply 명령어를 직접 실행할 필요 없이, 그저 Git에 변경 사항을 커밋하는 것만으로 배포가 완료되는 거죠. 정말 편리하죠?

4. 클러스터 상태 불일치 복구

만약 누군가 실수로 kubectl scale deployment nginx-deployment --replicas=1 명령어를 실행하여 Nginx 파드 개수를 1개로 줄였다고 가정해볼게요. Git에는 replicas: 2로 정의되어 있는데, 실제 클러스터는 1개로 변경된 거죠. Argo CD는 이 불일치(Drift)를 감지하고, 자동으로 Nginx 파드 개수를 Git에 정의된 2개로 복구시켜줍니다. 즉, 클러스터의 자가 치유(Self-healing) 능력이 생긴 셈이랍니다.

이처럼 GitOps는 Git을 통한 단순한 배포를 넘어, 인프라의 최종 상태를 보장하고 운영의 안정성을 극대화하는 강력한 방법이에요.

GitOps 도입 시 고려사항 및 성공 전략

GitOps는 분명 매력적인 솔루션이지만, 성공적인 도입을 위해서는 몇 가지 고려해야 할 점들이 있어요.

1. Git 리포지토리 구조 설계

Git 리포지토리를 어떻게 구성할지는 GitOps 성공에 매우 중요해요. 일반적으로 다음과 같은 접근 방식들을 고려해볼 수 있습니다.

  • 단일 리포지토리 (Monorepo): 모든 환경(개발, 스테이징, 프로덕션)과 모든 애플리케이션의 쿠버네티스 매니페스트를 하나의 Git 리포지토리에 관리하는 방식이에요. 관리의 일관성이 높지만, 리포지토리가 매우 커질 수 있습니다.
  • 다중 리포지토리 (Polyrepo): 환경별, 또는 애플리케이션별로 별도의 Git 리포지토리를 사용하는 방식이에요. 독립적인 관리가 가능하지만, 전체적인 일관성을 유지하기 위한 노력이 필요할 수 있어요.
  • 계층적 구조 (Hierarchical Structure): Kustomize나 Helm의 값 파일(values.yaml) 등을 활용하여 기본 설정 위에 환경별 오버레이(Overlay)를 적용하는 방식이 효과적이에요. 예를 들어, base 폴더에 공통 설정을 두고, overlays/dev, overlays/prod 폴더에 환경별 차이점을 정의하는 거죠.

팀의 규모, 애플리케이션의 복잡성, 보안 요구사항 등을 고려하여 가장 적합한 구조를 선택하는 것이 중요하답니다.

2. 보안 강화

GitOps는 Git을 중심으로 모든 것이 돌아가기 때문에 Git 리포지토리의 보안이 매우 중요해요. 다음 사항들을 꼭 지켜주세요.

  • Git 리포지토리 접근 제어: 최소 권한 원칙을 적용하여 필요한 사람만 접근할 수 있도록 하고, 2단계 인증(2FA)을 활성화해야 합니다.
  • 시크릿 관리: 데이터베이스 비밀번호 같은 민감한 정보는 Git 리포지토리에 평문으로 저장해서는 절대 안 돼요! HashiCorp Vault, Sealed Secrets, AWS Secrets Manager 같은 시크릿 관리 툴과 연동하여 안전하게 관리해야 합니다. Git 리포토리에는 시크릿 자체 대신, 시크릿을 참조하는 방법만 정의하는 거죠.
  • 변경 승인 워크플로우: Git의 PR(Pull Request) 기능을 활용하여 모든 변경 사항은 반드시 코드 리뷰와 승인을 거치도록 강제하는 것이 좋습니다.

3. 점진적 도입

기존에 수동으로 관리하던 시스템을 한 번에 GitOps로 전환하는 것은 쉽지 않을 수 있어요. 처음에는 중요도가 낮은 애플리케이션이나 개발 환경부터 GitOps를 적용해보면서 경험을 쌓고, 점진적으로 확대해나가는 단계적 접근 방식이 효과적이에요. 작은 성공을 경험하면서 팀의 적응을 돕는 거죠.

4. 모니터링 및 로깅

GitOps 툴이 잘 작동하고 있는지, 클러스터와 Git 리포지토리 간에 불일치는 없는지 등을 지속적으로 모니터링해야 해요. GitOps 툴이 제공하는 대시보드나 로그를 통해 시스템의 상태를 파악하고, 문제가 발생했을 때 빠르게 대응할 수 있도록 준비하는 것이 중요하답니다.

마무리하며: GitOps로 얻는 생산성과 안정성

오늘 우리는 GitOps가 무엇인지부터 왜 필요한지, 어떻게 동작하는지, 그리고 실제 적용 시 고려해야 할 사항들까지 자세히 살펴보았습니다. GitOps는 단순히 배포를 자동화하는 것을 넘어, 인프라와 애플리케이션의 일관성, 안정성, 가시성을 비약적으로 향상시키는 강력한 방법론이에요. Git을 통해 모든 변경 이력을 관리하고, 원하는 최종 상태를 선언적으로 유지함으로써 수동 작업으로 인한 실수를 줄이고, 문제 발생 시 빠른 복구를 가능하게 하죠.

처음에는 새로운 개념과 툴에 익숙해지는 과정이 필요할 수 있지만, 한 번 GitOps를 구축하고 나면 개발팀은 더욱 빠르게 기능을 배포하고, 운영팀은 안정적인 인프라를 유지하며 생산성을 극대화할 수 있을 거예요. 복잡한 클라우드 환경에서 헤매지 않고, 여러분의 소중한 시간을 더 가치 있는 일에 집중할 수 있도록 도와주는 GitOps, 이제 여러분의 클라우드 인프라 전략에 꼭 포함시켜보시는 건 어떠세요?

GitOps에 대해 더 궁금한 점이 있으시거나, 본인의 경험을 공유하고 싶으시다면 언제든지 댓글을 남겨주세요. 함께 고민하고 발전해나가는 기회가 되었으면 좋겠습니다! 다음에도 유익한 정보로 찾아올게요!

📌 함께 읽으면 좋은 글

  • [개발 도구] API 개발 및 테스트 도구 활용 전략: Postman, Insomnia, curl 심층 비교
  • [클라우드 인프라] 쿠버네티스 클러스터 오토스케일링 전략: HPA, VPA, CA를 활용한 리소스 효율화
  • [AI 머신러닝] RAG 기반 LLM 애플리케이션 구축: 데이터 검색 및 응답 품질 향상 전략

이 글이 도움이 되셨다면 공감(♥)댓글로 응원해 주세요!
궁금한 점이나 다루었으면 하는 주제가 있다면 댓글로 남겨주세요.

반응형