Deployment 관리
Kubernetes 워크로드 리소스의 생성, 업데이트, 롤백 완벽 가이드
Kubernetes 워크로드 리소스의 생성, 업데이트, 롤백 완벽 가이드
목표: 무중단 배포와 롤백을 자신있게 수행할 수 있는 수준
📦 Deployment
기본 구조
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
주요 명령어
# 생성
kubectl apply -f deployment.yaml
# 상태 확인
kubectl get deployment nginx-deployment
kubectl get pods -l app=nginx
# 상세 정보
kubectl describe deployment nginx-deployment
# 스케일링
kubectl scale deployment nginx-deployment --replicas=5
# 이미지 업데이트
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
# 롤백
kubectl rollout undo deployment/nginx-deployment
# 롤아웃 히스토리
kubectl rollout history deployment/nginx-deployment
# 특정 버전으로 롤백
kubectl rollout undo deployment/nginx-deployment --to-revision=2
# 롤아웃 상태 모니터링
kubectl rollout status deployment/nginx-deployment
롤링 업데이트 전략
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25% # 최대 초과 Pod 수
maxUnavailable: 25% # 최대 불가능 Pod 수
| 전략 | 설명 | 사용처 |
|---|---|---|
| RollingUpdate | 점진적 교체 (기본) | 일반적 |
| Recreate | 모두 삭제 후 재생성 | 동시 실행 불가 |
🗃️ StatefulSet
Deployment vs StatefulSet
| 특징 | Deployment | StatefulSet |
|---|---|---|
| 이름 | 무작위 (nginx-5d4f8b7c9-x2z4) | 순차적 (mysql-0, mysql-1) |
| 볼륨 | 공유 가능 | 각 Pod 독립 (PVC 템플릿) |
| 삭제 | 동시 | 역순 (mysql-1 → mysql-0) |
| 헤드리스 서비스 | 불필요 | 필요 (네트워크 ID 고정) |
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
# StatefulSet 확인
kubectl get statefulset mysql
kubectl get pods -l app=mysql
# mysql-0, mysql-1, mysql-2 (순서대로 생성)
# PVC 확인
kubectl get pvc -l app=mysql
# data-mysql-0, data-mysql-1, data-mysql-2
👥 DaemonSet
역할: 모든 (또는 일부) 노드에 Pod 1개씩 실행.
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
# DaemonSet 확인
kubectl get daemonset node-exporter
# 모든 노드에 실행 중인지 확인
kubectl get pods -o wide -l app=node-exporter
사용처:
- 모니터링 에이전트 (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
# Job 실행 및 확인
kubectl apply -f job.yaml
kubectl get jobs
kubectl logs job/pi
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-02-Pod-생명주기 — Pod 상태 관리
- 01-06-Service-타입 — 서비스 노출
- 02-06-PV-PVC-StorageClass — 스토리지
- 02-11-Pod-실패-원인-분석 — 트러블슈팅
마지막 업데이트: 2026-06-01