Kubernetes/Architecture

Scheduler

Operation CWAL 2021. 1. 15. 21:56

Scheduler는 K8s의 Control Plane Component 중 하나로, Pod을 어떤 Node에 생성할지 결정하는 역할을 맡고 있다. 기본적인 동작 원리는 다음과 같다.

K8s Scheduler의 Sequence Diagram

API Server는 Client(ex: Admin)로부터 Pod 생성을 요청받으면, 우선 이를 etcd에 저장한다. Scheduler는 API Server를 계속 확인하며 만약 새로운 Pod 또는 Node를 배정받지 못한(unscheduled) Pod이 있는 경우, 해당 Pod이 생성될 수 있는 최적의 Node를 찾아 API Server에 전달한다.

마지막으로, 선택된 Node에서 수행중인 kubelet은 API Server로부터 PodSpec을 전달받아 이를 생성한 뒤, Pod의 상태를 API Server에 보고하는 것으로 마무리된다.

 

그럼 Scheduler는 어떤 원리로 Pod이 배치될 최적의 Node를 결정할 수 있을까? 이 과정은 크게 다음과 같이 2단계로 나눌 수 있다.

  1. Filtering
    • Pod이 배치될 수 없는 Node를 제외한다
    • Node Selector, Taint, Resource requirements, Volume Location 등의 요인에 영향을 받으며, 이를 predicates이라고 한다.
    • 만약 filtering 단계에서 모든 Node가 제외되는 경우, 해당 Pod은 pending 상태로 남게 된다
  2. Scoring
    • Filtering된 Node로부터 순위를 정한다
    • Node Affinity, Pod Affinity/Anti Affinity 등의 요인에 영향을 받으며, 이를 priorities라고 한다
    • scoring 단계에서 1위로 선택된 node에 Pod을 배치
    • 만약 2개 이상의 Node가 공동 우승하는 경우, 이 중에서 랜덤하게 결정한다

filtering과 scoring을 통해 Pod이 배치될 Node를 결정하고, 이를 API 서버에 보고하는 과정을 'binding'이라고한다.

Kubernetes는 Scheduling Policies를 통해서 predicate과 priority를 설정할 수 있으며, Scheduling Configuration을 수정하여 scheduling 세부동작을 customizing하는 기능을 제공하고 있다.

 

 

참고
Kubernetes Scheduler - Kubernetes
How the Kubernetes scheduler works - Microsoft Azure
Understanding Kubernetes, Part 2: The Scheduler - VMware Cloud Native Apps

 

'Kubernetes > Architecture' 카테고리의 다른 글

Pod Lifecycle  (0) 2021.03.07
Calico Components  (0) 2021.02.11
Linux Namespaces  (0) 2021.02.02
CNI - Spec  (0) 2021.01.24
Cluster Networking  (0) 2021.01.22