클라우드 인프라

GitOps로 쿠버네티스 배포 자동화: Argo CD 실전 활용 가이드

강코의 코딩 일기 2026. 5. 1. 21:28
반응형

쿠버네티스 애플리케이션 배포와 관리가 복잡하게 느껴지시나요? GitOps 원칙을 적용하고 Argo CD를 활용하여 CI/CD 파이프라인을 자동화하는 실전 가이드를 만나보세요.

안녕하세요! 복잡한 쿠버네티스 환경에서 애플리케이션 배포와 관리를 더 쉽고 안정적으로 하고 싶으신가요? 매번 수동으로 명령어를 입력하고, 예상치 못한 설정 불일치 때문에 밤샘 작업을 해본 경험이 있다면 오늘 이 글이 큰 도움이 될 거예요. 바로 GitOpsArgo CD를 활용한 쿠버네티스 배포 자동화 이야기인데요!

쿠버네티스는 강력한 컨테이너 오케스트레이션 도구지만, 그만큼 관리해야 할 것도 많아지죠. 특히 여러 환경에 배포하거나, 팀원들과 협업할 때 혼란이 생기기 쉽습니다. 이러한 문제들을 해결해 줄 마법 같은 솔루션이 바로 GitOps인데요, 오늘은 이 GitOps의 핵심 개념부터, 강력한 GitOps 도구인 Argo CD를 어떻게 실전에 활용할 수 있는지 자세히 파헤쳐 볼 거예요. 자, 그럼 함께 떠나볼까요?


📑 목차

GitOps, 왜 필요할까요? 복잡한 배포의 해결사

쿠버네티스 환경에서 애플리케이션을 배포하고 관리하다 보면 여러 가지 어려움에 직면하게 됩니다. 예를 들어, 개발 환경과 운영 환경의 설정이 미묘하게 달라서 버그가 발생하거나, 수많은 YAML 파일을 일일이 관리하다가 휴먼 에러가 생기기도 하죠. 게다가 누가 언제 어떤 변경을 했는지 추적하기 어렵다는 문제도 있습니다.

이런 문제들의 근본적인 원인은 ‘상태 불일치’‘수동 작업’에 있다고 볼 수 있어요. 우리가 원하는 시스템의 최종 상태(Desired State)와 실제 시스템의 현재 상태(Actual State)가 다를 때 문제가 생기기 마련인데요. GitOps는 바로 이 지점에서 빛을 발합니다. GitOps는 한마디로 'Git 저장소를 통해 인프라와 애플리케이션의 최종 상태를 선언적으로 관리하고, 이를 자동으로 동기화하는 운영 방식'이라고 할 수 있어요. Git이 마치 '진실의 원천(Single Source of Truth)'이 되는 거죠.

전통적인 CI/CD 파이프라인에서는 코드를 빌드하고 이미지를 만든 다음, 배포 도구가 쿠버네티스 클러스터에 직접 명령을 '밀어넣는(Push)' 방식이 많았습니다. 하지만 GitOps는 반대예요. 쿠버네티스 클러스터 내부의 에이전트가 Git 저장소를 주기적으로 '끌어와서(Pull)' 현재 상태와 Git에 정의된 최종 상태를 비교하고, 차이가 발생하면 자동으로 동기화하는 방식이거든요. 이 '풀(Pull)' 방식은 보안 측면에서도 더 유리하고, 클러스터의 상태를 항상 Git과 일치하게 유지시켜 줍니다. 마치 자율주행 자동차가 목적지를 향해 스스로 움직이는 것과 비슷하다고 생각하시면 돼요.


GitOps 핵심 원칙 파헤치기

GitOps는 몇 가지 핵심 원칙을 기반으로 하고 있어요. 이 원칙들을 이해하면 GitOps가 왜 그렇게 강력한지 명확하게 알 수 있답니다.

1. 선언적(Declarative) 상태 관리

