서론
쿠버네티스에는 워크로드를 배포하고 관리하기 위해 다양한 오브젝트가 존재합니다. 그중에서도 일반적인 서비스(웹, API 등)를 배포할 때 주로 쓰이는 Deployment와는 달리 StatefulSet, DaemonSet, Job, CronJob은 각각 특수한 목적을 갖습니다.
- StatefulSet: 상태ful(상태가 중요한) 애플리케이션을 위해, 안정적인 네트워크 ID 및 스토리지 관리 등을 제공
- DaemonSet: 모든 노드마다 반드시 실행되어야 하는 워크로드(Pod)
- Job: 특정 작업을 한 번(또는 정해진 횟수) 실행 후 종료해야 하는 배치성 작업
- CronJob: 스케줄러 역할을 수행하며, 정해진 시간/주기에 맞춰 Job을 실행
이번 포스팅에서는 위 4가지 오브젝트가 각각 어떤 역할을 하고, 어느 상황에서 사용되는지, 그리고 예시를 들어 좀 더 구체적으로 살펴보겠습니다.
본론
1. StatefulSet
StatefulSet이란?
- 쿠버네티스에서 상태가 필요한 애플리케이션(Stateful Application)을 위한 컨트롤러입니다.
- Pod에 고유한 정체성(이름, 순번 등)과 퍼시스턴트 스토리지를 안정적으로 부여합니다.
- Pod이 순차적으로 배포·종료되며, 각 Pod는 고정된 호스트네임(pod-0, pod-1 등)과 연결됩니다.
언제/어떻게 사용하나?
- DB, 메시지 큐, 캐시 서버 등 스토리지(데이터)가 중요한 애플리케이션에 적합합니다.
- Pod 간에 순서(ordinal index)가 필요하거나, 네트워크 ID가 변하지 않아야 하는 경우에 사용합니다. 예: Cassandra, Zookeeper, Elasticsearch 등 클러스터를 구성할 때.
- PVC(퍼시스턴트 볼륨 클레임)와 함께 사용하여 Pod별로 독립된 스토리지 볼륨을 영구적으로 관리할 수 있습니다.
예시
- MySQL 주요 데이터베이스를 StatefulSet으로 구성해 Pod가 재시작돼도 스토리지 연결이 유지되도록 보장.
- Kafka 클러스터를 StatefulSet으로 구성해 broker-0, broker-1, broker-2 식으로 안정적 네트워크 ID를 제공.
- Redis 같은 캐시 서버를 다중 노드 형태로 운영할 때, 노드 간 호스트네임과 스토리지를 명확히 고정하기 위해 사용.
2. DaemonSet
DaemonSet이란?
- 클러스터의 모든 노드(또는 특정 조건을 만족하는 노드)에 반드시 1개의 Pod가 동작하도록 보장하는 쿠버네티스 오브젝트입니다.
- 노드가 새롭게 추가되면, DaemonSet은 해당 노드에도 자동으로 Pod를 배포하고, 노드가 제거되면 자동으로 Pod를 정리합니다.
언제/어떻게 사용하나?
- 노드 단위로 반드시 실행해야 하는 시스템 에이전트나 로그 수집, 모니터링 에이전트 등에서 자주 사용합니다.
- 컨테이너 런타임 수준의 보안 모듈 또는 노드 수준에서 필요한 네트워크 에이전트가 필요할 때.
- 노드가 추가·삭제될 때마다 자동으로 스케일되며, 노드별로 1개씩 구동되어야 하므로 동작이 간단해집니다.
예시
- Fluentd, Filebeat 등 로그 수집 에이전트를 모든 노드에 설치하여 Pod 로그를 중앙 수집 시스템(ElasticSearch, Splunk 등)으로 보내야 할 때.
- Prometheus Node Exporter, Datadog Agent 등 서버별 CPU, 메모리, 디스크 사용률 등을 수집하는 모니터링 에이전트가 필요한 경우.
- **CNI 플러그인(네트워크 플러그인)**이 자체적으로 DaemonSet으로 구성되어 노드마다 필수 Pod로 배포되는 경우도 많음.
3. Job
Job이란?
- 한 번 실행 후 완료되어야 하는 작업(배치 작업 등)을 수행하기 위한 쿠버네티스 오브젝트입니다.
- Pod를 하나 이상 실행하여 작업을 완료하면 Job 오브젝트가 성공 상태를 기록하고 종료합니다.
- 재시도가 필요한 경우(backoffLimit)나 여러 Pod 병렬 실행(parallelism) 등을 설정해 유연하게 작업을 구성할 수 있습니다.
언제/어떻게 사용하나?
- DB 마이그레이션, 일회성 스크립트 실행, 대량 데이터 처리를 위한 일회성 작업 등에 사용합니다.
- 특정 함수나 로직을 실행하고 그 결과를 저장하면 끝나는 파이프라인의 한 단계로 사용 가능.
- 장시간 소모되는 작업이나 실패 가능성이 높은 작업은 재시도(backoffLimit)를 통해 자동 복구를 지원합니다.
예시
- DB 마이그레이션 스크립트를 Job으로 작성해 애플리케이션이 배포되기 전/후에 필요한 스키마 변경을 수행.
- ETL(Extract, Transform, Load) 처리를 위해 일괄 데이터 변환 작업을 Job으로 실행하고, 완료 후 결과를 S3나 외부 DB에 저장.
- 결산 작업처럼 매달 1일에 한 번 실행 후 종료되는 배치 작업(단, 정확히 “매달 1일” 자동 실행은 CronJob을 사용할 수 있음).
4. CronJob
CronJob이란?
- 스케줄러 역할을 하는 쿠버네티스 오브젝트로, 특정 Cron 표현식(schedule)에 따라 Job을 주기적으로 생성하여 실행합니다.
- Linux의 cron과 유사한 방식으로 동작하며, 시간을 지정하면 지정된 시간에 Job 리소스를 생성합니다.
언제/어떻게 사용하나?
- 매일, 매주, 매월 특정 시간에 반복해서 실행해야 하는 배치/백그라운드 작업을 관리할 때.
- 로그 정리, 백업, 레포트 생성, 모니터링 지표 수집 등 주기적으로 필요한 작업을 자동화하고 싶을 때.
- 스케줄이 변경되거나, 실패 시 재시도가 필요할 경우 등, “특정 시점에 Job을 실행한다”는 요구 사항이 있는 경우 사용합니다.
예시
- 매일 자정에 DB 백업을 수행하는 CronJob 설정(0 0 * * *).
- 매주 월요일 오전 9시에 데이터 처리 Job을 실행해 리포트를 생성하고, 그 결과를 사내 서버에 전달.
- 특정 API 엔드포인트를 주기적으로 호출해 데이터 갱신 또는 캐시 무효화를 수행하는 경우.
결론
이번 포스팅에서는 StatefulSet, DaemonSet, Job, CronJob이라는 네 가지 쿠버네티스 오브젝트에 대해 알아봤습니다. 각각의 특징을 요약해보면:
- StatefulSet: 상태ful 애플리케이션(특히 데이터베이스나 분산 클러스터)이 안정적으로 동작하도록, 고유 네트워크 식별자와 퍼시스턴트 스토리지 관리 기능을 제공합니다.
- DaemonSet: 모든 노드(또는 특정 조건에 맞는 노드)에 공통 Pod가 반드시 배포되도록 하는 컨트롤러로, 로그 수집/모니터링/보안 에이전트 등의 시스템 레벨 워크로드에 적합합니다.
- Job: 일회성(혹은 한정된 횟수) 작업을 수행하고, 완료 후 종료되어야 하는 배치 작업을 위해 사용됩니다.
- CronJob: Cron 스케줄에 따라 Job을 주기적으로 실행해야 할 때, 스케줄러로서 유용하게 활용됩니다.
백엔드 개발자 겸 시스템 엔지니어 관점에서, 이러한 특수 오브젝트들은 쿠버네티스 활용 범위를 크게 넓혀 줍니다. 꼭 웹 서비스나 API 서버만 배포하는 게 아니라, 데이터베이스와 같은 상태ful 서비스, 노드별로 필요한 데몬 작업, 일정 주기에 자동으로 수행해야 하는 배치 작업 등 다양한 요구사항을 쿠버네티스 안에서 통합 관리할 수 있게 됩니다.