GitOps와 Argo CD를 활용한 Kubernetes 자동 배포 가이드
GitOps의 핵심 개념을 이해하고, Argo CD를 사용하여 Kubernetes 클러스터에 애플리케이션을 자동으로 배포하고 관리하는 방법을 배웁니다. CI/CD 파이프라인 구축 및 운영 효율성 향상에 필수적인 내용을 다룹니다.
GitOps 개념 이해 및 Argo CD 활용 자동 배포
1. GitOps란 무엇인가?
GitOps는 Git 저장소를 단일 진실 공급원(Single Source of Truth)으로 사용하여 인프라와 애플리케이션의 선언적 구성을 관리하는 운영 체계입니다. 모든 시스템 변경 사항은 Git에 커밋되며, Git의 버전 관리, 협업, 감사 기능을 활용하여 배포 및 관리를 자동화합니다.
주요 원칙:
- 선언적(Declarative): 시스템의 원하는 상태를 선언적으로 정의합니다.
- 불변성(Immutable): 시스템 변경은 Git 커밋을 통해 이루어지며, 이전 상태로 쉽게 롤백할 수 있습니다.
- 자동화(Automated): Git에서의 변경 사항을 감지하여 실제 시스템에 자동으로 적용합니다.
- 지속적 동기화(Continuous Synchronization): Git에 정의된 상태와 실제 시스템의 상태를 지속적으로 비교하고 일치시킵니다.
2. GitOps를 사용하는 이유
- 배포 속도 및 안정성 향상: 자동화된 배포 파이프라인을 통해 빠르고 일관된 배포가 가능합니다.
- 운영 복잡성 감소: Git을 통해 인프라와 애플리케이션 상태를 중앙 집중식으로 관리합니다.
- 강화된 보안 및 감사: Git의 변경 이력 추적 기능을 통해 누가, 언제, 무엇을 변경했는지 명확하게 알 수 있습니다.
- 신속한 복구(Disaster Recovery): Git 저장소만 있으면 언제든지 이전 상태로 복구할 수 있습니다.
3. Argo CD란?
Argo CD는 Kubernetes 네이티브 GitOps 도구로, Git 저장소에 선언된 애플리케이션의 원하는 상태를 Kubernetes 클러스터의 실제 상태와 자동으로 동기화합니다. Helm, Kustomize, Jsonnet 등 다양한 매니페스트 형식을 지원합니다.
4. Argo CD 설치 및 기본 설정
Kubernetes 클러스터에 Argo CD를 설치하는 것은 간단합니다. 일반적으로 kubectl을 사용하여 Argo CD 네임스페이스를 생성하고, 해당 네임스페이스에 Argo CD를 설치하는 YAML 파일을 적용합니다.
# 1. Argo CD 네임스페이스 생성
kubectl create namespace argocd
# 2. Argo CD 설치
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 3. Argo CD 초기 비밀번호 확인 (Argo CD UI 접속용)
kubectl -n argocd get secret argocd-initial-secrets -o jsonpath="{.data.password}" | base64 -d
설치 후, Argo CD UI에 접속하여 초기 비밀번호로 로그인할 수 있습니다. UI 접속 방법은 argocd-server 서비스의 타입(ClusterIP, LoadBalancer 등)에 따라 달라집니다. kubectl port-forward를 사용하면 쉽게 접속할 수 있습니다.
# 포트 포워딩 (UI 접속용)
kubectl port-forward svc/argocd-server -n argocd 8080:443
이제 웹 브라우저에서 https://localhost:8080 (또는 설정된 주소)으로 접속하고, 초기 비밀번호로 로그인합니다.
5. Argo CD를 이용한 애플리케이션 배포
Argo CD에서는 Git 저장소의 Kubernetes 매니페스트(Deployment, Service 등)를 사용하여 애플리케이션을 배포합니다. 이를 'Application'이라고 부릅니다.
애플리케이션 생성 절차:
- Git 저장소 준비: 배포할 애플리케이션의 Kubernetes 매니페스트 파일(YAML)을 Git 저장소에 푸시합니다. (예:
deployment.yaml,service.yaml) - Argo CD UI 접속: 웹 브라우저를 통해 Argo CD UI에 접속합니다.
- 새 애플리케이션 생성: "New App" 버튼을 클릭합니다.
- 애플리케이션 설정:
- Project: 기본값 또는 생성한 프로젝트를 선택합니다.
- Sync Policy: "Manual" 또는 "Automatic"을 선택합니다. "Automatic"으로 설정하면 Git 변경 시 자동으로 동기화됩니다.
- Source: Git 저장소의 URL, 브랜치, 경로를 지정합니다.
- Destination: 배포할 Kubernetes 클러스터의 API 서버 URL 및 네임스페이스를 지정합니다.
- Repository type: "git"을 선택합니다.
- Path: Git 저장소 내 매니페스트 파일이 있는 경로를 지정합니다.
- 생성 및 동기화: "Create" 버튼을 클릭한 후, 애플리케이션 상태가 "OutOfSync"이면 "Sync" 버튼을 클릭하여 Git의 상태와 클러스터의 상태를 일치시킵니다.
6. 배포, 롤백, 헬스체크
- 배포: Argo CD는 Git 저장소의 변경 사항을 감지하면 자동으로(또는 수동 동기화 시) 클러스터에 적용합니다. Helm Chart나 Kustomize를 사용하는 경우, 해당 도구의 기능을 활용하여 버전 관리 및 배포 전략(Canary, Blue/Green 등)을 구현할 수 있습니다.
- 롤백: Git 저장소에서 이전 커밋으로 되돌리고 Argo CD를 동기화하면, 클러스터의 상태도 이전 버전으로 롤백됩니다. Argo CD UI에서 Application 히스토리를 통해 특정 리비전으로 재동기화하는 것도 가능합니다.
- 헬스체크: Kubernetes는 각 리소스(Deployment, Pod 등)의 헬스 상태를 정의할 수 있는 기능을 제공합니다. Argo CD는 이러한 Kubernetes의 헬스 상태를 모니터링하여 애플리케이션의 배포 상태를 시각적으로 보여줍니다. Pod가 비정상 상태이면 Argo CD UI에서 해당 정보를 확인할 수 있습니다.
7. 시크릿 및 구성 관리
애플리케이션의 민감한 정보(API 키, 데이터베이스 비밀번호 등)는 Kubernetes Secret으로 관리하고, Git 저장소에는 암호화된 형태로 저장하거나 Vault와 같은 별도의 비밀 관리 도구를 연동합니다. Argo CD는 이러한 Secret 리소스를 자동으로 배포할 수 있습니다.
8. 관측 (Observability)
- 로그: Argo CD UI에서 배포된 애플리케이션의 Pod 로그를 직접 확인할 수 있습니다.
kubectl logs명령어도 동일하게 사용할 수 있습니다. - 모니터링: Argo CD 자체의 상태 및 성능 지표는 Prometheus 등을 통해 수집하고 Grafana 등으로 시각화할 수 있습니다. 배포된 애플리케이션의 성능 및 오류는 Prometheus, Grafana, Elasticsearch, Kibana(ELK) 스택 등을 통해 모니터링합니다.
9. 주의사항
- Git 보안: Git 저장소의 접근 권한을 철저히 관리해야 합니다.
- 매니페스트 관리: 복잡한 애플리케이션의 경우, Helm 또는 Kustomize를 사용하여 매니페스트를 구조화하고 관리하는 것이 효율적입니다.
- 자동 동기화 설정: "Automatic" 동기화 정책은 편리하지만, 의도하지 않은 변경이 배포될 수 있으므로 신중하게 사용해야 합니다. Git Hooks 또는 Pull Request 워크플로우를 통해 변경 사항을 검증하는 것이 좋습니다.
GitOps와 Argo CD를 활용하면 Kubernetes 환경에서의 애플리케이션 배포 및 운영을 자동화하고 효율화할 수 있습니다.