기본 스케줄링 흐름
1. Pod 생성 시 스케줄링 큐에 할당된다. 큐 내부에서는 Priority에 따라 정렬된다. `PrioritySort` 플러그인을 통해 Priority가 높은 순으로 정렬되며 이 우선순위는 PriorityClass resource를 만들어 설정할 수 있다.
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
2. 이후 큐에 있는 Pod가 POP되면 필터링을 거치게된다. 필터링과정에서 Pod이 요구하는 조건을 충족시키지 못하는 노드를 제외시키며 이 과정은 `NodeResourcesFit` 플러그인이 담당한다. Pod의 nodeName 필드가 지정된 경우 `NodeName`플러그인에 의해 해당 노드만 남기고 제거하게되며 unscheduleable로 설정된 노드는 `NodeUnschedulable` 플러그인에 의해 필터링된다.
3. 필터링을 마치면 스코어링 작업에 들어간다. 남는 리소스가 더 많은 노드일수록 더 높은 점수를 책정하며, 이 과정에서는 `NodeResourcesFit` 플러그인이 관여한다. 또한 이미 노드에 Pod의 이미지가 캐싱되어 있는 경우는 가산점을 부여하는데 이는 `ImageLocality` 플러그인이 담당한다.
4. 마지막으로 바인딩 과정을 거친다. 가장 점수가 높은 노드에 실제로 Pod이 스케줄링되며, `DefaultBinder` 플러그인이 담당한다.
Extenstion Point
쿠버네티스 스케줄러의 동작과정을 좀 더 자세히 살펴보면 다음과 같다.
Extension Point | 설명 | 대표 플러그인 |
QueueSort | 대기열 정렬 | PrioritySort |
PreFilter | 필터링 전 처리 | NodePorts, InterPodAffinity 등 |
Filter | 스케줄 불가 Node 필터링 | NodeResourcesFit, NodeName, NodeUnschedulable |
PostFilter | 필터링 후 처리 | DefaultPreemption 등 |
PreScore | 스코어링 전 처리 | DefaultPreScore |
Score | 점수 부여 | NodeResourcesFit, ImageLocality |
Reserve | Node에 임시 할당 | DefaultReserve |
Permit | 마지막 허가 체크 | DefaultPermit |
PreBind | 바인딩 직전 처리 | DefaultPreBind |
Bind | 실제 바인딩 | DefaultBinder |
PostBind | 바인딩 후 처리 | DefaultPostBind |
Kubernetes Scheduler의 확장성
쿠버네티스는 기본적으로 다수의 스케줄러를 동시에 클러스터에 구성할 수 있다.
기존에는 kube-scheduler 바이너리를 여러 개 실행하여 스케줄러를 복수로 구성하였으나 프로세스 관리가 복잡하고 같은 노드에 pod 할당을 시도하면서 race condition이 발생할 수 있다는 문제가 존재했다.
이에 대한 개선으로 등장한 것이 Scheduler Profiles 방식으로 하나의 스케줄러 프로세스에서 여러 개의 스케줄링 로직을 수행할 수 있도록 개선되었다.
profiles:
- schedulerName: default-scheduler
plugins:
score:
disabled:
- name: "NodeResourcesFit"
- schedulerName: my-scheduler
plugins:
score:
enabled:
- name: "ImageLocality"
disabled:
- name: "NodeResourcesFit"
이후 Pod 스펙에 아래와 같이 명시하면 특정 프로파일로 스케줄링이 가능하다.
spec:
schedulerName: my-scheduler
Scheduler Profile의 구조
스케줄러 프로파일을 설정할 때 커스터마이징 가능한 영역은 다음과 같다.
- plugins (사용/비활성화 플러그인 지정)
- pluginConfig (각 플러그인별 상세 설정)
- leaderElection (HA 환경용 leader election 설정)
- percentageOfNodesToScore (몇 %의 Node에 대해서만 스코어링 할 것인지)
Scheduler Profile 도입의 장점
1. 별도의 프로세스를 띄우지 않아도 다양한 스케줄링 로직 구현 가능
2. Race Condition 방지
3. Custom Scheduler 개발 및 배포가 쉬워짐 (Custom Plugin 작성 + Profile 등록만 하면 됨)
4. HA 환경에서도 안정적으로 동작
5. 기존 Extension Point 기반으로 유연하게 Plugin 조합 가능
'CKA' 카테고리의 다른 글
Kubernetes Monitoring (0) | 2025.04.01 |
---|---|
Kubernetes Admission Controller의 두 가지 유형 (0) | 2025.03.30 |
(TIL) Kubernetes Static Pods (0) | 2025.03.26 |
(TIL) Kubernetes DaemonSet (0) | 2025.03.26 |
(TIL) Kubernetes에서의 Resource Request & Limits (0) | 2025.03.26 |