Kubernets

Karpenter consolidationPolicy, 이거 한 번은 짚고 가자

gfrog 2026. 4. 28. 10:11
반응형

오늘 알게 된 건 아니고, 최근에 팀원이 Karpenter 설정 PR을 올렸길래 리뷰하다가 "어 이게 v1.0부터 바뀌었는데 모르는 분들 꽤 많겠네" 싶어서 짧게 정리해둔다.

WhenUnderutilized 라는 이름은 이제 없다

Karpenter 1.0 GA 이후로 WhenUnderutilizedWhenEmptyOrUnderutilized로 이름이 바뀌었다. 옛날 블로그 글이나 사내 위키 보고 그대로 복붙하면 NodePool apply가 깨진다. 지난주에 1.12.0이 나왔는데도 검색하면 아직 옛날 이름이 상위에 뜨더라.

그리고 더 중요한 변화 — 1.0부터는 consolidateAfterWhenEmptyOrUnderutilized에서도 쓸 수 있다. 이전에는 WhenEmpty에서만 동작해서, "노드가 underutilized 상태가 되자마자 consolidation이 들어가서 짧게 튀는 트래픽에도 노드가 줄었다 늘었다 펌핑되는" 현상이 있었다. 이제는 시간을 줄 수 있어서 한결 안정적이다.

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 5m

그래서 둘 중 뭘 써야 하는가

이게 정답은 없는데, 우리 팀 기준은 이렇다.

WhenEmpty는 안전빵이다. 비어있는 노드만 정리하니까 워크로드가 옮겨다닐 일이 없다. 대신 비용 절감 효과는 떨어진다. CPU 20%만 쓰는 8xlarge 노드가 그대로 살아있다.

WhenEmptyOrUnderutilized는 빡세게 줄인다. 노드 안에 파드가 있어도 다른 곳에 더 효율적으로 배치 가능하면 노드를 통째로 갈아끼운다. 비용은 확실히 줄어드는데, 파드 evict가 잦아진다. 우리는 stateful 워크로드(특히 Kafka consumer 그룹)에서 한번 호되게 당한 적이 있어서, 그 NodePool은 그냥 WhenEmpty로 두고 stateless 쪽만 WhenEmptyOrUnderutilized + consolidateAfter: 10m으로 가고 있다.

한 가지 더 — disruption budget을 같이 쓰자

이게 진짜 자주 빠뜨리는 부분이다. consolidation 정책만 설정하고 disruption budget을 안 걸어두면, Karpenter가 한 번에 여러 노드를 동시에 갈아엎을 수 있다. PDB가 있으면 어느 정도 막아주긴 하는데, PDB는 파드 단위지 노드 단위가 아니다.

spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 5m
    budgets:
      - nodes: "10%"
      - nodes: "0"
        schedule: "0 9 * * mon-fri"
        duration: 1h

위 설정은 평소에는 전체 노드의 10%까지만 동시에 disrupt하고, 평일 오전 9-10시(트래픽 피크 직전)에는 아예 막는 식이다. 이런 거 한 줄 추가하는 데 5분 걸리는데 새벽에 페이지 받는 거 한 번이면 본전 뽑는다.


consolidateAfter를 너무 짧게(1m 같은) 잡으면 펌핑이 다시 시작되니 주의. 우리는 처음에 2m으로 시작했다가 지금은 5-10m 사이를 NodePool마다 다르게 쓰고 있다. 혹시 다른 값으로 잘 쓰고 계신 분 있으면 댓글 남겨주세요.

반응형