쿠버네티스 스케줄러

쿠버네티스 스케줄러 (kube-scheduler)

출처: 쿠버네티스 공식 문서 — Kubernetes Scheduler

쿠버네티스에서 스케줄링(scheduling) 은 Pod를 Node에 짝지어 주어 kubelet이 그 Pod를 실행할 수 있게 만드는 일을 뜻해요.

스케줄링 개요 (Scheduling overview)

스케줄러는 아직 Node가 배정되지 않은 새로 생성된 Pod를 주시해요. 스케줄러가 발견한 모든 Pod에 대해, 그 Pod를 실행하기에 가장 적합한 Node를 찾는 책임을 지는 거죠. 이 배치 결정을 내릴 때 스케줄러는 아래에서 설명할 스케줄링 원칙들을 고려해요.

Pod가 특정 Node에 배치된 이유를 이해하고 싶거나, 직접 커스텀 스케줄러를 구현할 계획이 있다면 이 페이지가 도움이 될 거예요.

kube-scheduler

kube-scheduler는 쿠버네티스의 기본 스케줄러이며 컨트롤 플레인의 일부로 실행돼요. kube-scheduler는 설계상, 필요하다면 자신만의 스케줄링 컴포넌트를 작성해서 대신 쓸 수 있게 만들어져 있어요.

kube-scheduler는 새로 생성되었거나 아직 스케줄되지 않은(unscheduled) Pod를 실행하기에 최적인 Node를 선택해요. Pod 안의 컨테이너들 — 그리고 Pod 자체 — 가 서로 다른 요구사항을 가질 수 있으므로, 스케줄러는 Pod의 특정 스케줄링 요구를 충족하지 못하는 Node는 걸러내요. 또 API를 이용하면 Pod를 만들 때 Node를 직접 지정할 수도 있는데, 이는 드문 경우고 특별한 상황에서만 쓰여요.

클러스터에서 Pod의 스케줄링 요구를 충족하는 Node를 적합(feasible) 노드라고 불러요. 어떤 Node도 적합하지 않으면, 스케줄러가 배치할 수 있을 때까지 Pod는 스케줄되지 않은 채 남아 있어요.

스케줄러는 Pod에 대한 적합한 Node들을 찾은 다음, 일련의 함수로 적합 노드들에 점수를 매기고 그중 가장 높은 점수를 받은 Node 하나를 골라 Pod를 실행해요. 그런 다음 이 결정을 바인딩(binding) 이라는 과정을 통해 API 서버에 알려줘요.

스케줄링 결정에 고려해야 할 요소로는 개별·집합 자원 요구량, 하드웨어/소프트웨어/정책 제약, 어피니티(affinity)와 안티-어피니티(anti-affinity) 명세, 데이터 로컬리티(data locality), 워크로드 간 간섭 등이 있어요.

kube-scheduler의 노드 선택

kube-scheduler는 두 단계로 Pod의 노드를 선택해요:

  1. 필터링(Filtering)
  2. 스코어링(Scoring)

필터링 단계에서는 Pod를 스케줄하는 것이 가능한 Node들의 집합을 찾아요. 예를 들어 PodFitsResources 필터는 후보 Node에 Pod의 특정 자원 요청을 충족할 만큼 충분한 가용 자원이 있는지 확인해요. 이 단계가 끝나면 노드 목록에는 적합한 Node만 남아요. 흔히 둘 이상이 남죠. 목록이 비어 있다면 그 Pod는 (아직) 스케줄 가능하지 않은 거예요.

스코어링 단계에서는 남은 노드들에 순위를 매겨 가장 적합한 Pod 배치를 골라요. 필터링을 통과한 각 노드에 활성화된 스코어링 규칙을 바탕으로 점수를 부여하죠. 마지막으로 kube-scheduler는 가장 높은 순위의 Node에 Pod를 배정해요. 점수가 같은 노드가 둘 이상이면 그중 하나를 무작위로 선택해요.

스케줄러의 필터링·스코어링 동작을 구성하는 방법은 두 가지를 지원해요:

  1. 스케줄링 정책(Scheduling Policies) — 필터링을 위한 Predicates, 스코어링을 위한 Priorities를 구성할 수 있어요.
  2. 스케줄링 프로파일(Scheduling Profiles)QueueSort, Filter, Score, Bind, Reserve, Permit 등을 포함한 여러 스케줄링 단계를 구현하는 Plugins을 구성할 수 있어요.

또한 kube-scheduler가 서로 다른 프로파일을 실행하도록 구성할 수도 있어요.

더 알아보기 (What's next)