자격증 학원 › CKA › 워크로드 · 스케줄링

강의 8 / 28 · 약 25분

디플로이먼트 — 롤링 업데이트와 롤백

Deployment → ReplicaSet → Pod 의 사슬. 스케일, 이미지 업데이트, 롤아웃 상태·이력·롤백, 전략(RollingUpdate·Recreate).

이 강의를 마치면

  • Deployment 를 만들고 스케일·이미지 업데이트를 할 수 있다
  • 롤아웃 상태·이력을 읽고 특정 리비전으로 롤백할 수 있다
  • maxSurge · maxUnavailable 이 업데이트에 어떤 영향을 주는지 안다

사슬 구조

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 강의

⌨️ 직접 해 보기

브라우저 실습 터미널에서 풀고 자동 채점을 받습니다.

✅ 확인 문제

과정 목차