모든 시스템의 상태는 Git 저장소에 선언적으로 기술되어야 합니다. 즉, "어떻게(How)" 작업을 수행할지보다는 "무엇(What)"을 만들고 싶은지에 집중하는 거죠. 예를 들어, "웹 서버를 3개 띄우고 싶다"라고 선언하면, 시스템은 이 선언된 상태를 유지하기 위해 스스로 노력합니다. 쿠버네티스의 YAML 파일이 대표적인 선언적 설정 파일이죠.

2. Git이 진실의 원천(Single Source of Truth)

Git 저장소는 시스템의 유일하고 권위 있는 진실의 원천이 됩니다. 인프라 코드(IaC), 애플리케이션 매니페스트, 설정 파일 등 모든 것이 Git에 저장되어 버전 관리되고 추적 가능해야 해요. 모든 변경은 Git을 통해서만 이루어져야 하므로, 누가 언제 무엇을 변경했는지 명확하게 알 수 있고, 필요하다면 쉽게 롤백할 수도 있습니다.

3. 풀(Pull) 기반의 자동화

시스템의 변경 사항은 Git 저장소에서 클러스터로 '풀(Pull)' 방식으로 동기화되어야 합니다. 앞서 설명했듯이, 클러스터 내부의 에이전트(예: Argo CD)가 Git 저장소를 모니터링하고, 변경 사항이 감지되면 스스로 클러스터의 상태를 Git에 정의된 상태와 일치시킵니다. 이는 푸시 기반 방식보다 보안성이 높고, 클러스터의 자율성을 강화하죠.

4. 지속적인 동기화(Continuous Reconciliation)

클러스터의 실제 상태는 Git에 정의된 선언적 상태와 지속적으로 비교되고 동기화되어야 합니다. 만약 어떤 이유로 실제 클러스터의 상태가 Git에 정의된 상태와 달라진다면(이를 "상태 불일치(Drift)"라고 합니다), GitOps 에이전트가 자동으로 이를 감지하고 Git의 상태로 되돌려놓습니다. 이는 시스템의 안정성과 일관성을 보장하는 핵심 원칙이에요.

이러한 원칙들 덕분에 GitOps는 다음과 같은 장점들을 제공합니다.

  • 생산성 향상: 수동 작업을 줄이고 배포 시간을 단축합니다.
  • 안정성 강화: 사람이 저지르는 실수를 줄이고, 일관된 배포를 가능하게 합니다.
  • 가시성 및 감사 용이: 모든 변경 이력이 Git에 남아 누가 무엇을 언제 변경했는지 쉽게 추적할 수 있습니다.
  • 보안성 향상: 클러스터 외부에서 클러스터로 직접 접근하는 것을 최소화하여 보안 위협을 줄입니다.
  • 쉬운 롤백: 문제가 발생하면 Git 커밋을 되돌리는 것만으로 쉽게 이전 상태로 복구할 수 있습니다.

Argo CD, GitOps의 강력한 동반자

GitOps의 원칙을 실현하기 위한 다양한 도구들이 있지만, 그중에서도 Argo CD는 쿠버네티스 환경에서 가장 널리 사용되고 강력한 도구 중 하나입니다. Argo CD는 CNCF(Cloud Native Computing Foundation) 프로젝트로, 선언적인 GitOps 기반의 지속적인 배포(Continuous Delivery) 도구예요. 이제 Argo CD가 어떤 특징을 가지고 있는지 알아볼까요?

