1. 들어가며
쿠버네티스 스케줄링(Kubernetes Scheduling)이란 적절한 node의 kubelet이 Pod를 실행하도록 할당하는 것을 뜻합니다. Kubernetes에서는 master node(control plane)의 kube-scheduler가 위 역할을 담당합니다. (default 컴포넌트가 kube-scheduler이며, 사용자들이 원하는 방식의 스케줄링을 커스텀하고 싶다면 새로운 scheduler를 만들어 추가할 수도 있습니다.)
2. Kubernetes Scheduling 개념/원리
(1) Pod 생성 Flow
특정 node(master node 또는 worker node)에서 Pod를 생성하고 싶을 때 spec에 스케줄링 조건을 추가하면 원하는 노드에 할당할 수 있습니다. Kubernetes에서는 master node에서 동작 중인 kube-scheduler Pod 컴포넌트가 Pod가 어느 노드에서 실행될지 결정합니다. kube-scheduler는 master node(control plane) kube-system 네임스페이스에서 Pod로 실행 중이기 때문에 명령어를 사용해서 확인할 수도 있습니다.
아래처럼 kube-scheduler의 pod를 살펴봅니다.
# Don't forget specifying the namespace!
kubectl describe pod kube-scheduler -n kube-system
- kubectl run / kubectl create / kubectl apply과 같이 Pod를 생성하는 명령어가 kube-apiserver에 도달하면 kube-apiserver는 etcd에 Pod의 metadata, spec 등의 정보를 넘겨줍니다. 이때, NodeName처럼 Pod가 어느 노드에 위치할 지에 대한 정보가 설정되지 않은 상태로 저장됩니다.
- 이때, kube-scheduler는 이러한 정보를 지속적으로 주시하고 있다가 생서될 Pod의 NodeName가 명시되어 있지 않은 상태라는 것을 알아차립니다. 이제, kube-scheduler는 해당 Pod를 어느 노드에 할당하는 것이 가장 적절할지 스케줄링을 시작합니다.
- 적합한 노드를 찾았다면, kube-scheduler로부터 Pod가 특정 node에서 실행될지에 대한 정보를 kube-apiserver에게 전달합니다. 눈여겨볼 점은 kube-scheduler 단계에서 Pod가 만들어지지 않고 kube-apiserver를 통해 특정 node의 kubelet로 하여금 Pod를 생성하는 것입니다.
(2) Scheduler의 작동 방식
그렇다면 kube-scheduler는 특정 node가 Pod를 품기에 적합한지 어떤 방식으로 결정할까요?
1)노드 필터링과 2)노드 가중치 점수(Score) 계산 두 가지 방식에 의해 결정됩니다.
1) 노드 필터링은 Pod에 설정된 제약 조건(constraint)과 리소스 요청(request)으로 적합한 node의 후보군을 만듭니다.
2) 이후 노드 가중치 점수를 계산하는데, 1단계 필터링을 통해 걸러진 노드들의 점수를 매겨 가장 높은 점수를 갖는 노드를 최종적으로 선발합니다. (후보 node의 개수를 별도로 설정할 수도 있습니다.)
위 두 방식은 아래 네 단계의 Scheduling 중 두 가지입니다.
Scheduling Queue
-> Filtering
-> Scoring
-> Binding
각 단계에는 Extension Point가 달려 있어서 어떠한 스케쥴링 Plugin을 사용할지 커스터마이징할 수 있고, 이것이 쿠버네티스의 설계 원칙입니다. scheduler-config.yaml과 같은 스케쥴러를 정의한 .yaml 파일 내 profiles 아래, schedulerName과 plugins를 정의하는 방식입니다.
(1) Scheduling Queue 단계에서는 queueSort라는 하나의 Extension Point를 거쳐 PrioritySort plug-in이 배치됩니다.
(2) Filtering 단계에서는 preFilter, filter, postFilter 세 Extension Point를 거쳐 NodeResourcesFit, NodeName, NodeUnschedulable, TaintToleration, NodePorts, NodeAffinity와 같은 plug-in을 배치합니다.
(3) Scoring 단계에서는 preScore, score, reserve 세 Extension Point를 거쳐 NodeResourcesFit, ImageLocality, TaintToleration, NodeAffinity와 같은 plug-in을 배치합니다.
(4) Binding 단계에서는 preBind, bind, postBind 세 Extension Point를 거쳐 DefaultBinder plug-in을 배치합니다.
(참고 : https://kubernetes.io/docs/reference/scheduling/config/)
댓글