Deployment 수평 스케일링하기
Deployment 수평 스케일링하기 (Scale a Deployment)
이 페이지에서는 replica 수를 변경해 Deployment를 수평으로 수동 스케일링하는 방법을 보여줘요. 수동 스케일링을 사용하면 예측 가능한 부하 변화나 비용 관리를 위해 실행 중인 파드 수를 직접 제어할 수 있습니다.
이는 수직 스케일링(replica 수는 그대로 두고 각 파드에 사용 가능한 리소스의 양을 조정하는 것)과는 다릅니다.
출처: 문서
본문
목표 (Objectives)
- 더 많은 트래픽을 처리하도록 Deployment를 스케일 업한다.
- 리소스를 절약하도록 Deployment를 스케일 다운한다.
- 워크로드를 일시 중단하도록 Deployment를 0으로 스케일링한다.
- 수동 스케일링과 HorizontalPodAutoscaler를 언제 써야 하는지 이해한다.
시작하기 전에
기존 Deployment가 필요해요. 없고 연습만 하고 싶다면 무상태 애플리케이션 실행하기에서 nginx Deployment를 만들 수 있습니다:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
Deployment가 파드 두 개를 실행하는지 확인한다:
kubectl get deployment nginx-deployment
출력은 다음과 비슷합니다:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 10s
Deployment 스케일 업하기
기존 Deployment의 replica 수를 바꾸는 방법은 여러 가지가 있어요.
kubectl scale로 스케일 업하기
kubectl scale을 사용해 replica 수를 설정한다:
kubectl scale deployment/nginx-deployment --replicas=4
출력은 다음과 비슷합니다:
deployment.apps/nginx-deployment scaled
Deployment에 파드가 네 개 있는지 확인한다:
kubectl get deployment nginx-deployment
출력은 다음과 비슷합니다:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 4/4 4 4 1m
kubectl apply로 선언적 스케일링하기
명령형(imperative) 명령을 실행하는 대신 매니페스트 파일을 갱신하고 적용할 수 있어요. 이 방식은 버전 관리되는 구성 워크플로에 잘 맞습니다.
현재 Deployment 구성을 로컬 파일에 저장한다:
kubectl get deployment nginx-deployment -o yaml > /tmp/nginx-deployment.yaml
/tmp/nginx-deployment.yaml을 편집하고 .spec.replicas를 4로 바꾼다.
적용 전에 로컬 변경 사항을 클러스터 상태와 비교한다:
kubectl diff -f /tmp/nginx-deployment.yaml
편집한 매니페스트를 적용한다:
kubectl apply -f /tmp/nginx-deployment.yaml
Deployment 스케일 다운하기
파드 수를 줄이려면 --replicas를 더 낮은 값으로 설정한다:
kubectl scale deployment/nginx-deployment --replicas=2
쿠버네티스는 각 파드의 terminationGracePeriodSeconds 설정을 존중하며 초과 파드를 정상적으로 종료합니다.
Deployment에 파드가 두 개 있는지 확인한다:
kubectl get pods -l app=nginx
출력은 다음과 비슷합니다:
NAME READY STATUS RESTARTS AGE
nginx-deployment-66b6c48dd5-7gl6h 1/1 Running 0 2m
nginx-deployment-66b6c48dd5-v8mkd 1/1 Running 0 2m
0으로 스케일링하기
Deployment 자체를 삭제하지 않고 워크로드를 일시적으로 중단하려면 Deployment를 0으로 스케일링할 수 있어요:
kubectl scale deployment/nginx-deployment --replicas=0
실행 중인 파드가 없는지 확인한다:
kubectl get deployment nginx-deployment
출력은 다음과 비슷합니다:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0/0 0 0 5m
0으로 스케일링하면 모든 파드가 제거되지만 Deployment와 그 ReplicaSet은 보존됩니다. --replicas를 양수로 설정하면 언제든 다시 스케일 업할 수 있어요.
0으로 스케일링하는 일반적인 사용 사례는 다음과 같습니다:
- 리소스를 절약하려고 워크로드를 일시 중단
- 디버깅 또는 유지보수 윈도우
- 개발·스테이징 환경의 비용 관리
replica 수를 바꾸는 다른 방법
kubectl scale 외에도 kubectl edit이나 kubectl patch으로 .spec.replicas를 바꿀 수 있어요.
kubectl edit으로 스케일링하기
kubectl edit deployment nginx-deployment
편집기에서 .spec.replicas 필드를 바꾼 뒤 저장하고 종료한다.
kubectl patch로 스케일링하기
전략적 병합 패치(strategic merge patch)로 .spec.replicas를 갱신할 수 있어요:
kubectl patch deployment nginx-deployment -p '{"spec":{"replicas":4}}'
스크립팅을 위해서는 전제 조건 테스트가 있는 JSON 패치를 사용하세요. 다음 명령은 현재 개수가 2일 때만 replica 수를 4로 설정합니다:
kubectl patch deployment nginx-deployment --type=json -p='[
{"op": "test", "path": "/spec/replicas", "value": 2},
{"op": "replace", "path": "/spec/replicas", "value": 4}
]'
test 연산은 현재 값이 일치하지 않으면 패치를 실패시키므로, 여러 사람이나 스크립트가 같은 Deployment를 수정할 때 의도하지 않은 변경을 방지합니다.
수동 스케일링과 자동 스케일링을 언제 사용할까
| 측면 | 수동 스케일링 | 자동 스케일링 (HPA) |
|---|---|---|
| 가장 적합한 경우 | 예측 가능·예약·일회성 부하 변화 | 변동이 크거나 예측 불가한 수요 |
| 동작 방식 | .spec.replicas를 직접 설정 |
HPA가 관찰된 메트릭을 기반으로 replica 조정 |
| 응답 시간 | 명령을 실행하면 즉시 | 짧은 지연 후 메트릭에 반응 |
| 메트릭 인지 | 없음 — replica 수를 직접 결정 | CPU, 메모리 또는 사용자 정의 메트릭 모니터링 |
| 유지보수 | 조정하려면 수동 개입 필요 | 구성 후 자율적으로 실행 |
HorizontalPodAutoscaler가 Deployment를 관리한다면 replica를 수동으로 설정하지 마세요. HPA는 replica 수를 지속적으로 조정하며 수동 변경을 덮어씁니다.
정리하기
Deployment를 삭제한다:
kubectl delete deployment nginx-deployment
더 알아보기 (Learn more)
- Deployment에 대해 더 알아보기.
- Horizontal Pod Autoscaling 실습하기.
- StatefulSet 스케일링 방법 알아보기.
- 리소스 관리 읽어보기.