Argo CD의 주요 특징

  • 자동화된 동기화: Git 저장소의 변경 사항을 감지하여 쿠버네티스 클러스터에 자동으로 배포하고 동기화합니다.
  • 선언적 UI: 웹 UI를 통해 배포된 애플리케이션의 상태, Git과의 동기화 상태, 리소스 현황 등을 시각적으로 쉽게 확인할 수 있습니다.
  • 상태 불일치(Drift) 감지 및 복구: 클러스터의 실제 상태가 Git에 정의된 상태와 다를 경우 이를 감지하고 사용자에게 알리거나, 자동으로 복구할 수 있습니다.
  • 다양한 매니페스트 지원: Kustomize, Helm, Jsonnet 등 다양한 쿠버네티스 매니페스트 도구를 지원하여 유연한 배포가 가능합니다.
  • 롤백 기능: Git 커밋을 통해 쉽게 이전 버전으로 롤백할 수 있습니다.
  • SSO(Single Sign-On) 지원: LDAP, OAuth2, SAML 등 다양한 인증 방식을 지원합니다.
  • CLI 지원: 강력한 커맨드라인 인터페이스를 제공하여 스크립트 기반의 자동화도 용이합니다.

Argo CD는 쿠버네티스 컨트롤러 형태로 클러스터 내부에 설치되며, Git 저장소를 지속적으로 모니터링하는 역할을 합니다. GitOps의 '풀(Pull)' 기반 모델을 완벽하게 구현하는 도구라고 할 수 있죠.


Argo CD 설치부터 첫 애플리케이션 배포까지 (실전 예제)

자, 이제 이론은 충분히 살펴보았으니, 직접 Argo CD를 설치하고 간단한 애플리케이션을 배포해보면서 GitOps의 위력을 경험해 볼 시간입니다. 여기서는 Minikube나 Kind와 같은 로컬 쿠버네티스 환경이 준비되어 있다고 가정하고 진행할게요. (아직 쿠버네티스 클러스터가 없다면, Minikube나 Kind를 먼저 설치해주세요!)

1. Argo CD 설치

먼저, Argo CD를 쿠버네티스 클러스터에 설치해야 합니다. Argo CD는 별도의 네임스페이스에 설치되는 것이 일반적입니다.


kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

설치가 완료되면, Argo CD 서버가 실행되는 것을 확인할 수 있습니다. Pod들이 모두 `Running` 상태가 될 때까지 잠시 기다려주세요.


kubectl get pods -n argocd

2. Argo CD CLI 설치

Argo CD를 더 편리하게 사용하기 위해 CLI 도구를 설치합니다. (운영체제에 따라 설치 방법이 다를 수 있습니다. 여기서는 Linux/macOS 예시입니다.)


# Linux
curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
chmod +x /usr/local/bin/argocd

# macOS
brew install argocd

3. Argo CD UI 접속 및 초기 비밀번호 설정

Argo CD 웹 UI에 접속하려면 `argocd-server` 서비스를 외부에 노출해야 합니다. 간단하게 포트 포워딩을 이용해 접속해봅시다.


kubectl port-forward svc/argocd-server -n argocd 8080:443

이제 웹 브라우저에서 `https://localhost:8080`으로 접속할 수 있습니다. 처음 로그인할 때는 `admin` 사용자 이름과 초기 비밀번호가 필요해요. 초기 비밀번호는 `argocd-initial-admin-secret` 시크릿에서 가져올 수 있습니다.


kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d

이 비밀번호로 로그인한 후, 나중에 웹 UI나 CLI를 통해 비밀번호를 변경하는 것이 좋습니다.


argocd login localhost:8080
argocd account update-password

4. 첫 애플리케이션 배포하기

이제 GitOps의 핵심, Git 저장소를 통해 애플리케이션을 배포해봅시다. 간단한 Nginx 배포를 위한 YAML 파일을 Git 저장소에 준비했다고 가정할게요. (예: `https://github.com/YOUR_USERNAME/argocd-demo.git` 에 `manifests/nginx.yaml` 파일이 있다고 가정합니다.)


# manifests/nginx.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.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer # 또는 ClusterIP

Argo CD에 이 Git 저장소와 YAML 파일을 바라보도록 애플리케이션을 생성합니다.


argocd app create guestbook \
  --repo https://github.com/YOUR_USERNAME/argocd-demo.git \
  --path manifests \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default

