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.replicas4로 바꾼다.

적용 전에 로컬 변경 사항을 클러스터 상태와 비교한다:

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)