다중 스케줄러
Multiple Schedulers
개념
- 기본적으로 Kubernetes는
kube-scheduler(디폴트 스케줄러)하나로 모든Pod를 Scheduling한다. - 하지만 특정 애플리케이션에 대해 기본 Scheduler로는 부족한 특별한 규칙이 필요할 수 있다.
- 이때 개발자가 직접 Scheduling 로직을 만든 후 Kubernetes에 추가 Scheduler로 배포할 수 있다.
Go언어로 스케줄링 로직을 개발하고 빌드(바이너리든, 컨테이너든)하면 된다.
- 하나의 클러스터에 여러 개의 스케줄러가 동시에 존재할 수 있다. 즉,
Multiple Schedulers가 가능하다.
사용 예시
GPU 노드의 실시간 상태 기반 스케줄링
- 특정
Pod는 GPU 사용률이 30% 이하인 노드만 사용해야 하는 경우 - 특정
Pod는 특정 모델(V100/A100)보다 현재 temperature가 낮은 GPU가 더 우선인 경우 - 기본 Kubernetes 스케줄러는 GPU 실시간 load/temperature/메모리 사용량 같은 동적 정보는 알 수 없다.
- 커스텀 스케줄러는 DCGM Exporter, Prometheus 등 외부 모니터링 지표를 조회해 최적 GPU 노드를 선택할 수 있다.
Node 리소스 + 외부 시스템 상태를 조합해야 하는 경우
Pod를 배치할 때 노드 CPU/메모리 뿐만 아니라Redis/Kafka등 외부 시스템 부하도 함께 고려해야할 경우- 기본 Kubernetets 스케줄러는 외부 시스템에 대해 모른다. 이에 커스텀 스케줄러가 외부 시스템과 상호작용 이후 상황을 판단하여 배치할 수 있다.
시간 기반 스케줄링
- 비용이 비싼 노드는 업무 시간대(09~18시)에만 사용하고, 야간에는 저렴한 노드(ex: spot 인스턴스)만 사용하는 규칙
- 정기 점검 시간대에 특정 유형의 노드에는 workload를 배치하지 않는 정책
- 기본 스케줄러는 시간/비용 정책을 다루지 않는다.
커스텀 스케줄러에서는 현재 시간, 비용 테이블, 점검 스케줄 등을 기준으로 배치 정책을 구현할 수 있다.
배포 방식
바이너리 실행 (예전 방식, 추천 X)
- Kube-Scheduler Manual Setup - 이 방법처럼 나 혹은 다른 사람이 만든 Cusom Scheduler를
systemd의 서비스로 사용할 수 있게 설정하면 된다. - 하지만, 이 방법은 추천되지 않는다.
Deployment로 배포 (추천)
- https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/ 참조
- 위 docs에 나온 것처럼 많은 구성을 해야하는 이유는 다음과 같다.
- 커스텀 스케줄러가 API 서버에 접근하기 위해
ServiceAccount+ClusterRoleBinding이 필요하다. - 이름,
Leader Election등의 설정을 위해ConfigMap이 필요하다. Deployment로 실행하면 rolling update, self-healing, replica 수 조절을 통한 HA 구성이 쉬워 운영이 편리하다.
- 커스텀 스케줄러가 API 서버에 접근하기 위해
Pod에서 Custom Scheduler 지정하기
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
schedulerName: my-custom-scheduler
specschedulerName:Multiple Schedulers중 여기에 해당Pod를 배치하는데 사용할 스케줄러를 설정한다. 해당 필드가 비어있다면 기본 스케줄러가 사용된다.
레퍼런스
- https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/
- Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests (Mumshad)