여기서 중요한 점은 `repo`와 `path` 인자인데요, Argo CD가 모니터링할 Git 저장소와 그 안에서 쿠버네티스 매니페스트 파일들이 위치한 경로를 지정하는 것입니다. `dest-server`는 배포할 쿠버네티스 클러스터의 API 서버 주소를 의미하며, 보통 `https://kubernetes.default.svc`로 지정하면 됩니다. `dest-namespace`는 애플리케이션이 배포될 네임스페이스를 지정합니다.

애플리케이션을 생성한 후, Argo CD UI나 CLI에서 상태를 확인해보세요.


argocd app get guestbook

초기에는 `OutOfSync` 상태일 수 있습니다. Git에 정의된 상태와 실제 클러스터 상태가 다르기 때문인데요. 이제 `sync` 명령어로 동기화를 시작해봅시다!


argocd app sync guestbook

동기화가 완료되면, Nginx 디플로이먼트와 서비스가 쿠버네티스 클러스터에 배포되었을 거예요. UI에서도 모든 리소스가 `Synced` 상태로 초록색으로 표시되는 것을 확인할 수 있습니다. 이제 GitOps 기반의 첫 애플리케이션 배포를 성공적으로 마친 것입니다!


Argo CD로 더 스마트하게 관리하기: 자동화와 고급 기능

단순 배포를 넘어 Argo CD는 애플리케이션을 더욱 스마트하게 관리할 수 있는 다양한 기능을 제공합니다. 이러한 기능들을 활용하면 운영 효율성을 크게 높일 수 있습니다.

1. 자동 동기화(Auto-Sync) 및 동기화 옵션

Argo CD는 기본적으로 수동 동기화를 하지만, 자동 동기화(Auto-Sync) 기능을 활성화할 수 있습니다. 이 기능을 켜면 Git 저장소에 변경 사항이 커밋될 때마다 Argo CD가 자동으로 감지하여 클러스터에 배포하게 됩니다. 자동 동기화에는 몇 가지 옵션이 있어요.

  • Automatic Sync Policy: 애플리케이션 생성 시 `--sync-policy automated` 옵션을 주거나, UI에서 설정할 수 있습니다.
  • Prune: Git에서 삭제된 리소스를 클러스터에서도 자동으로 삭제할지 여부를 결정합니다. (`--sync-option Prune=true`)
  • SelfHeal: 클러스터의 실제 상태가 Git의 선언된 상태와 다를 때, 자동으로 Git의 상태로 복구할지 여부를 결정합니다. 즉, 상태 불일치(Drift)를 자동으로 치료하는 거죠. (`--sync-option SelfHeal=true`)

예를 들어, `SelfHeal` 옵션을 켜두면, 누군가 수동으로 배포된 Pod의 개수를 변경하더라도 Argo CD가 이를 감지하고 Git에 정의된 개수로 다시 되돌려 놓습니다. 이는 클러스터의 안정성과 일관성을 유지하는 데 매우 중요합니다.

2. 롤백(Rollback) 기능

배포된 애플리케이션에 문제가 발생했을 때, Argo CD를 사용하면 매우 쉽게 이전 버전으로 롤백할 수 있습니다. Argo CD는 Git 커밋을 기반으로 작동하기 때문에, 단순히 Git 저장소에서 이전 커밋으로 되돌리는 것만으로도 롤백이 가능합니다. Argo CD UI에서도 특정 Git 커밋을 선택하여 롤백하는 기능을 제공합니다. 이는 장애 발생 시 빠른 복구(MTTR, Mean Time To Recovery)에 크게 기여합니다.

3. Health Check 및 리소스 상태 시각화

