Step 05 연습 과제

step05 네임스페이스에서 진행합니다. 시작 전 kubectl apply -f manifests/deployment.yaml 로 web Deployment(replicas=4)를 준비하세요.


과제 1. 자가 치유 관찰

파드 하나를 강제로 지운 뒤, ReplicaSet 이 몇 초 안에 다시 4개를 맞추는지 확인하세요. 어떤 오브젝트가 이 복구를 담당하나요?

해답
kubectl get pods -n step05
kubectl delete pod -n step05 <파드이름-하>
kubectl get pods -n step05 -w      # 새 파드가 생겨 다시 4개 (Ctrl+C 로 종료)

복구 담당은 ReplicaSet 입니다. Deployment 가 아니라 그 아래 ReplicaSet 이 "desired 개수"를 감시하며 부족분을 즉시 생성합니다.


과제 2. 무중단 확인용 카운트

maxSurge: 1, maxUnavailable: 1, replicas=4 일 때, 롤링 업데이트 도중 available 파드가 최소 몇 개 보장되는지 답하고, 매니페스트로 실제 롤아웃하며 kubectl get deploy web -n step05 -w 로 AVAILABLE 값이 그 아래로 떨어지지 않는지 관찰하세요.

해답

최소 3개(= replicas − maxUnavailable = 4 − 1)가 보장됩니다.

kubectl get deploy web -n step05 -w &      # AVAILABLE 관찰
kubectl set env deployment/web -n step05 ROLL=1
# AVAILABLE 컬럼이 3 아래로 떨어지지 않음

과제 3. change-cause 남기기

버전 라벨을 바꾸는 롤아웃을 하되, rollout history 에 의미 있는 CHANGE-CAUSE 가 남도록 하세요.

해답
kubectl set env deployment/web -n step05 APP_VERSION=v3
kubectl annotate deployment/web -n step05 \
  kubernetes.io/change-cause="bump APP_VERSION to v3" --overwrite
kubectl rollout history deployment/web -n step05

CHANGE-CAUSE 는 kubernetes.io/change-cause 어노테이션에서 옵니다. 롤아웃을 유발하는 변경과 같은 시점에 어노테이션을 걸어야 그 리비전에 붙습니다.


과제 4. 고장 → 진단 → 롤백 (핵심)

존재하지 않는 이미지로 업데이트해 롤아웃을 멈추게 한 뒤, (1) 왜 멈췄는지 파드 이벤트로 진단하고 (2) 직전 정상 리비전으로 롤백하세요.

해답
# 1) 고장 유발
kubectl set image deployment/web nginx=nginx:9.9-nope -n step05
kubectl rollout status deployment/web -n step05 --timeout=20s   # timed out

# 2) 진단
kubectl get pods -n step05                    # ImagePullBackOff
kubectl describe pod -n step05 -l pod-template-hash=<불량RS해> | grep -iE "Failed|Back-off"

# 3) 롤백
kubectl rollout undo deployment/web -n step05
kubectl rollout status deployment/web -n step05    # successfully rolled out

구버전 파드는 maxUnavailable 덕분에 계속 살아있었으므로 서비스는 끊기지 않았습니다.


과제 5. 셀렉터는 왜 못 바꾸나

실행 중인 web Deployment 의 spec.selector.matchLabelstier: frontend 를 추가해 apply 하면 어떻게 되나요? 이유와, 굳이 바꾸려면 어떻게 해야 하는지 답하세요.

해답
kubectl apply -f manifests/bad-selector.yaml
# The Deployment "web" is invalid: spec.selector: ... field is immutable

셀렉터는 불변입니다. 바꾸면 소유 파드 판정 기준이 흔들려 기존 파드가 고아가 되기 때문입니다. 정말 바꿔야 하면 Deployment 를 삭제 후 재생성하는 방법뿐입니다:

kubectl delete deployment web -n step05
kubectl apply -f manifests/bad-selector.yaml   # 이제 새로 생성되므로 성공