StatefulSet, DaemonSet, Job, CronJob
Kubernetes의 다양한 워크로드 리소스 완벽 가이드
Kubernetes의 다양한 워크로드 리소스 완벽 가이드
목표: 상황에 맞는 워크로드 타입을 선택하고 구성할 수 있는 수준
🗃️ StatefulSet
Deployment vs StatefulSet
graph LR
subgraph "Deployment"
D1["web-5d4f8b7c9-x2z4"]
D2["web-5d4f8b7c9-a1b2"]
D3["web-5d4f8b7c9-c3d4"]
end
subgraph "StatefulSet"
S1["mysql-0"]
S2["mysql-1"]
S3["mysql-2"]
end
style S1 fill:#f9f
style S2 fill:#f9f
style S3 fill:#f9f
| 특징 | Deployment | StatefulSet |
|---|---|---|
| 이름 | 무작위 | 순차적 (0, 1, 2…) |
| 생성/삭제 | 동시 | 순차적 |
| 볼륨 | 공유 가능 | 각 Pod 독립 |
| 네트워크 | 동적 IP | 고정 DNS (헤드리스 서비스) |
StatefulSet 예시
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
헤드리스 서비스
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
selector:
app: mysql
ports:
- port: 3306
clusterIP: None # 헤드리스
DNS 이름:
mysql-0.mysql.default.svc.cluster.localmysql-1.mysql.default.svc.cluster.local
👥 DaemonSet
역할: 모든 (또는 일부) 노드에 Pod 1개씩 실행
graph TB
subgraph "Node 1"
D1["📊 node-exporter"]
end
subgraph "Node 2"
D2["📊 node-exporter"]
end
subgraph "Node 3"
D3["📊 node-exporter"]
end
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:latest
ports:
- containerPort: 9100
사용처:
- 모니터링 에이전트 (node-exporter)
- 로그 수집기 (fluentd, filebeat)
- 네트워크 프록시 (CNI)
⏰ Job / CronJob
Job (일회성 작업)
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
CronJob (주기적 작업)
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: busybox
command: ["/bin/sh", "-c", "echo Backup started"]
restartPolicy: OnFailure
# CronJob 확인
kubectl get cronjobs
kubectl get jobs --watch
📋 워크로드 선택 가이드
| 워크로드 | 사용처 | 예시 |
|---|---|---|
| Deployment | 상태없는 앱 | 웹 서버, API |
| StatefulSet | 상태유지 앱 | DB, 메시지큐 |
| DaemonSet | 노드당 1개 | 모니터링, 로그 |
| Job | 일회성 작업 | 데이터 마이그레이션 |
| CronJob | 주기적 작업 | 백업, 리포트 |
🔗 관련 노트
- 01-04-Deployment-관리 — 기본 워크로드
- 02-06-PV-PVC-StorageClass — 스토리지
- 02-11-Pod-실패-원인-분석 — 트러블슈팅
마지막 업데이트: 2026-06-01