3부: 스케일링과 Disruption

노드를 고르고, 줄이고, 바꾸는 규칙

requirements는 넓게, 제약은 명확하게

requirements:
- key: karpenter.sh/capacity-type
  operator: In
  values: ["spot", "on-demand"]
- key: karpenter.k8s.aws/instance-category
  operator: In
  values: ["c", "m", "r"]
- key: kubernetes.io/arch
  operator: In
  values: ["amd64", "arm64"]
계열 단위로 넓게
특정 유형 몇 개보다 category, generation 같은 속성으로 후보를 넓힙니다.
Spot은 유연성이 조건
single-node spot-to-spot 교체는 instance type 15개 이상 유연성이 필요합니다.
capacity-type을 비워 두면: 두 방식 모두 reserved, spot, on-demand 순서로 고릅니다. Auto Mode 기본 풀은 On-Demand 고정이라 Spot은 커스텀 NodePool에서, self-managed는 비워 두면 Spot이 먼저 선택되니 의도를 명시하세요.

Consolidation: 절감이 중단보다 클 때

WhenEmpty
빈 노드만 회수합니다. DaemonSet만 남은 노드도 빈 노드입니다.
WhenEmptyOrUnderutilized
작은 절감이라도 있으면 교체합니다. upstream 기본값
Balanced
절감 비율이 유발하는 Pod disruption 비율보다 가치 있을 때만 실행
2026-07-11 Karpenter v1.14.0
upstream에 Balanced 추가, opt-in
2026-07-27 Auto Mode
NodePool에 Balanced 추가, 기존 NodePool 동작은 그대로
2026-10-01 EKS 1.37
새로 만든 NodePool 중 정책 미지정은 Balanced, built-in pool도 Balanced
GitOps라면 명시하세요: 기본값은 생성 시점에만 적용됩니다. 미지정 NodePool을 재생성하면 Git에는 값이 없고 live 객체는 Balanced인 drift가 생깁니다.

Balanced는 이렇게 채점한다

① 절감 비율 (절감액 ÷ 풀 비용)-
② 중단 비율 (이동 중단 ÷ 풀 중단)-
③ score = ① ÷ ②-
0.5 (1/k, k=2)

스케줄러 점수: 흩을까, 모을까

여유가 많은 노드에 새 Pod를 보냅니다. 노드마다 여유를 남기는 분산 배치입니다.
노드 A
노드 B
노드 C, 선택
기존 Pod requests새 Pod개념 그림, 사용률은 예시
consolidation과의 관계
MostAllocated는 적게 쓰인 노드에 새 Pod를 보내지 않아, 그 노드가 비면 Auto Mode나 Karpenter가 정리할 수 있습니다.
aws eks update-cluster-config \
  --name $CLUSTER \
  --kube-scheduler-config \
  '{"nodeResourcesFit":{"scoringStrategy":
    {"type":"MostAllocated"}}}'
EKS control plane configuration
2026-08-12 출시, Kubernetes 1.31 이상. 가중치 1 to 100: cpu, memory, nvidia.com/gpu, Neuron
노드 생성, 삭제 방식은 그대로
Pod 배치 점수만 바뀝니다. 클러스터 전체 적용, 실행 중 Pod는 옮기지 않고, 밀집할수록 노드 장애 영향이 커집니다.

In-place resize: 재시작 없이 requests를 줄인다

1.35 GA
컨테이너 in-place resize, resize subresource
1.36 Beta, 기본 켜짐
Pod 단위 .spec.resources도 Pod 재생성 없이 resize
1.37 Alpha
노드가 꽉 차 Deferred된 resize를 위해 scheduler가 낮은 priority Pod를 preempt
워크로드CPU req=limitGuaranteedrestartCountcontainerID
Deployment (Pod 2개)200m → 50m유지0 → 0동일
StatefulSet200m → 50m유지0 → 0동일
DaemonSet200m → 50m유지0 → 0동일
실측 2026-06, EKS 1.36.1, AL2023 arm64 노드(Auto Mode 아님): startup probe 통과 후 pods/resize로 축소, memory 고정
노드 자동화와 만나는 지점
Karpenter v1.14.0부터 Pod 크기를 requests와 allocatedResources 중 큰 값으로 계산합니다. requests가 줄면 consolidation 여지가 생깁니다.
주의
QoS class는 바뀌지 않고, memory 축소는 재시작될 수 있습니다. Auto Mode의 resize 동작은 AWS 문서에 따로 없습니다.

