본문 바로가기
Infra & Cloud/DevOps

[Kubernetes] 쿠버네티스 스케쥴러(Scheduler)를 직접 만들어보자. (kube-scheduler 개념/작동방식)

by newstellar 2022. 12. 4.
반응형

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

 

https://medium.com/jorgeacetozi/kubernetes-master-components-etcd-api-server-controller-manager-and-scheduler-3a0179fc8186

 

  - 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를 통해 특정 nodekubelet로 하여금 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 아래, schedulerNameplugins를 정의하는 방식입니다.

 

  (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/)

 

Scheduler Configuration

FEATURE STATE: Kubernetes v1.25 [stable] You can customize the behavior of the kube-scheduler by writing a configuration file and passing its path as a command line argument. A scheduling Profile allows you to configure the different stages of scheduling i

kubernetes.io

 



 

 

 

[Kubernetes] StaticPod: Master Node(Control Plane)의 Pod를 삭제하면 어떻게 될까? (Container Runtime, Containerd)

시작하며 일반 개발자가 아닌, 관리자의 입장에서는 Kubernetes 클러스터의 노드에서 Pod가 실행될 때 발생하는 에러들에 대해서 알아야 합니다. (만약 CKAD 수준의 쿠버네티스 이해 및 사용 능력이

newstellar.tistory.com

 

 

[Kubernetes] Volume: Pod의 Container 데이터는 어떻게 저장될까? (Volume, PersistentVolume, PersistentVolumeClaim)

1. Volume Kubernetes(쿠버네티스) 환경에서 Container(컨테이너)는 Pod(파드)에 감싸져서 동작합니다. 이때 Container에서 만들어진 데이터는 Docker(도커) 파일 시스템으로서 컨테이너 이미지에서만 제공됩

newstellar.tistory.com

 

[Kubernetes] StaticPod: Master Node(Control Plane)의 Pod를 삭제하면 어떻게 될까? (Container Runtime, Containerd)

시작하며 일반 개발자가 아닌, 관리자의 입장에서는 Kubernetes 클러스터의 노드에서 Pod가 실행될 때 발생하는 에러들에 대해서 알아야 합니다. (만약 CKAD 수준의 쿠버네티스 이해 및 사용 능력이

newstellar.tistory.com

 

 

 

[Kubernetes] Authentication/Authentication(인증/인가) 프로세스 및 User/Role 생성(User, CSR, RBAC, RoleBinding)

1. 쿠버네티스에서의 User 개념 쿠버네티스에서는 User(human)와 ServiceAccount(machine) 두 종류의 사용자가 존재합니다. User에는 클러스터 관리자 및 사용자(일반 개발자)가 있으며, ServiceAccount는 Prometheus

newstellar.tistory.com

 

[Kubernetes] NetworkPolicy를 통해 Pod끼리의 트래픽을 통제해보자. (Ingress/Egress, from/to, namespaceSelector, pod

[ NetworkPolicy ] 1. Ingress vs Egress 네트워크 트래픽은 외부로부터 유입되는 Ingress(inbound)와 내부로부터 외부로 나가는 Egress(outbound)로 구분됩니다. 우리가 공부하고 있는 쿠버네티스는 기본적으로 non-

newstellar.tistory.com

 

[Kubernetes] CKA(Certified Kubernetes Administration) 자격증 접수 방법/예약/출제 범위/할인바우처 (+CKAD, CKS

CNCF(Cloud Native Computing Foundation) 재단에서 주관하는 CKA(관리), CKAD(개발), CKS(보안) 세 자격증 가운데, 가장 대표적인 CKA 자격증에 대해 알아봅니다. 접수 및 시험 예약 방법, 추천하는 강좌 그리고

newstellar.tistory.com

 

반응형

댓글