EKS 노드 오토스케일링 — Karpenter vs Cluster Autoscaler
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 도 같이 사라집니다.
댓글 0