설정 파일에는 스케줄러 이름, kubeconfig 파일 경로, leader-elect 옵션 등 스케줄러의 동작을 정의하는 다양한 옵션을 설정할 수 있다.
파드 또는 Deployment 정의 파일의 spec.schedulerName 필드를 사용하여 특정 스케줄러를 지정할 수 있다.
이 필드를 생략하면 기본 스케줄러가 사용된다.
View Scheduler
kubectl get pods --namespace=kube-system 명령어를 통해 스케줄러 목록을 확인할 수 있다.
kubectl get events 명령어를 통해서 스케줄러에서 어떤 이벤트가 발생했는지 알 수 있다.
kubectl logs <스케줄러 이름> --name-space=kube-system 명령어를 통해서 스케줄러의 로그를 확인할 수 있다.
Configuring Scheduler Profile
작동 방식
스케줄링 큐(Scheduling Queue):
파드가 생성되면 스케줄링 큐에 추가되어 스케줄링을 기다린다.
파드는 우선순위 클래스(Priority Class)에 따라 정렬된다. 우선순위가 높은 파드는 큐의 앞쪽에 위치하여 먼저 스케줄링된다.
우선순위 클래스는 apiVersion: scheduling.k8s.io/v1, kind: PriorityClass로 정의하며, value 필드를 통해 우선순위 값을 설정한다.
필터링 단계(Filter Phase):
파드를 실행할 수 없는 노드를 필터링하여 스케줄링 대상에서 제외한다.
다양한 플러그인을 사용하여 필터링 작업을 수행한다.
노드 리소스 적합 플러그인(Node Resource Fit Plugin): 파드의 리소스 요구 사항(CPU, 메모리 등)을 충족하지 못하는 노드를 필터링한다.
노드 이름 플러그인(Node Name Plugin): 파드의 spec.nodeName에 지정된 노드와 일치하지 않는 노드를 필터링한다.
노드 스케줄링 불가능 플러그인(Node Unschedulable Plugin): 노드의 스케줄링 불가능 플래그(unschedulable: true)가 설정된 노드를 필터링한다. kubectl drain 또는 kubectl cordon 명령어를 사용하여 노드를 스케줄링 불가능 상태로 만들 수 있다.
Taint/Toleration 플러그인: 파드의 Toleration과 노드의 Taint를 비교하여 파드를 실행할 수 없는 노드를 필터링한다.
Node Affinity/Anti-Affinity 플러그인: 파드의 Node Affinity/Anti-Affinity 규칙을 만족하지 않는 노드를 필터링한다.
스코어링 단계(Scoring Phase):
필터링 단계를 통과한 노드에 점수를 부여하여 최적의 노드를 선택한다.
다양한 플러그인을 사용하여 스코어링 작업을 수행한다.
노드 리소스 적합 플러그인(Node Resources Fit Plugin): 노드의 남은 리소스(CPU, 메모리 등)를 기반으로 점수를 부여한다. 리소스가 많이 남은 노드에 높은 점수를 부여한다.
이미지 로컬리티 플러그인(Image Locality Plugin): 파드가 사용하는 컨테이너 이미지를 이미 가지고 있는 노드에 높은 점수를 부여한다. 이미지를 다운로드하는 시간을 절약하여 파드 실행 시간을 단축할 수 있다.
Taint/Toleration 플러그인: 파드의 Toleration과 노드의 Taint를 기반으로 점수를 부여한다. Toleration을 만족하는 노드에 높은 점수를 부여한다.
Node Affinity/Anti-Affinity 플러그인: 파드의 Node Affinity/Anti-Affinity 규칙을 기반으로 점수를 부여한다. 규칙을 만족하는 노드에 높은 점수를 부여한다.
바인딩 단계(Binding Phase):
스코어링 단계에서 가장 높은 점수를 받은 노드에 파드를 바인딩한다.
기본 바인더 플러그인 (Default Binder Plugin): 파드를 노드에 바인딩하는 작업을 수행한다.
바인딩 단계는 파드를 실제로 노드에 할당하고 실행하는 마지막 단계다.
플러그인 (Plugin)
쿠버네티스 스케줄러는 플러그인 시스템을 통해 확장성을 제공한다.
각 단계는 확장 지점(Extension Points)을 가지고 있으며, 사용자는 사용자 정의 플러그인을 개발하여 연결할 수 있다.
플러그인은 스케줄러의 동작을 사용자 정의하고 특정 요구 사항을 충족하는 데 사용된다.
하나의 플러그인이 여러 단계에서 사용될 수 있다.
kube-scheduler 설정 파일(kube-scheduler.yaml)에서 사용할 플러그인을 설정할 수 있다.
profiles 섹션에서 각 프로필에 사용할 플러그인을 지정한다.
plugins 섹션에서 각 단계별로 사용할 플러그인을 설정한다.
쿠버네티스는 다중 스케줄러를 지원하므로 사용자 정의 스케줄러를 개발하여 사용할 수 있다.
사용자 정의 스케줄러는 특정 애플리케이션의 요구 사항을 충족하는 데 유용하다.
사용자 정의 스케줄러는 플러그인 시스템을 활용하여 개발할 수 있다.
플러그인 확장 지점 (Extension Points)
스케줄러의 각 단계는 플러그인을 연결할 수 있는 확장 지점을 제공한다.
이를 통해 사용자는 스케줄러의 동작을 사용자 정의하고 특정 요구 사항을 충족하는 플러그인을 추가할 수 있다.