노드 자동 확장

노드 자동 확장 (Node Autoscaling)

클러스터에서 워크로드를 실행하려면 노드가 필요합니다. 클러스터의 노드는 자동 확장(autoscaled) 될 수 있고, 필요한 용량을 제공하면서 비용을 최적화하도록 동적으로 프로비저닝되거나 통합될 수 있습니다. 자동 확장은 노드 autoscaler에 의해 수행됩니다.

출처: 문서

본문

노드 프로비저닝 {#provisioning}

기존 노드에 스케줄링할 수 없는 파드가 클러스터에 있다면, 그 파드를 수용하도록 새 노드를 클러스터에 자동으로 추가 — 프로비저닝 — 할 수 있습니다. 이는 파드 수가 시간에 따라 변할 때 특히 유용합니다. 예를 들어 수평 워크로드 오토스케일링과 노드 자동 확장을 결합한 결과로 그런 경우가 있습니다.

Autoscaler는 노드를 뒷받침하는 클라우드 제공자 리소스를 만들고 삭제해 노드를 프로비저닝합니다. 가장 흔히 노드를 뒷받침하는 리소스는 가상 머신입니다.

프로비저닝의 주요 목표는 모든 파드를 스케줄링 가능하게 만드는 것입니다. 이 목표는 구성된 프로비저닝 제한에 도달하거나, 프로비저닝 구성이 특정 파드 집합과 호환되지 않거나, 클라우드 제공자 용량이 부족한 등 다양한 제한 때문에 항상 달성 가능한 것은 아닙니다. 프로비저닝 중 노드 autoscaler는 종종 추가 목표를 달성하려 시도합니다(예를 들어 프로비저닝된 노드의 비용 최소화 또는 장애 도메인 간 노드 수 균형).

노드 autoscaler가 프로비저닝할 노드를 결정할 때 두 가지 주요 입력이 있습니다 — 파드 스케줄링 제약autoscaler 구성이 부과하는 노드 제약입니다.

Autoscaler 구성은 다른 노드 프로비저닝 트리거도 포함할 수 있습니다(예: 노드 수가 구성된 최소 제한 아래로 떨어지는 경우).

프로비저닝은 Cluster Autoscaler에서 이전에 스케일 업(scale-up) 이라고 불렸습니다.

파드 스케줄링 제약 {#provisioning-pod-constraints}

파드는 스케줄링 제약을 표현해 어떤 종류의 노드에 스케줄링될 수 있는지 제한을 부과할 수 있어요. 노드 autoscaler는 대기 중인 파드가 프로비저닝된 노드에 스케줄링될 수 있도록 이러한 제약을 고려합니다.

가장 흔한 종류의 스케줄링 제약은 파드 컨테이너가 지정한 리소스 요청입니다. Autoscaler는 프로비저닝된 노드가 요청을 충족할 충분한 리소스를 가지도록 보장합니다. 그러나 파드가 실행을 시작한 후 실제 리소스 사용량은 직접 고려하지 않습니다. 실제 워크로드 리소스 사용량을 기준으로 노드를 자동 확장하려면 수평 워크로드 자동 확장을 노드 자동 확장과 결합할 수 있습니다.

다른 일반적인 파드 스케줄링 제약에는 노드 선호도(Node affinity), 파드 간 선호도, 또는 특정 스토리지 볼륨 요구 사항이 있습니다.

autoscaler 구성이 부과하는 노드 제약 {#provisioning-node-constraints}

프로비저닝된 노드의 세부 사항(예: 리소스 양, 주어진 라벨의 존재)은 autoscaler 구성에 달려 있습니다. Autoscaler는 사전 정의된 노드 구성 집합에서 선택하거나 자동 프로비저닝을 사용할 수 있습니다.

자동 프로비저닝 {#autoprovisioning}

노드 자동 프로비저닝은 사용자가 프로비저닝될 수 있는 노드의 세부 사항을 완전히 구성할 필요가 없는 프로비저닝 모드입니다. 대신 autoscaler가 반응하는 대기 중인 파드와 사전 구성된 제약(예: 최소 리소스 양 또는 주어진 라벨의 필요성)을 기반으로 노드 구성을 동적으로 선택합니다.

노드 통합 {#consolidation}

클러스터를 운영할 때 주요 고려 사항은 모든 스케줄링 가능한 파드가 실행되도록 보장하면서 클러스터의 비용을 가능한 한 낮게 유지하는 것입니다. 이를 달성하려면 파드의 리소스 요청이 노드의 리소스를 최대한 활용해야 합니다. 이 관점에서 클러스터의 전반적인 노드 활용률은 클러스터가 비용 효율적인 정도의 대리 지표로 사용될 수 있습니다.

파드의 리소스 요청을 올바르게 설정하는 것은 노드 활용률 최적화만큼 클러스터의 전반적인 비용 효율에 중요합니다. 노드 자동 확장과 수직 워크로드 자동 확장을 결합하면 이를 달성하는 데 도움이 될 수 있습니다.

클러스터의 노드는 전반적인 노드 활용률과 결과적으로 클러스터의 비용 효율을 개선하기 위해 자동으로 통합 될 수 있습니다. 통합은 활용도가 낮은 노드 집합을 클러스터에서 제거하는 방식으로 일어납니다. 선택적으로 다른 노드 집합이 그들을 대체하도록 프로비저닝될 수 있습니다.

통합도 프로비저닝처럼 결정을 할 때 파드 리소스 요청만 고려하고 실제 리소스 사용량은 고려하지 않습니다.

통합 목적상, 노드에 DaemonSet과 스태틱 파드만 실행되고 있으면 그 노드는 비어 있는(empty) 것으로 간주됩니다. 통합 중 빈 노드를 제거하는 것은 비어 있지 않은 노드보다 더 간단하며, autoscaler는 종종 빈 노드 통합을 위해 특별히 설계된 최적화를 가집니다.

통합 중 비어 있지 않은 노드를 제거하는 것은 파괴적입니다 — 그 위에서 실행되는 파드가 종료되고 (예를 들어 Deployment에 의해) 재생성되어야 할 수 있습니다. 그러나 그러한 재생성된 모든 파드는 클러스터의 기존 노드 또는 통합의 일부로 프로비저닝된 대체 노드에 스케줄링할 수 있어야 합니다. 일반적으로 통합의 결과로 어떤 파드도 pending 상태가 되어서는 안 됩니다.

Autoscaler는 노드가 프로비저닝되거나 통합된 후 재생성된 파드가 어떻게 스케줄링될지 예측하지만, 실제 스케줄링을 제어하지는 않습니다. 이 때문에 일부 파드는 통합의 결과로 pending 상태가 될 수 있습니다 — 예를 들어 통합이 수행되는 동안 완전히 새로운 파드가 나타나는 경우입니다.

Autoscaler 구성은 다른 조건(예: 노드가 생성된 이후 경과 시간)에 의한 통합 트리거를 활성화해 다른 속성(예: 클러스터의 노드 최대 수명)을 최적화할 수도 있습니다.

통합이 수행되는 방식의 세부 사항은 주어진 autoscaler의 구성에 달려 있습니다.

통합은 Cluster Autoscaler에서 이전에 스케일 다운(scale-down) 이라고 불렸습니다.

Autoscaler {#autoscalers}

이전 섹션에서 설명한 기능은 노드 autoscaler 에 의해 제공됩니다. 쿠버네티스 API 외에도 autoscaler는 노드를 프로비저닝하고 통합하기 위해 클라우드 제공자 API와 상호작용해야 합니다. 이는 각 지원 클라우드 제공자와 명시적으로 통합되어야 함을 의미합니다. 주어진 autoscaler의 성능과 기능 집합은 클라우드 제공자 통합 간에 다를 수 있습니다.

graph TD
    na[Node autoscaler]
    k8s[Kubernetes]
    cp[Cloud Provider]
    k8s --> |get Pods/Nodes|na
    na --> |drain Nodes|k8s
    na --> |create/remove resources backing Nodes|cp
    cp --> |get resources backing Nodes|na

Autoscaler 구현

Cluster AutoscalerKarpenter는 현재 SIG Autoscaling이 후원하는 두 노드 autoscaler입니다.

클러스터 사용자의 관점에서 두 autoscaler 모두 비슷한 노드 자동 확장 경험을 제공해야 합니다. 둘 다 스케줄 불가한 파드를 위해 새 노드를 프로비저닝하고, 더 이상 최적으로 활용되지 않는 노드를 통합할 것입니다.

다른 autoscaler는 이 페이지에 설명된 노드 자동 확장 범위 밖의 기능도 제공할 수 있으며, 그 추가 기능은 서로 다를 수 있습니다.

어떤 autoscaler가 자신의 사용 사례에 더 잘 맞는지 결정하려면 아래 섹션과 개별 autoscaler에 대한 연결 문서를 참조하세요.

Cluster Autoscaler

Cluster Autoscaler는 사전 구성된 노드 그룹(Node groups) 에 노드를 추가하거나 제거합니다. 노드 그룹은 일반적으로 일종의 클라우드 제공자 리소스 그룹(가장 흔히 가상 머신 그룹)에 매핑됩니다. Cluster Autoscaler의 단일 인스턴스는 여러 노드 그룹을 동시에 관리할 수 있습니다. 프로비저닝할 때 Cluster Autoscaler는 대기 중인 파드의 요청에 가장 잘 맞는 그룹에 노드를 추가합니다. 통합할 때 Cluster Autoscaler는 기반 클라우드 제공자 리소스 그룹의 크기를 조정하는 대신 항상 제거할 특정 노드를 선택합니다.

추가 컨텍스트:

Karpenter

Karpenter는 클러스터 운영자가 제공한 NodePool 구성을 기반으로 노드를 자동 프로비저닝합니다. Karpenter는 자동 확장뿐만 아니라 노드 라이프사이클의 모든 측면을 처리합니다. 여기에는 노드가 특정 수명에 도달하면 자동으로 새로 고치고, 새 워커 노드 이미지가 릴리스되면 노드를 자동 업그레이드하는 것이 포함됩니다. 개별 클라우드 제공자 리소스(가장 흔히 개별 가상 머신)와 직접 작업하며, 클라우드 제공자 리소스 그룹에 의존하지 않습니다.

추가 컨텍스트:

구현 비교

Cluster Autoscaler와 Karpenter의 주요 차이점:

  • Cluster Autoscaler는 노드 자동 확장과 관련된 기능만 제공합니다. Karpenter는 더 넓은 범위로 노드 라이프사이클 전체를 관리하기 위한 기능도 제공합니다(예: 노드가 특정 수명에 도달하면 중단(disruption)을 활용해 자동 재생성하거나 새 버전으로 자동 업그레이드).
  • Cluster Autoscaler는 자동 프로비저닝을 지원하지 않으며, 프로비저닝할 수 있는 노드 그룹이 사전 구성되어야 합니다. Karpenter는 자동 프로비저닝을 지원하므로 사용자는 균질한 그룹을 완전히 구성하는 대신 프로비저닝된 노드에 대한 제약 집합만 구성하면 됩니다.
  • Cluster Autoscaler는 클라우드 제공자 통합을 직접 제공하므로 쿠버네티스 프로젝트의 일부입니다. Karpenter의 경우, 쿠버네티스 프로젝트는 노드 autoscaler를 구축하기 위해 클라우드 제공자가 통합할 수 있는 라이브러리로 Karpenter를 게시합니다.
  • Cluster Autoscaler는 더 작고 덜 인기 있는 제공자를 포함해 많은 클라우드 제공자와의 통합을 제공합니다. Karpenter와 통합하는 클라우드 제공자는 더 적으며, AWS, Azure가 있습니다.

워크로드와 노드 자동 확장 결합

수평 워크로드 자동 확장 {#horizontal-workload-autoscaling}

노드 자동 확장은 보통 파드에 반응하여 동작합니다 — 스케줄 불가한 파드를 수용하기 위해 새 노드를 프로비저닝하고, 더 이상 필요 없으면 노드를 통합합니다.

수평 워크로드 자동 확장은 replica 간 원하는 평균 리소스 활용률을 유지하도록 워크로드 replica 수를 자동으로 조정합니다. 다시 말해 애플리케이션 부하에 반응해 새 파드를 자동 생성하고, 부하가 줄면 파드를 제거합니다.

노드 자동 확장을 수평 워크로드 자동 확장과 함께 사용해 파드의 평균 실제 리소스 활용률을 기반으로 클러스터의 노드를 자동 확장할 수 있어요.

애플리케이션 부하가 증가하면 그 파드의 평균 활용률도 증가해 워크로드 자동 확장이 새 파드를 만들게 합니다. 그러면 노드 자동 확장이 새 파드를 수용하도록 새 노드를 프로비저닝해야 합니다.

애플리케이션 부하가 줄면 워크로드 자동 확장이 불필요한 파드를 제거해야 합니다. 노드 자동 확장은 차례로 더 이상 필요 없는 노드를 통합해야 합니다.

올바르게 구성되면 이 패턴은 애플리케이션이 필요 시 부하 급증을 처리할 노드 용량을 항상 갖지만, 필요하지 않을 때 그 용량에 비용을 내지 않도록 보장합니다.

수직 워크로드 자동 확장 {#vertical-workload-autoscaling}

노드 자동 확장을 사용할 때 파드 리소스 요청을 올바르게 설정하는 것이 중요합니다. 주어진 파드의 요청이 너무 낮으면, 그 파드를 위해 새 노드를 프로비저닝해도 파드가 실제로 실행되는 데 도움이 되지 않을 수 있습니다. 주어진 파드의 요청이 너무 높으면, 해당 노드의 통합을 잘못 방해할 수 있습니다.

수직 워크로드 자동 확장은 파드의 과거 리소스 사용량을 기반으로 파드의 리소스 요청을 자동으로 조정합니다.

노드 자동 확장을 수직 워크로드 자동 확장과 함께 사용해 클러스터의 노드 자동 확장 기능을 유지하면서 파드의 리소스 요청을 조정할 수 있어요.

노드 자동 확장을 사용할 때 DaemonSet 파드에 대해 수직 워크로드 자동 확장을 설정하는 것은 권장되지 않습니다. Autoscaler는 새 노드의 DaemonSet 파드가 어떻게 보일지 예측해 사용 가능한 노드 리소스를 예측해야 합니다. 수직 워크로드 자동 확장은 이러한 예측을 신뢰할 수 없게 만들어 잘못된 확장 결정을 초래할 수 있습니다.

관련 구성 요소

이 섹션은 노드 자동 확장과 관련된 기능을 제공하는 구성 요소를 설명합니다.

Descheduler

descheduler는 사용자 정의 정책을 기반으로 노드 통합 기능을 제공하는 구성 요소이며, 노드와 파드 최적화와 관련된 다른 기능도 제공합니다(예: 자주 재시작하는 파드 삭제).

클러스터 크기에 기반한 워크로드 autoscaler

Cluster Proportional AutoscalerCluster Proportional Vertical Autoscaler는 클러스터의 노드 수를 기반으로 수평 및 수직 워크로드 자동 확장을 제공합니다. 클러스터 크기에 기반한 자동 확장에서 더 읽을 수 있습니다.

더 알아보기 (Learn more)