Disruption budget: 한 번에 몇 대까지

disruption:
  consolidationPolicy: Balanced
  budgets:
  - nodes: "10%"
  - nodes: "0"
    schedule: "0 0 * * 1-5"  # UTC
    duration: 9h
    reasons: ["Underutilized", "Drifted"]
40
10%
1
0
-
지금 허용되는 voluntary disruption 수
여러 budget은 최솟값
미지정 시 nodes: 10% 하나. Auto Mode 기본도 같습니다.
schedule은 UTC만
위 예시는 평일 KST 09시부터 9시간 동안 교체 금지입니다.
만료는 막지 못함
expireAfter에 의한 교체는 budget과 무관하게 진행됩니다.

Drift와 만료: 노드는 결국 교체된다

Drift를 일으킴
NodePool template과 NodeClass spec 변경. requirements, subnet, SG, AMI는 resolve 결과로 비교
Drift를 일으키지 않음
spec.weight, spec.limits, spec.disruption.*
AMI는 alias로 고정
al2023@v20261012처럼 pin. @latest는 새 AMI마다 전체 Drift라 프로덕션 비권장
Auto Mode는 AMI가 Drift 신호
새 AMI가 대략 주 1회 나오고 Drift로 롤링. advancedCompute 변경도 in-place 없이 Drift
만료는 강제입니다: NodePool budget을 무시하고 대체 노드 Ready를 기다리지 않습니다. expireAfter를 바꾸면 기존 NodeClaim은 Drift로 교체됩니다.

Spot 중단: 2분 경고는 누가 받나

Self-managed: SQS와 EventBridge를 직접

  • SQS interruption queue, Helm settings.interruptionQueue로 연결
  • EventBridge rule 5개: Spot Interruption Warning, Rebalance, State-change, AWS Health, Capacity Reservation Interruption
  • Spot 경고를 받으면 drain과 새 노드 생성을 병행
  • Rebalance Recommendation은 이벤트 기록만 함

Auto Mode: AWS가 처리

  • Spot 중단 알림, EC2 health 이벤트, 상태 검사 실패를 자동 처리
  • 사용자가 SQS나 EventBridge를 구성하지 않음
  • ARC zonal shift 시 해당 AZ의 노드 생성과 자발적 disruption 중지
queue를 안 붙이면 비활성
self-managed에서 interruptionQueue가 없으면 interruption 처리가 꺼집니다.
FIS EC2 action은 Auto Mode 미지원
SendSpotInstanceInterruptions 포함. Spot 중단 리허설은 self-managed 노드에서 합니다.

교체 중 앱을 지키는 장치들

PodDisruptionBudgetPod 그룹
drain 중 동시에 빠질 수 있는 Pod 수를 제한합니다. Karpenter와 Auto Mode 모두 존중
karpenter.sh/do-not-disruptPod 또는 Node
자발적 disruption 대상에서 뺍니다. 배치 작업처럼 끊으면 안 되는 Pod에 사용
karpenter.sh/disruption-costPod, v1.15
consolidation 비용 가중치. pod-deletion-cost로 조정하는 방식은 deprecated
karpenter.sh/do-not-repairNode, v1.15 신규
Node Auto Repair 대상에서 제외합니다.
보호에는 끝이 있습니다: terminationGracePeriod를 설정하면 blocking PDB나 do-not-disrupt가 있어도 Drift 교체가 진행됩니다. Auto Mode는 21일 최대 수명에서 blocking PDB가 있으면 개입이 필요할 수 있습니다.