CKA — 쿠버네티스 관리자 · 워크로드와 스케줄링 · 실습
컨트롤러로 워크로드 굴리기
목표
Deployment, ReplicaSet, DaemonSet, StatefulSet 네 컨트롤러의 차이를 손으로 확인하고, 롤링 업데이트 파라미터를 조정해 실제 롤아웃과 롤백을 수행합니다.
왜 중요한가
시험에서 "이미지를 올리고 문제가 생기면 되돌려라" 는 단골 문제입니다. 그런데 되돌리기가 되는 이유를 모르면 함정에 빠집니다. rollout undo 는 마법이 아니라 레플리카 0 으로 남아 있는 옛 ReplicaSet 을 다시 키우는 것입니다. 그래서 revisionHistoryLimit 을 0 으로 두면 되돌릴 수 없고, 이미지를 손으로 되돌리면 되돌린 게 아니라 리비전이 하나 더 쌓입니다.
네 컨트롤러의 선택 기준도 명확합니다. 서로 구분할 필요 없는 복제본이면 Deployment, 노드마다 정확히 하나면 DaemonSet, 이름·순서·볼륨이 고정돼야 하면 StatefulSet 입니다. StatefulSet 이 헤드리스 서비스를 요구하는 이유는 파드마다 DNS 이름을 주기 위해서입니다.
단계
1. 네임스페이스 cka-workloads 를 만들고 Deployment web 을 만든다. 이미지 nginx:1.25, 레플리카 2.
2. web 을 레플리카 4로 스케일하고 4/4 Ready 를 확인한다.
3. web 의 전략을 RollingUpdate 로 두고 maxSurge: 2, maxUnavailable: 0, revisionHistoryLimit: 3 으로 설정한다.
4. Deployment api 를 만든다 (이미지 nginx:1.25, 레플리카 3). 그 다음 이미지를 nginx:1.27 로 교체하고 롤아웃이 끝날 때까지 기다린다.
5. api 의 롤아웃 히스토리를 /root/cka-workloads/history.txt 에 저장한다. 리비전이 2개 이상 보여야 한다.
6. api 를 직전 리비전으로 되돌린다. 되돌린 뒤 이미지는 다시 nginx:1.25 여야 한다.
7. cka-workloads 에 DaemonSet node-agent 를 만든다. 이미지 busybox:1.36, 컨테이너가 바로 종료되지 않도록 오래 도는 명령을 준다. 모든 노드에 하나씩 Ready 여야 한다.
8. 헤드리스 서비스 db-headless (clusterIP None, 포트 5432, 셀렉터 app=db)를 만들고, StatefulSet db 를 만든다. serviceName db-headless, 레플리카 2, 이미지 nginx:1.27, updateStrategy 는 RollingUpdate 에 partition: 1. 2/2 Ready 를 확인한다.
참고
kubectl rollout status deployment/api -n cka-workloads로 완료를 기다릴 수 있습니다.kubectl get rs -n cka-workloads로 리비전마다 ReplicaSet 이 남는 것을 눈으로 확인해 보세요.- 흔한 실수 1: 6단계에서
set image로 옛 태그를 다시 넣는 것. 그건 롤백이 아니라 새 리비전입니다. - 흔한 실수 2: 8단계에서 StatefulSet 의 파드 라벨과 헤드리스 서비스 셀렉터를 어긋나게 두는 것.
app=db로 맞춰야 합니다.
단계 8개
- Deployment 만들기
- 스케일하고 Ready 확인하기
- 롤링 업데이트 파라미터 조정하기
- 이미지 교체하고 롤아웃 완료 기다리기
- 리비전 히스토리 확인하고 저장하기
- 이전 리비전으로 되돌리기
- DaemonSet 배포하기
- 헤드리스 서비스와 StatefulSet 묶기