EKS 노드 오토스케일링 — Karpenter vs Cluster Autoscaler

Kubernetes3분조회

EKS 에서 노드를 자동으로 늘리는 방법이 둘입니다. Cluster Autoscaler 와 Karpenter. 둘 다 “Pod 가 Pending 이면 노드를 늘린다” 는 같은 목표인데, 접근이 다릅니다.

Cluster Autoscaler — Node Group 증설

Cluster Autoscaler(CA)는 Node Group 단위로 스케일합니다. 인스턴스 타입별로 그룹을 미리 정의해두고, Pod 가 Pending 이면 “어느 그룹을 늘릴까” 를 판단합니다.

미리 정의된 Node Group:
  group-A: m5.large × 2~10
  group-B: c5.xlarge × 1~5

Pod Pending 감지
  → group-A로 가능? → 노드 +1

여기서 세 가지가 걸립니다.

인스턴스 타입이 미리 고정돼 있어서, 2 CPU 만 필요한 Pod 때문에 4 CPU 노드가 뜨면 나머지가 놀게 됩니다.

Node Group 을 추가하거나 바꾸는 게 수동 작업입니다. 보통 Terraform 을 고쳐야 합니다.

Spot 인스턴스를 다양하게 섞기 어렵습니다. Node Group 별로 타입이 묶여 있어서 Spot 다양성이 제한됩니다.

Karpenter — Pod 요구사항 기반 EC2 직접 선택

Karpenter 는 Node Group 이 없습니다. Pod 가 Pending 이면 그 Pod 에 필요한 CPU·메모리를 보고, EC2 Fleet API 로 최적 인스턴스를 그 자리에서 고릅니다.

Pod Pending 감지
  → 이 Pod에 필요한 CPU/메모리는?
  → EC2에서 그에 맞는 인스턴스를 직접 선택
  → 노드 생성

설정은 NodePool CRD 로 하는데, “어떤 계열, 몇 세대 이상, on-demand/spot” 같은 조건만 주면 그 범위 안에서 Karpenter 가 알아서 고릅니다.

kind: NodePool
spec:
  template:
    spec:
      requirements:
        - key: karpenter.k8s.aws/instance-category
          operator: In
          values: ["c", "m", "r"]      # compute/memory/general 계열
        - key: karpenter.k8s.aws/instance-generation
          operator: Gt
          values: ["2"]                # 3세대 이상만
      expireAfter: 720h                # 노드 30일마다 교체
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 1m

인스턴스 타입을 하나로 고정하는 게 아니라 “이 조건에 맞는 것 아무거나” 라고 범위를 주는 겁니다. 그래서 Spot 을 수십 종류 자동으로 섞을 수 있습니다.

consolidation — CA에 없는 것

Karpenter 에는 노드를 다시 합치는 기능이 있습니다. consolidationPolicy: WhenEmptyOrUnderutilized 를 켜면 이렇게 동작합니다.

노드 A (4 CPU): 1 CPU Pod만 실행 중
노드 B (4 CPU): 비어 있음

Karpenter: "A의 Pod를 더 작은 노드로 옮기고 A를 종료할 수 있나?"
  → 가능하면 Pod 이동 → 노드 A 삭제

쓰다 남은 노드를 더 작은 것으로 갈아 비용을 줄입니다. consolidateAfter: 1m 은 1분간 저사용 상태가 지속될 때만 통합을 시도한다는 뜻입니다. CA 는 이게 없어서, 한 번 뜬 노드가 놀아도 그대로 남습니다.

항목별 차이 — 선택 단위·속도·통합

항목 Cluster Autoscaler Karpenter
노드 선택 단위 Node Group 개별 EC2
인스턴스 타입 미리 고정 실시간 최적 선택
Spot 다양성 그룹별 제한 수십 종 자동 혼용
스케일 속도 수 분 수십 초
노드 통합 없음 consolidation
설정 방식 Node Group (Terraform) NodePool CRD (GitOps)

expireAfter — 노드 주기 교체

expireAfter: 720h 는 노드를 30일마다 갈아치웁니다. 새 AMI 의 보안 패치가 자동으로 따라오고, 오래 뜬 노드에 쌓이는 drift 도 같이 사라집니다.

참고

  1. 불러오는 중