Deployment ──manages──▶ ReplicaSet ──manages──▶ Pod(s)
maxSurge·maxUnavailable 같은 임계값으로 정해진 안전 범위 안에서 단계적으로 진행해 무중단을 보장PodTemplateSpec 수정 시 새 ReplicaSet 생성·기존 ReplicaSet 축소로 점진 교체kubectl apply로 적용하는 흐름이 표준
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 원하는 Pod 개수
selector: # 이 Deployment가 관리할 Pod 식별 기준
matchLabels:
app: nginx
template: # Pod 생성 템플릿 (PodTemplateSpec)
metadata:
labels:
app: nginx # selector.matchLabels와 반드시 일치
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
apiVersion: apps/v1 — Deployment는 apps/v1 그룹metadata.name — Deployment 이름. ReplicaSet·Pod 이름의 prefix가 됨spec.replicas — 유지할 Pod 개수spec.selector — 관리할 Pod를 찾는 라벨 셀렉터. 생성 후 변경 불가(immutable)spec.template — Pod 템플릿. template.metadata.labels는 selector와 매칭되어야 하고, 템플릿 변경 시 rollout 트리거kubectl get deployments
사용 가능 / 원하는 개수 (예: 3/3)kubectl rollout status deployment/nginx-deployment — 롤아웃 완료까지 watchkubectl get rs — Deployment가 만든 ReplicaSet 확인. 이름은 [DEPLOYMENT-NAME]-[HASH]kubectl get pods --show-labels — Pod와 자동 부착된 라벨 확인pod-template-hash 라벨[HASH]의 정체. PodTemplateSpec을 해시한 값PodTemplateSpec이 바뀐 경우에만 rollout 발생
spec.template.* 변경(이미지·환경변수·리소스 등) → rolloutspec.replicas만 바꾸면 rollout 없이 단순 스케일 조정kubectl set image deployment/nginx-deployment nginx=nginx:1.16.0
spec.template.spec.containers[0].image 필드를 갱신kubectl apply 흐름이 일반적PodTemplateSpec에 해당, replicas는 0부터 시작RollingUpdatemaxUnavailable (기본 25%) — 업데이트 중 동시에 사용 불가 상태가 될 수 있는 Pod의 최대 비율/개수maxSurge (기본 25%) — desired replicas를 일시적으로 초과할 수 있는 Pod의 최대 비율/개수spec.selector는 생성 후 변경 불가spec.strategy.type으로 두 가지 중 선택. 기본은 RollingUpdate
Recreate — 기존 Pod를 모두 종료한 뒤 새 Pod를 생성RollingUpdate — 점진적으로 새 Pod로 교체 (무중단)maxUnavailable·maxSurge로 진행 속도와 가용성 보장 수준을 제어spec.strategy.rollingUpdate.maxUnavailable과 maxSurge로 명시 가능
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
maxUnavailable1, 2)"25%") — desired replicas 기준으로 계산25%maxSurge25%)maxUnavailable=0 AND maxSurge=0 조합은 불가kubectl rollout status, kubectl get deployments, Deployment 컨디션·이벤트 확인kubectl rollout history deployment/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
3 kubectl set image deployment/nginx-deployment nginx=nginx:1.14.2
kubernetes.io/change-cause 어노테이션 값
kubectl annotate deployment/nginx-deployment \
kubernetes.io/change-cause="Updated image to 1.16.0" --overwrite
kubectl rollout history deployment/nginx-deployment --revision=2
kubectl rollout undo deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=2
kubectl rollout pause deployment/nginx-deployment
set image·set resources 등을 여러 번 해도 새 ReplicaSet이 매번 생기지 않음kubectl rollout resume deployment/nginx-deployment
maxSurge·maxUnavailable 규칙이 적용kubectl rollout undo가 실패함resume으로 풀어야 함kubectl scale로 즉시 변경
kubectl scale deployment/nginx-deployment --replicas=10
spec.replicas를 수정해 kubectl apply로 적용해도 동일한 결과HorizontalPodAutoscaler를 붙이면 메트릭 기반으로 자동 스케일
kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80
spec.replicas를 직접 조정 — Deployment는 그에 맞춰 ReplicaSet을 늘리거나 줄이는 역할만 함maxSurge·maxUnavailable 제약은 그대로 지켜짐spec.revisionHistoryLimit100으로 설정하면
kubectl rollout undo로 되돌릴 대상이 없음spec.progressDeadlineSeconds600 (10분)Progressing 컨디션이 status: False로 전환reason: ProgressDeadlineExceededrollout undo)status.conditions로 표현됨Progressing, Availabletype=Progressing, status=Truereason 값으로 단계 식별
NewReplicaSetCreated — 새 ReplicaSet 생성됨FoundNewReplicaSet — 기존 ReplicaSet을 재사용ReplicaSetUpdated — ReplicaSet이 갱신되는 중NewReplicaSetAvailable — 새 ReplicaSet의 replica가 모두 ready (= 완료 신호)type=Progressing, status=True, reason=NewReplicaSetAvailable 상태가 곧 완료type=Progressing, status=False, reason=ProgressDeadlineExceededkubectl rollout status deployment/<name> — 성공이면 exit 0, 실패면 non-zerokubectl describe deployment <name> — 컨디션·이벤트·메시지를 한눈에 확인rollout status의 종료 코드로 배포 성공/실패를 판정하는 패턴이 일반적app: nginx)로 두고, 버전은 별도 라벨(version: stable / version: canary)로 구분# Service — 공통 라벨로 양쪽 Pod 모두 셀렉트
spec:
selector:
app: nginx # version 무관하게 매칭
---
# Stable Deployment — replicas 9
spec:
replicas: 9
template:
metadata:
labels:
app: nginx
version: stable
---
# Canary Deployment — replicas 1
spec:
replicas: 1
template:
metadata:
labels:
app: nginx
version: canary
spec 최상위 필드를 참조용으로 한 표에 정리| 필드 | 타입 | 의미 | 기본값 |
|---|---|---|---|
replicas |
integer | 유지할 Pod 개수 | 1 |
selector |
LabelSelector | 관리할 Pod 식별 셀렉터. 생성 후 변경 불가 | 필수 |
template |
PodTemplateSpec | 만들 Pod의 템플릿 | 필수 |
strategy.type |
string | RollingUpdate 또는 Recreate |
RollingUpdate |
strategy.rollingUpdate.maxUnavailable |
int·% | 동시에 사용 불가가 될 수 있는 Pod 최대치 | 25% |
strategy.rollingUpdate.maxSurge |
int·% | desired를 일시 초과할 수 있는 Pod 최대치 | 25% |
minReadySeconds |
integer | Pod ready 후 available로 인정되기까지 최소 대기 초 | 0 |
revisionHistoryLimit |
integer | 보관할 옛 ReplicaSet 수. 0이면 롤백 불가 |
10 |
paused |
boolean | rollout 일시 중단 여부 | false |
progressDeadlineSeconds |
integer | rollout 진전 없이 대기 가능한 최대 초. 초과 시 failed | 600 |