쿠버네티스에서는 현재 리소스 수요에 따라 워크로드를 스케일링 할 수 있다. 이를 통해 클러스터가 리소스 수요 변화에 보다 탄력적이고 효율적으로 대응할 수 있다.
워크로드를 스케일링할 때는, 워크로드가 관리하는 레플리카 수를 늘리거나 줄일 수 있고, 혹은 레플리카가 사용할 수 있는 리소스를 인플레이스(in-place)로 조정할 수 있다.
첫 번째 방법을 수평 스케일링(horizontal scaling) 이라고 부르며, 두 번째 방법을 수직 스케일링(vertical scaling) 이라고 부른다.
워크로드 스케일링은 사용 사례에 따라 수동 또는 자동으로 수행할 수 있다.
쿠버네티스는 워크로드의 수동 스케일링(manual scaling) 을 지원한다. 수평 스케일링은
kubectl CLI를 사용해 수행할 수 있다.
수직 스케일링의 경우, 워크로드의 리소스 정의를 패치 해야 한다.
두 전략의 예는 다음과 같다.
쿠버네티스는 워크로드의 자동 스케일링(automatic scaling) 도 지원하는데, 이 페이지는 이를 중점적으로 다룬다.
쿠버네티스에서 오토스케일링 이라는 개념은 파드 집합을 관리하는 오브젝트(예를 들면 디플로이먼트)를 자동으로 업데이트하는 기능을 말한다.
쿠버네티스에서는 HorizontalPodAutoscaler(HPA)를 이용하여 워크로드를 수평으로 자동 스케일링할 수 있다.
이것은 쿠버네티스 API 리소스와 컨트롤러로 구현되어 있으며, CPU나 메모리 사용량과 같은 관측된 리소스 사용률에 맞춰 워크로드의 레플리카 수를 주기적으로 조정한다.
디플로이먼트에 HorizontalPodAutoscaler를 구성하는 연습 튜토리얼이 있다.
VerticalPodAutoscaler(VPA)를 이용하여 워크로드를 수직으로 자동 스케일링할 수 있다. HPA와 달리 VPA는 쿠버네티스에 기본으로 포함되지 않는 애드온이며, 사용하기 전에 사용자나 클러스터 관리자가 배포해야 할 수도 있다.
설치 후에는, 워크로드에 대한 커스텀리소스데피니션(CustomResourceDefinition) (CRD)을 생성하여, 관리되는 레플리카의 리소스를 어떻게, 언제 스케일링할지 정의한다.
This is a stable feature in Kubernetes, and has been since version v1.35. It was first available in the v1.27 release. You can no longer disable or opt out of this feature or behavior (it is locked); if you explicitly set a value for the associated feature gate InPlacePodVerticalScaling, Kubernetes ignores it but does not report any error.
쿠버네티스 1.37 기준으로, VPA는 파드를 인플레이스로 리사이즈하는 것을 지원하지 않지만, 해당 통합 작업은 진행 중이다. 파드를 수동으로 인플레이스 리사이즈하려면, 컨테이너에 할당된 CPU와 메모리 리소스 크기 조정하기를 참고한다.
클러스터의 크기에 따라 스케일링이 필요한 워크로드(예를 들면 cluster-dns나 다른 시스템 컴포넌트)의 경우,
Cluster Proportional Autoscaler를
사용할 수 있다.
VPA와 마찬가지로, 이것은 쿠버네티스 코어의 일부가 아니며,
GitHub에서 별도 프로젝트로 호스팅된다.
Cluster Proportional Autoscaler는 스케줄링 가능한 노드 수와 코어 수를 감시하고, 이에 맞춰 대상 워크로드의 레플리카 수를 스케일링한다.
만약 레플리카 수를 그대로 유지해야 한다면, Cluster Proportional Vertical Autoscaler를 사용하여 클러스터의 크기에 따라 워크로드를 수직으로 스케일링할 수 있다. 이 프로젝트는 현재 베타 상태이며, GitHub에서 확인할 수 있다.
Cluster Proportional Autoscaler가 워크로드의 레플리카 수를 스케일링하는 반면, Cluster Proportional Vertical Autoscaler는 클러스터의 노드나 코어 수를 기반으로 워크로드(예를 들면 디플로이먼트나 데몬셋(DaemonSet))의 리소스 요청(request)을 조정한다.
이벤트를 기반으로 워크로드를 스케일링하는 것도 가능한데, 예를 들면 Kubernetes Event Driven Autoscaler (KEDA)가 있다.
KEDA는 CNCF 졸업(graduated) 프로젝트로, 처리해야 할 이벤트의 수(예를 들면 큐에 존재하는 메시지의 양)를 기반으로 워크로드를 스케일링할 수 있게 한다. 다양한 이벤트 소스에 맞는 폭넓은 어댑터 중에서 선택할 수 있다.
워크로드를 스케일링하는 또 다른 전략은 스케일링 작업을 스케줄링하는 것인데, 예를 들어 비혼잡 시간대에 리소스 소비를 줄이기 위해 사용할 수 있다.
이벤트 기반 오토스케일링과 비슷하게, 이 기능도 KEDA와 Cron scaler를
함께 사용하여 구현할 수 있다.
Cron scaler를 사용하면 워크로드를 확장하거나 축소할 스케줄(과 시간대)을 정의할 수 있다.
만약 워크로드 스케일링만으로 필요를 충족할 수 없다면, 클러스터 인프라 자체를 스케일링할 수도 있다.
클러스터 인프라를 스케일링하는 것은 일반적으로 노드를 추가하거나 제거하는 것을 의미한다. 자세한 내용은 노드 오토스케일링을 참고한다.