스케줄링·스케줄러 (Scheduling)

스케줄링·스케줄러 (Scheduling)

쿠버네티스에서 파드가 어느 노드에서 실행될지 정하는 일을 **스케줄링(Scheduling)**이라고 해요. 스케줄링은 파드를 노드에 맞춰서(match) kubelet이 그 파드를 실제로 실행할 수 있게 하는 과정이죠. 그런데 파드가 늘 차분하게 자리를 찾아가는 것만은 아니에요. 우선순위가 높은 파드가 자리를 만들기 위해 낮은 파드를 밀어내기도 하고, 노드가 버거워지면 파드가 강제로 내려오기도 합니다. 이 글에서는 그 세 갈래 — 스케줄링, 선점(Preemption), 축출(Eviction) — 을 함께 살펴볼게요.

핵심 개념 세 가지

먼저 용어부터 잡고 갈게요. 셋 다 '파드가 노드에 어떻게 배치되고 제거되는가'와 얽혀 있어서 헷갈리기 쉬워요.

  • 스케줄링(Scheduling): 파드를 노드에 match시켜 kubelet이 실행할 수 있게 하는 과정. 즉 "이 파드는 어느 노드에서 돌까"를 결정하는 일이에요.
  • 선점(Preemption): 우선순위(Priority)가 낮은 파드를 종료해서, 우선순위가 높은 파드가 그 노드에 스케줄될 수 있게 하는 과정이에요. 자리가 없을 때 높은 파드를 위해 낮은 파드를 양보시키는 거죠.
  • 축출(Eviction): 노드에서 하나 이상의 파드를 종료하는 과정. 노드 압박이나 API 호출 등으로 파드가 내려오는 것을 가리켜요.

이 셋을 한 문장으로 정리하면 이렇게 돼요. 스케줄링은 파드를 넣는 이야기, 선점과 축출은 파드를 빼는 이야기인데, 선점은 새 파드를 위해 자리를 만드는 쪽이고 축출은 노드 상태나 관리 의도에 따라 내보내는 쪽이에요.

스케줄링(Scheduling)

스케줄링은 파드가 실행될 노드를 정하는 과정이에요. 쿠버네티스는 기본 스케줄러인 kube-scheduler가 대부분의 스케줄링을 도맡지만, 이 주제는 한 페이지로 끝나지 않을 만큼 넓어요. 쿠버네티스 문서가 스케줄링 아래에 묶어 두는 주제들을 훑어볼게요.

  • Kubernetes Scheduler — 기본 스케줄러가 파드를 노드에 배치하는 방식.
  • Assigning Pods to Nodes — 파드를 특정 노드에 직접 지정하는 방법(nodeSelector, nodeName 등).
  • Pod Overhead — 파드가 실제로 쓰는 리소스보다 더 잡아두는 오버헤드를 어떻게 계산하는지.
  • Pod Topology Spread Constraints — 파드를 여러 토폴로지 영역(존, 리전 등)에 고르게 퍼뜨리는 제약.
  • Taints and Tolerations — 노드에 "얼룩"(taint)을 찍어 특정 파드만 오게 하고, 파드가 그 얼룩을 "참아내는"(toleration) 방식.
  • Scheduling Framework — 스케줄러의 스케줄링 흐름을 플러그인으로 확장하는 프레임워크.
  • Dynamic Resource Allocation — 리소스를 스케줄링 시점에 동적으로 할당하는 기능.
  • Scheduler Performance Tuning — 스케줄러 성능을 조정하는 방법.
  • Resource Bin Packing for Extended Resources — 확장 리소스를 빈 패킹(bin packing)하듯 촘촘히 배치하는 방식.
  • Pod Scheduling Readiness — 파드가 스케줄링될 준비가 되었는지를 제어하는 기능.
  • PodGroup Scheduling — 여러 파드를 하나의 그룹으로 묶어 스케줄하는 방식.
  • Gang Scheduling — 파드 그룹 전체가 함께 스케줄될 수 있을 때만 스케줄하는 방식.
  • Topology-aware Scheduling — 토폴로지를 고려한 스케줄링.
  • Workload-Aware preemption — 워크로드를 고려한 선점.
  • Descheduler — 스케줄이 잘못 배치된 파드를 정리하고 재배치하는 도구.
  • Node Declared Features — 노드가 지원하는 기능을 선언하는 부분.

각 항목이 저마다 꽤 깊은 주제예요. 스케줄링에 처음 발을 들이는 분이라면 Assigning Pods to NodesTaints and Tolerations부터 차근차근 보는 걸 추천해요. 둘 다 '파드가 어디로 갈까'를 가장 직접적으로 다루니까요.

파드 중단(Pod Disruption)

선점과 축출에 들어가기 전에, 두 과정이 공통으로 속하는 큰 그림을 하나 더 짚을게요. 바로 **파드 중단(Pod Disruption)**이에요.

파드 중단은 노드에 있는 파드가 자발적으로(voluntarily)든 비자발적으로(involuntarily)든 종료되는 과정을 뜻해요.

  • 자발적 중단(Voluntary): 애플리케이션 소유자나 클러스터 관리자가 의도적으로 시작한 중단이에요. 예를 들어 관리자가 직접 파드를 삭제하거나, 배포를 위해 파드를 내리는 경우가 여기 속해요.
  • 비자발적 중단(Involuntary): 의도하지 않게 일어나는 중단이에요. 노드의 리소스가 바닥나거나, 실수로 파드를 지워버린 경우처럼 피할 수 없는 문제 때문에 발생하죠.

이 자발적/비자발적 구분은 쿠버네티스 워크로드가 얼마나 안정적인지를 이해할 때 중요해요. 애플리케이션을 설계할 때 비자발적 중단은 완전히 막을 수 없다는 걸 염두에 두고, 자발적인 중단은 도구로 제어할 수 있다는 점을 구분하는 게 핵심이에요.

파드 중단 주제 아래에는 다음 세 가지가 있어요.

  • Pod Priority and Preemption — 파드 우선순위와 선점. 위에서 본 '낮은 우선순위 파드를 종료해 높은 우선순위 파드가 자리를 잡게 하는' 메커니즘을 자세히 다뤄요.
  • Node-pressure Eviction — 노드 압박 축출. 노드의 CPU·메모리·디스크 등 리소스가 임계값을 넘으면 kubelet이 파드를 축출하는 과정이에요.
  • API-initiated Eviction — API로 시작하는 축출. Eviction API를 호출해 파드를 정상적으로(graceful) 종료시키는 방식이에요.

정리

정리하면 이렇게 돼요. 스케줄링은 파드를 노드에 맞춰 kubelet이 실행하게 하는 과정이고, 선점은 더 높은 우선순위의 파드가 들어올 자리를 만들기 위해 낮은 우선순위 파드를 종료하는 일이며, 축출은 노드에서 파드를 종료하는 과정이에요. 그리고 이 선점과 축출 모두 관리자가 통제할 수 있는 자발적 중단이거나, 리소스 부족 같은 이유로 어쩔 수 없이 일어나는 비자발적 중단 중 하나에 속해요.

파드가 어떻게 배치되고, 어떻게 내려오는지를 이해하면 워크로드의 안정성을 훨씬 잘 관리할 수 있어요. 다음 단계로는 스케줄링의 핵심 개념(Taints and Tolerations, Assigning Pods to Nodes)부터, 그리고 노드가 빡빡해졌을 때의 동작(Node-pressure Eviction)을 순서대로 보시면 자연스럽게 연결돼요.