Argo CD는 배포된 쿠버네티스 리소스들의 헬스 상태(Health Status)를 자동으로 감지하고 시각적으로 표시해줍니다. Pod, Deployment, Service 등 각 리소스의 상태를 UI에서 한눈에 파악할 수 있어요. 예를 들어, Pod가 CrashLoopBackOff 상태이거나 Deployment가 스케일링되지 못하고 있다면, Argo CD UI에서 해당 리소스가 빨간색으로 표시되어 문제 상황을 즉시 인지할 수 있도록 도와줍니다. 이는 문제 해결 시간을 단축하는 데 매우 효과적입니다.

4. 멀티 클러스터 관리 및 RBAC

여러 개의 쿠버네티스 클러스터를 운영하는 경우, Argo CD는 단일 인터페이스에서 모든 클러스터에 애플리케이션을 배포하고 관리할 수 있도록 지원합니다. 또한, RBAC(Role-Based Access Control) 기능을 통해 누가 어떤 애플리케이션에 대해 어떤 작업을 수행할 수 있는지 세밀하게 권한을 제어할 수 있어, 대규모 팀 환경에서도 안전하게 GitOps를 적용할 수 있습니다.

이러한 고급 기능들은 Argo CD가 단순한 배포 도구를 넘어, 쿠버네티스 환경의 통합적인 애플리케이션 관리 플랫폼으로서의 역할을 수행할 수 있도록 해줍니다.


GitOps + Argo CD, 실제 시나리오에서는?

GitOps와 Argo CD가 실제 운영 환경에서 어떻게 활용될 수 있는지 몇 가지 시나리오를 통해 살펴볼까요?

1. 개발, 스테이징, 운영 환경 배포 자동화

대부분의 서비스는 개발, 스테이징, 운영 등 여러 환경을 가지고 있습니다. 각 환경마다 쿠버네티스 클러스터가 다를 수 있고, 배포 설정(예: 리소스 요청량, 복제본 수)도 달라지죠. GitOps와 Argo CD는 이런 멀티 환경 배포를 아주 우아하게 처리할 수 있습니다.

  • 각 환경별로 별도의 Git 브랜치(예: `dev`, `staging`, `main`)를 사용하거나, Git 저장소 내에 `environments/dev`, `environments/prod`와 같은 디렉토리 구조를 만들 수 있습니다.
  • KustomizeHelm과 같은 도구를 사용하여 환경별로 다른 설정을 오버라이드할 수 있습니다. 예를 들어, 개발 환경에서는 1개의 복제본을, 운영 환경에서는 5개의 복제본을 배포하도록 Git에 선언하는 거죠.
  • Argo CD는 각 환경별 Git 경로를 모니터링하여 해당 환경의 클러스터에 자동으로 배포합니다. 이렇게 하면 환경 간의 일관성을 유지하면서도 환경별 특성을 반영한 배포가 가능해집니다.

2. Blue/Green, Canary 배포 전략 구현

무중단 배포를 위한 Blue/Green이나 Canary 배포 전략은 복잡하게 느껴질 수 있지만, GitOps와 Argo CD를 활용하면 훨씬 간단해집니다. Argo CD는 자체적으로 이런 전략들을 직접 지원하기보다는, Argo Rollouts와 같은 보완적인 도구와 함께 사용될 때 시너지를 발휘합니다.

  • Git에 새로운 버전의 애플리케이션 매니페스트를 커밋하고, Argo CD가 이를 감지하여 배포를 시작합니다.
  • Blue/Green 배포의 경우, 새로운 버전(Green)을 배포한 후 트래픽을 일괄적으로 전환하는 방식입니다. Git에서 Service Selector를 변경하는 커밋만으로 트래픽 전환이 가능합니다.
  • Canary 배포의 경우, 소수의 사용자에게만 새로운 버전(Canary)을 노출하고 점진적으로 트래픽을 늘려가는 방식입니다. Git에 Canary Deployment와 Service를 정의하고, 점진적인 트래픽 증가는 Argo Rollouts와 같은 도구의 CRD(Custom Resource Definition)를 통해 제어할 수 있습니다.

이러한 고급 배포 전략들을 Git을 통해 선언적으로 관리할 수 있다는 점이 GitOps의 큰 강점 중 하나입니다.

