Search

Multiple Schedulers

Created
2023/10/01 03:58
Tags
k8s
CKA
Mumshad Mannambeth
Scheduling

1) About

만일 기본 스케줄러가 맘에 들지 않으면, 프로그램을 작성하여 새로운 스케줄러를 쉽게 등록할 수 있음
쿠버네티스 클러스터 내에는 여러 스케줄러를 가질 수 있으므로, 각각의 스케줄러는 이름이 모두 달라야함
apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration profiles: - schedulerName: scheduler-sample leaderElection: leaderElect: true resourceNamespace: kube-system resourceName: lock-object-scheduler-sample
YAML
복사
** 기본 스케줄러는 schedulerName이 default-scheduler
** 스케줄러의 경우 여러 노드에 스케줄러를 존재하게 만들 수 있는데, 이는 마스터 노드에 대한 HA를 위한 것이고, 스케줄러는 하나만 동작하고 있어야 하므로 leaderElection 필드가 이를 도움

2) Service

위처럼 정의한 스케줄러를 동작시키기 위해선 스케줄러 바이너리 파일이 필요
kube-scheduler —config=/etc/kubernetes/config/kube-scheduler.yaml
기본 스케줄러의 경우 위 명령어로 동작시킬 수 있는데, 추가적인 스케줄러가 필요한 경우 —config 옵션에 들어가는 경로를 직접 작성한 파일의 경로로 기재하면 됨

3) kubeadm

이전 항목에서의 스케줄러를 실행하는 부분은 Pod로써 동작시키는 것이 아님
많은 개발자들은 Control Plane 구성 요소를 클러스터 내부의 Pod 배포하는 것이 일반적임
스케줄러 역시 kubeadm으로 배포하는 것이 가능
apiVersion: v1 kind: Pod metadata: name: scheduler-sample namespace: kube-system spec: containers: - name: scheduler-sample image: k8s.gcr.io/kube-scheduler-amd64:v1.11.3 command: - kube-scheduler - --address=127.0.0.1 - --kubeconfig=/etc/kubernetes/scheduler.conf - --config=/etc/kubernetes/scheduler-sample.yaml
YAML
복사
** 자세한 옵션들은 공식 문서를 확인해야 하며, 쿠버네티스 클러스터 내에서 커스텀 스케줄러를 구동하는 것에는 추가적인 공수가 들어감 → ServiceAccount, ClusterRoleBinding과 같은 인증
** —config에 기재하는 커스텀 스케줄러의 설정 파일의 경우, 볼륨 마운트로 파일을 전달해도 좋고, 쿠버네티스 객체 중에 ConfigMap을 활용하는 방법도 있음
** ConfigMap은 config를 정의한 파일로부터 생성할 수 있는데, kubectl create configmap ${NAME} —from-file=${PATH} —namespace=${NAMESPACE} 와 같은 형식의 명령어로 생성할 수 있음

4) Usage

만일 새로운 Pod를 생성할 때 기본으로 제공되는 스케줄러로 노드 배정을 하는 것이 아니라, 커스텀으로 만든 스케줄러로 노드 배정을 수행하고 싶다면 Pod를 정의하는 파일에 이를 직접 기입해야함
apiVersion: v1 kind: Pod metadata: name: pod-sample spec: containers: - name: pod-sample image: pod-sample schedulerName: scheduler-sample
YAML
복사
** 만일 스케줄러가 정상적으로 동작하지 않으면 Pod의 생성이 Pending 상태에서 멈추게 됨

5) Commands

kubectl get event -o wide
스케줄러가 Pod의 스케줄링을 맡은 것은 이벤트로 확인할 수 있음
위 명령어로 REASON과 SOURCE, MESSAGE 항목에서 해당 내용을 확인할 수 있음
kubectl logs ${SCHEDULER_NAME} —namespace=${NAMESPACE}
스케줄링에서 문제가 생겼다면 위 명령어를 통해서 로그를 확인할 수 있음