사슬 구조
Deployment web (원하는 상태: 템플릿 + 레플리카 3)
└─ ReplicaSet web-7c9f8d6b4 (이 템플릿으로 파드 3개 유지)
├─ Pod web-7c9f8d6b4-2xk8q
├─ Pod web-7c9f8d6b4-9mzp5
└─ Pod web-7c9f8d6b4-tq4lw
파드를 직접 만들지 않고 Deployment 를 쓰는 이유는 자가 치유와 무중단 업데이트 때문입니다. 파드를 지우면 ReplicaSet 이 곧 새로 만들고, 노드가 죽으면 다른 노드에 다시 만듭니다.
kubectl create deployment web --image=nginx:1.26 --replicas=3
kubectl get deploy,rs,pods -l app=web
kubectl scale deployment web --replicas=5
이미지 업데이트와 롤아웃
kubectl set image deployment/web nginx=nginx:1.27 # 컨테이너이름=새이미지
kubectl rollout status deployment web # 끝날 때까지 지켜보기
kubectl rollout history deployment web # 리비전 목록
kubectl rollout history deployment web --revision=2 # 그 리비전의 템플릿
컨테이너 이름을 모르면 kubectl get deploy web -o jsonpath='{.spec.template.spec.containers[*].name}'. kubectl create deployment 로 만들었다면 이미지 이름(nginx)이 컨테이너 이름입니다.
변경 사유(CHANGE-CAUSE) 남기기
rollout history 의 CHANGE-CAUSE 는 kubernetes.io/change-cause 어노테이션에서 옵니다.
kubectl annotate deployment web kubernetes.io/change-cause="upgrade to 1.27"
--record 플래그로도 남길 수 있었지만 폐지 예정(deprecated)이니 어노테이션 방식을 쓰세요.
롤백
새 이미지에 오타가 있으면 새 파드가 ImagePullBackOff 에 걸리고, 롤링 업데이트는 중간에서 멈춥니다(옛 파드는 대부분 살아 있음 — 이것이 RollingUpdate 의 안전장치).
kubectl rollout status deployment web
# Waiting for deployment "web" rollout to finish: 1 out of 3 new replicas have been updated...
kubectl rollout undo deployment web # 직전으로
kubectl rollout undo deployment web --to-revision=1 # 특정 리비전으로
롤백하면 옛 템플릿이 새 리비전 번호를 받습니다. 리비전 1, 2 에서 1 로 롤백하면 이력은 2, 3 이 되고 현재는 3 입니다. “현재 리비전을 적어라” 같은 문제에서 자주 틀립니다.
업데이트 전략
spec:
strategy:
type: RollingUpdate # 기본
rollingUpdate:
maxSurge: 25% # 원하는 개수보다 최대 몇 개 더(올림)
maxUnavailable: 25% # 원하는 개수보다 최대 몇 개 모자라게(내림)
# 또는
strategy:
type: Recreate # 전부 내리고 새로 올린다
maxSurge: 0, maxUnavailable: 1→ 하나씩 내리고 올린다(자원이 빠듯할 때)maxSurge: 1, maxUnavailable: 0→ 하나 더 띄운 뒤 하나 내린다(무중단 우선)
그 밖의 조작
kubectl rollout restart deployment web # 템플릿 그대로, 파드만 새로(설정 다시 읽기 등)
kubectl rollout pause deployment web # 여러 변경을 모아서 한 번에 롤아웃
kubectl rollout resume deployment web
ReplicaSet · StatefulSet · DaemonSet 차이
| 종류 | 용도 |
|---|---|
| Deployment | 상태 없는 앱. 파드는 서로 바꿔 써도 됨 |
| StatefulSet | 순서·고정 이름(web-0, web-1)·파드마다 고유 볼륨이 필요한 DB 등 |
| DaemonSet | 노드마다 하나씩(로그 수집기, 모니터링 에이전트, CNI) — 스케줄링 강의 |
| Job / CronJob | 한 번 / 주기적으로 실행하고 끝나는 작업 — 오토스케일링·Job 강의 |