3. 전통적인 CI/CD와 GitOps의 비교

GitOps는 기존의 CI/CD 파이프라인과 어떻게 다를까요? 다음 표를 통해 핵심적인 차이점을 비교해볼 수 있습니다.

특징 전통적인 푸시(Push) 기반 CI/CD GitOps (풀(Pull) 기반)
배포 주체 외부 CI/CD 도구 (Jenkins, GitLab CI 등) 클러스터 내부의 GitOps 에이전트 (Argo CD)
배포 방식 빌드 후 클러스터에 직접 명령을 '푸시' 클러스터가 Git 저장소를 '풀'하여 동기화
진실의 원천 CI/CD 스크립트, 클러스터 상태 Git 저장소 (유일한 진실의 원천)
보안 외부 도구에 클러스터 접근 권한 필요 (높은 권한) 클러스터 내부에서 Git 접근 (읽기 권한만 필요)
상태 불일치 관리 수동 관리 또는 외부 모니터링 필요 자동 감지 및 복구 (Self-Healing)
감사/추적 CI/CD 로그, 클러스터 이벤트 로그 Git 커밋 이력 (명확하고 상세함)

GitOps는 기존 CI/CD의 장점을 가져오면서도, 특히 운영 환경의 안정성과 보안성, 그리고 관리 용이성을 획기적으로 개선하는 데 초점을 맞추고 있습니다. 마치 개발자가 코드를 통해 애플리케이션을 관리하듯이, 운영 환경 자체를 코드로 관리하는 방식이라고 할 수 있죠.


마무리하며: GitOps와 Argo CD, 미래를 위한 선택

오늘 우리는 GitOps의 기본 개념부터 핵심 원칙, 그리고 강력한 GitOps 도구인 Argo CD를 활용하여 쿠버네티스 애플리케이션을 배포하고 관리하는 방법에 대해 자세히 살펴보았습니다.

쿠버네티스 환경이 점점 더 복잡해지고, 빠른 배포와 안정적인 운영이 중요해지는 시대에 GitOps는 선택이 아닌 필수가 되어가고 있다고 해도 과언이 아닙니다. Git을 '진실의 원천'으로 삼아 모든 인프라와 애플리케이션의 상태를 선언적으로 관리하고, Argo CD와 같은 도구를 통해 이를 자동으로 동기화하는 방식은 개발팀과 운영팀의 협업을 강화하고, 전체적인 소프트웨어 배포 라이프사이클의 효율성과 안정성을 극대화할 수 있는 강력한 방법이거든요.

처음에는 GitOps의 개념이나 Argo CD의 설정이 다소 어렵게 느껴질 수도 있지만, 한 번 익숙해지고 나면 이전에는 상상하기 어려웠던 편리함과 안정성을 경험하게 될 거예요. 여러분의 쿠버네티스 운영 환경을 한 단계 업그레이드하고 싶다면, 지금 바로 GitOps와 Argo CD를 도입해보는 것을 강력히 추천합니다!

이 글이 GitOps와 Argo CD에 대한 이해를 돕고, 실제 여러분의 프로젝트에 적용해보는 데 유용한 가이드가 되었기를 바랍니다. 혹시 GitOps나 Argo CD를 사용하면서 겪었던 경험이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요! 함께 이야기 나누면서 더 멋진 개발 문화를 만들어나가면 좋겠습니다. 감사합니다!

📌 함께 읽으면 좋은 글

  • [AI 머신러닝] RAG 패턴을 활용한 LLM 애플리케이션 개발 가이드: 실전 구현 전략과 최적화 방안
  • [기술 리뷰] Vite vs Webpack: 프론트엔드 번들러 성능 및 개발 경험 심층 비교
  • [클라우드 인프라] Terraform 멀티 클라우드 인프라 자동화: 모듈화와 재사용 전략으로 효율 높이기

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

반응형