노드 오토스케일링
노드 오토스케일링 (Node Autoscaling)
클러스터에서 워크로드를 실행하려면 노드(Node) 가 필요해요. 그런데 이 노드들을 수요에 맞춰 자동으로 늘리고 줄일 수 있다면, 필요한 용량을 확보하면서 비용까지 최적화할 수 있겠죠. 이 페이지는 바로 그 역할을 하는 노드 오토스케일러(Node autoscaler) 에 대해 다루는 페이지예요. 쉽게 말해, 팟이 늘어나면 노드를 자동으로 추가(provision)하고, 팟이 줄어들면 노드를 자동으로 정리(consolidate)하는 기능입니다.
노드 프로비저닝 (Node provisioning)
클러스터에 기존 노드로는 스케줄링할 수 없는 팟이 있다면, 그 팟을 수용하기 위해 새 노드를 자동으로 추가할 수 있어요. 팟 수가 시간에 따라 변하는 경우(예: 수평 워크로드 오토스케일링과 노드 오토스케일링을 함께 쓰는 경우) 특히 유용합니다.
오토스케일러는 이들을 뒷받침하는 클라우드 프로바이더 리소스를 생성·삭제함으로써 노드를 프로비저닝해요. 대부분의 경우 노드를 뒷받침하는 리소스는 가상 머신(VM) 입니다.
프로비저닝의 주요 목표는 모든 팟을 스케줄링 가능하게 만드는 것이에요. 하지만 프로비저닝 상한에 도달하거나, 프로비저닝 설정이 특정 팟 집합과 호환되지 않거나, 클라우드 프로바이더의 용량이 부족한 등 다양한 제약 때문에 항상 도달 가능한 목표는 아닙니다.
프로비저닝 중에 노드 오토스케일러는 추가 목표(예: 프로비저닝된 노드의 비용 최소화, 장애 도메인 간 노드 수 균형)도 달성하려고 해요.
오토스케일러가 프로비저닝할 노드를 결정할 때 사용하는 두 가지 주요 입력은 팟 스케줄링 제약 조건과 오토스케일러 설정이 부과하는 노드 제약 조건이에요. 오토스케일러 설정에는 노드 수가 설정된 최소값 아래로 떨어지는 것 같은 다른 프로비저닝 트리거가 포함될 수도 있습니다.
참고: 프로비저닝은 예전에 Cluster Autoscaler에서 scale-up이라고 불리던 것입니다.
팟 스케줄링 제약 조건 (Pod scheduling constraints)
팟은 스케줄링 제약 조건을 표현해서 어떤 종류의 노드에 배치될 수 있는지 제한할 수 있어요. 노드 오토스케일러는 이 제약을 고려해 대기 중인 팟들이 프로비저닝된 노드에 스케줄링될 수 있도록 보장합니다.
가장 흔한 스케줄링 제약 조건은 팟 컨테이너가 지정한 리소스 요청(request) 입니다. 오토스케일러는 프로비저닝된 노드가 그 요청을 충족할 만큼 충분한 리소스를 갖도록 보장해요. 다만, 팟이 실행된 후의 실제 리소스 사용량은 직접 고려하지 않습니다.
팟의 실제 리소스 사용량에 기반해 노드를 오토스케일링하려면, 수평 워크로드 오토스케일링과 노드 오토스케일링을 함께 사용할 수 있어요.
오토스케일러 설정이 부과하는 노드 제약 조건
프로비저닝되는 노드의 세부 사항(예: 리소스 양, 특정 라벨 존재 여부)은 오토스케일러 설정에 따라 달라져요. 오토스케일러는 미리 정의된 노드 설정 집합에서 선택하거나, 자동 프로비저닝(auto-provisioning) 을 사용할 수 있습니다.
자동 프로비저닝 (Auto-provisioning)
노드 자동 프로비저닝은 사용자가 프로비저닝 가능한 노드의 세부 사항을 전부 설정하지 않아도 되는 프로비저닝 모드예요. 대신 오토스케일러가 반응 중인 대기 팟과 미리 구성된 제약 조건에 따라 노드 구성을 동적으로 선택합니다.
노드 통합 (Node consolidation)
클러스터를 운영할 때 핵심 고려 사항은 모든 스케줄 가능한 팟을 실행하면서도 클러스터 비용을 최대한 낮추는 것이에요. 이를 위해 팟의 리소스 요청이 노드의 리소스를 최대한 활용하도록 해야 합니다.
참고: 팟의 리소스 요청을 올바르게 설정하는 것은 노드 활용도를 최적화하는 것만큼이나 클러스터의 비용 효율성에 중요해요. 노드 오토스케일링을 수직 워크로드 오토스케일링과 결합하면 이를 달성하는 데 도움이 됩니다.
클러스터의 노드는 전체 노드 활용도를 높이고 결과적으로 비용 효율성을 개선하기 위해 자동으로 통합(consolidate) 될 수 있어요. 통합은 활용도가 낮은 노드 집합을 클러스터에서 제거하는 방식으로 이루어집니다. 선택적으로, 다른 노드 집합을 프로비저닝해 교체할 수도 있어요.
통합은 프로비저닝과 마찬가지로 결정을 내릴 때 팟의 리소스 요청만 고려하지 실제 리소스 사용량은 고려하지 않습니다.
통합 목적에서, 노드에 DaemonSet과 정적 팟(static pod)만 실행 중이라면 그 노드는 비어 있는(empty) 것으로 간주합니다. 비어 있는 노드를 제거하는 것은 그렇지 않은 노드보다 훨씬 간단하며, 오토스케일러는 종종 빈 노드 통합을 위해 특별히 최적화된 기능을 가지고 있어요.
참고: 오토스케일러는 노드가 프로비저닝되거나 통합된 후 재생성된 팟이 어떻게 스케줄링될지 예측하지만, 실제 스케줄링을 제어하지는 않아요. 그 때문에 일부 팟은 통합 결과 pending 상태가 될 수도 있습니다(예: 통합이 진행되는 동안 완전히 새로운 팟이 나타나는 경우).
오토스케일러 설정으로 다른 조건(예: 노드 생성 후 경과 시간)에 따라 통합을 트리거할 수도 있으며, 이를 통해 다른 속성(예: 클러스터 내 노드의 최대 수명)을 최적화할 수 있어요. 통합 수행 방식의 세부 사항은 오토스케일러 설정에 따라 달라집니다. 통합은 예전에 Cluster Autoscaler에서 scale-down이라고 불렸습니다.
오토스케일러 (Autoscalers)
앞서 설명한 기능들은 노드 오토스케일러가 제공해요. 오토스케일러는 쿠버네티스 API 외에도 클라우드 프로바이더 API와 상호작용해야 노드를 프로비저닝하고 통합할 수 있습니다. 즉, 각 지원되는 클라우드 프로바이더와 명시적으로 통합되어야 한다는 뜻이에요.
오토스케일러 구현체 (Autoscaler implementations)
현재 SIG Autoscaling이 후원하는 노드 오토스케일러는 Cluster Autoscaler 와 Karpenter 두 가지예요. 클러스터 사용자 관점에서 두 오토스케일러는 비슷한 노드 오토스케일링 경험을 제공합니다. 둘 다 스케줄 불가능한 팟을 위해 새 노드를 프로비저닝하고, 최적으로 활용되지 않는 노드를 통합해요.
Cluster Autoscaler
Cluster Autoscaler는 미리 구성된 노드 그룹(Node group) 에 노드를 추가하거나 제거해요. 노드 그룹은 일반적으로 어떤 종류의 클라우드 프로바이더 리소스 그룹(대부분 가상 머신 그룹)에 매핑됩니다. Cluster Autoscaler의 단일 인스턴스는 여러 노드 그룹을 동시에 관리할 수 있어요. 프로비저닝 시 대기 팟의 요청에 가장 잘 맞는 그룹에 노드를 추가하고, 통합 시에는 하부 클라우드 프로바이더 리소스 그룹의 크기를 조정하는 대신 항상 제거할 특정 노드를 선택합니다.
Karpenter
Karpenter는 클러스터 운영자가 제공한 NodePool 설정에 따라 노드를 자동 프로비저닝해요. Karpenter는 오토스케일링뿐만 아니라 노드 라이프사이클의 모든 측면을 처리합니다. 여기에는 노드가 특정 수명에 도달하면 자동으로 새로 고치는 것도 포함됩니다.
구현체 비교 (Implementation comparison)
- Cluster Autoscaler는 노드 오토스케일링에만 관련된 기능을 제공해요. Karpenter는 범위가 더 넓어 노드 라이프사이클 전반을 관리하는 기능(예: 노드가 특정 수명에 도달하면 disruption을 활용해 자동 재생성하거나 새 버전으로 자동 업그레이드)도 제공합니다.
- Cluster Autoscaler는 자동 프로비저닝을 지원하지 않으며, 프로비저닝할 노드 그룹을 미리 설정해야 해요. Karpenter는 자동 프로비저닝을 지원하므로 사용자는 동질적인(homogeneous) 그룹을 전부 구성하는 대신 프로비저닝될 노드의 제약 조건 집합만 설정하면 됩니다.
- Cluster Autoscaler는 클라우드 프로바이더 통합을 직접 제공하며, 이는 쿠버네티스 프로젝트의 일부입니다. Karpenter의 경우 쿠버네티스 프로젝트가 Karpenter를 라이브러리로 배포하고, 클라우드 프로바이더가 이 라이브러리와 통합해 노드 오토스케일러를 구축합니다.
워크로드와 노드 오토스케일링 결합하기 (Combine workload and Node autoscaling)
수평 워크로드 오토스케일링 (Horizontal workload autoscaling)
노드 오토스케일링은 보통 팟에 반응해서 동작해요 — 스케줄 불가능한 팟을 수용하기 위해 새 노드를 프로비저닝하고, 더 이상 필요 없어지면 노드를 통합합니다.
수평 워크로드 오토스케일링은 워크로드 레플리카 수를 자동으로 조정해 레플리카 전체의 평균 리소스 활용도를 원하는 수준으로 유지해요. 즉, 애플리케이션 부하에 반응해 새 팟을 자동으로 만들고, 부하가 줄어들면 팟을 제거합니다.
노드 오토스케일링을 수평 워크로드 오토스케일링과 함께 사용하면, 팟의 실제 평균 리소스 활용도에 기반해 클러스터의 노드를 오토스케일링할 수 있어요.
- 애플리케이션 부하가 증가하면 팟의 평균 활용도도 증가하고, 워크로드 오토스케일러가 새 팟을 만들어요. 그러면 노드 오토스케일러가 새 팟을 수용하기 위해 새 노드를 프로비저닝합니다.
- 애플리케이션 부하가 감소하면 워크로드 오토스케일러가 불필요한 팟을 제거하고, 노드 오토스케일러는 더 이상 필요 없는 노드를 통합해요.
관련 컴포넌트 (Related components)
Descheduler
descheduler는 커스텀 정책 기반의 노드 통합 기능과 함께, 자주 재시작하는 팟 삭제 같은 노드·팟 최적화 관련 기능을 제공하는 컴포넌트예요.
클러스터 크기 기반 워크로드 오토스케일러
Cluster Proportional Autoscaler와 Cluster Proportional Vertical Autoscaler는 클러스터의 노드 수에 기반한 수평·수직 워크로드 오토스케일링을 제공합니다. 자세한 내용은 클러스터 크기 기반 오토스케일링 문서를 참고하세요.