1. 서론 — Docker Compose로 시작한 개발자가 Kubernetes에서 마주하는 질문
많은 백엔드 개발자들이 컨테이너 기반 운영을 시작할 때 가장 먼저 사용하는 도구는 Docker Compose입니다.
Docker Compose는 여러 컨테이너를 하나의 서비스로 묶어 실행할 수 있기 때문에 로컬 개발이나 간단한 서버 운영에서는 매우 편리합니다.
예를 들어 다음과 같은 구성이 가능합니다.
- API 서버
- PostgreSQL
- Redis
- Elasticsearch
Compose 파일 하나로 전체 서비스를 실행할 수 있습니다.
하지만 DevOps 환경, 특히 Kubernetes + GitOps 구조로 넘어오면 상황이 달라집니다.
이때 등장하는 도구가 바로 Helm과 Kustomize입니다.
많은 개발자들이 여기서 질문을 하게 됩니다.
“Docker Compose로도 충분히 서비스 배포가 가능한데
왜 Kubernetes에서는 Helm이나 Kustomize를 사용하는가?”
이 글에서는 DevOps와 GitOps 관점에서 그 이유를 정리해보겠습니다.
2. Docker Compose의 역할 — 컨테이너 실행 도구
Docker Compose는 기본적으로 컨테이너 실행 오케스트레이션 도구입니다.
Compose의 핵심 역할은 다음과 같습니다.
- 여러 컨테이너를 동시에 실행
- 네트워크 연결
- 볼륨 연결
- 환경 변수 설정
- 의존성 순서 관리
예를 들어 다음과 같은 구조입니다.
PostgreSQL
Redis
Elasticsearch
이 파일을 기반으로 다음 명령어 하나로 서비스를 실행합니다.
즉 Docker Compose는
**“컨테이너를 어떻게 실행할 것인가”**에 집중합니다.
하지만 DevOps 환경에서는 단순 실행 이상의 관리가 필요합니다.
3. DevOps 환경에서 필요한 것
DevOps 운영에서는 단순히 컨테이너를 실행하는 것보다 더 중요한 요소들이 있습니다.
예를 들면 다음과 같습니다.
- 배포 이력 관리
- 환경별 설정 관리 (dev / staging / prod)
- 롤백
- 선언 기반 인프라 관리
- 자동화된 배포
- 클러스터 상태 관리
이러한 요구사항을 충족시키기 위해 Kubernetes에서는 선언형(Declarative) 방식을 사용합니다.
예를 들어 다음과 같은 YAML이 존재합니다.
Service
ConfigMap
Secret
Ingress
CronJob
이 YAML 파일들이 모여 서비스의 상태를 정의합니다.
그리고 GitOps에서는 이 YAML 파일들이 바로 **운영 상태의 진실(Source of Truth)**이 됩니다.
4. GitOps의 핵심 개념 — 선언 기반 운영
GitOps의 핵심 철학은 다음 한 문장으로 정리됩니다.
Git에 정의된 상태가 곧 실제 시스템의 상태다.
즉 Git에 다음과 같이 정의되어 있다면
클러스터에는 실제로
가 존재해야 합니다.
만약 누군가 서버에서 직접 다음과 같이 수정한다면
GitOps 도구(예: ArgoCD)는 이를 감지하고 다시 Git 상태로 되돌립니다.
이 과정을 Drift Correction이라고 합니다.
이처럼 GitOps 환경에서는 배포 상태 자체가 Git으로 관리됩니다.
5. Docker Compose가 GitOps와 맞지 않는 이유
Docker Compose는 다음과 같은 특징을 가지고 있습니다.
- 서버에서 직접 실행된다
- 서버 상태가 기준이 된다
- YAML이 있지만 실행은 명령어 기반이다
예를 들어 일반적인 배포 흐름은 다음과 같습니다.
↓
SSH 접속
↓
docker compose pull
↓
docker compose up -d
이 방식의 문제는 서버 상태가 기준이 된다는 것입니다.
즉 Git이 아니라 서버가 Source of Truth가 됩니다.
이 경우 다음 문제가 발생할 수 있습니다.
- 누가 언제 배포했는지 추적 어려움
- 서버에서 직접 수정 가능
- 환경 설정 drift 발생
- 롤백 복잡
이러한 이유로 GitOps에서는 Compose 기반 배포보다 선언 기반 Kubernetes 리소스 관리를 사용합니다.
6. Helm과 Kustomize의 역할
Kubernetes YAML은 실제 서비스 운영에서는 매우 빠르게 복잡해집니다.
예를 들어 다음과 같은 문제가 발생합니다.
- 환경별 설정
- 공통 리소스 관리
- 이미지 버전 관리
- 서비스별 설정
이 문제를 해결하기 위해 사용하는 도구가 바로 Helm과 Kustomize입니다.
Helm
Helm은 Kubernetes의 패키지 매니저입니다.
개념적으로는 다음과 같습니다.
Helm → Kubernetes 서비스 패키지 관리
Helm을 사용하면 다음이 가능합니다.
- 템플릿 기반 YAML 생성
- values 파일로 환경 설정 관리
- 버전 관리
- 배포 및 롤백
즉 Helm은 Kubernetes 애플리케이션 패키징 도구입니다.
Kustomize
Kustomize는 YAML Overlay 관리 도구입니다.
예를 들어 다음과 같은 구조를 만들 수 있습니다.
├ deployment.yaml
└ service.yaml
overlays
├ dev
└ prod
이렇게 하면 공통 설정은 유지하면서 환경별 차이만 관리할 수 있습니다.
Kustomize는 Kubernetes에 기본 내장되어 있기 때문에 별도 설치 없이 사용할 수 있습니다.
7. DevOps 관점에서 보는 선택 기준
| Docker Compose | 컨테이너 실행 |
| Helm | Kubernetes 애플리케이션 패키징 |
| Kustomize | 환경별 YAML 관리 |
| ArgoCD | GitOps 배포 관리 |
즉 DevOps 환경에서는 다음과 같은 구조가 만들어집니다.
├ source code
├ Dockerfile
└ k8s manifests (Helm / Kustomize)
↓
ArgoCD
↓
Kubernetes Cluster
8. 정리
Docker Compose는 훌륭한 도구입니다.
하지만 그 목적은 컨테이너 실행입니다.
반면 GitOps 환경에서는 다음이 필요합니다.
- 선언형 배포
- Git 기반 상태 관리
- 환경별 구성
- 자동화된 배포
- 클러스터 상태 동기화
이러한 요구사항을 충족시키기 위해 Kubernetes 생태계에서는
Helm과 Kustomize를 사용합니다.
결국 차이는 다음 한 문장으로 정리됩니다.
Docker Compose는 “컨테이너 실행 도구”이고
Helm과 Kustomize는 “배포 상태 관리 도구”이다.
'Platform > Infra(DevOps)' 카테고리의 다른 글
| 서버리스란 무엇인가요? (0) | 2026.03.10 |
|---|---|
| Docker Compose → Kubernetes → GitOps로 넘어가는 개발자 로드맵 (0) | 2026.03.05 |
| GitHub 자동배포 3대장 비교: SSH Pull vs GitHub Actions Runner vs Watchtower (0) | 2026.03.05 |
| 전통적인 Nginx 배포 vs 현대적인 K8s, 당신의 정답은? (생산성과 효율성 사이) (0) | 2026.03.05 |
| Java Spring 개발자가 Kubernetes를 공부해야 하는 이유 (0) | 2026.03.05 |
