Multiple Scheduler

Yu Sang Min·2025년 5월 30일

CKA

목록 보기
24/110
post-thumbnail

📌Multiple Scheduler

  • taint, tolerance, node affinity 등 스케줄러의 동작 원리를 알고 있다
    하지만 조건을 만족하는 노드가 없다면?
    👉 다른 조건을 찾는 스케줄러를 만들 수 있다.

    • 고유의 스케줄링 알고리즘으로 노드에 파드를 추가
    • 고유의 사용자 지정 조건을 추가하고 파드 실행
    • 쿠버네티스 스케줄러 프로그램을 작성해 기본 스케줄러로 패키지 하거나 쿠버네티스 클러스터에서 추가 스케줄러를 배포 할 수 있음
  • 쿠버네티스 클러스터는 한 번에 여러 스케줄러를 가질 수 있음

  • 스케줄러가 다수일 경우 이름이 모두 달라야한다.

  • default-scheduler는 scheduler-config.yaml 파일에서 정의된다.

# scheduler-config.yaml

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler

# my-scheduler-config.yaml

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: my-scheduler

# my-scheduler-2-config.yaml

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: my-scheduler-2

⚒️ Deploy Additional Scheduler

wget https://storage.googleapis.com/kubernetes-release/v1.12.0/bin/linux/amd64/kube-scheduler
  • 바이너리 파일 다운로드 후 여러 옵션과 함께 서비스로 실행한다.
# kube-scheduler.service

ExecStart=/usr/local/bin/kube-scheduler \\
  --config=/etc/kubernetes/config/kube-scheduler.yaml

# my-scheduler-2.service

ExecStart=/usr/local/bin/kube-scheduler \\
  --config=/etc/kubernetes/config/my-scheduler-2-config.yaml
  • 이렇게 하면 각 스케줄러는 분리된 구성 파일 사용
  • 파일마다 고유한 스케줄러 이름을 갖는다.
  • 각 파일은 (kube-apiserver에 인증하기 위한 kubeconfig 파일 같은) 전달되는 다른 옵션들이 있다는 것에 주목!
  • kubeadm은 controlplane 구성요소(컴포넌트, scheduler를 포함해)가 poddeployment로 배포되어 있어 위와 같이 하는 경우는 거의 없음

📦 Deploy Additional Scheduler as a Pod

  • 스케줄러를 pod로 배포할 경우
# my-custom-scheduler.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-custom-scheduler
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-scheduler
    - --address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler/conf
    - --config=/etc/kubernetes/my-scheduler-config.yaml
      
      image: k8s.gcr.io/kube-scheduler-amd64:v1.11.3
      name: kube-scheduler

# my-scheduler-config.yaml

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: my-scheduler

# my-scheduler-2-config.yaml
leaderElection:
  leaderElect: true
  resourceNamespace: kube-system
  resourceName: lock-object-my-scheduler
  • leaderElection(리더 선출) : 스케줄러의 복제본을 여러개의 마스터 노드에서 실행할때 사용

  • 고가용성 셋업으로 노드에서 쿠버네티스 스케줄러 프로세스가 양쪽에서 실행됨

  • 동일한 스케줄러의 복사본 여러 개가 다른 노드에서 실행될 경우 한 번에 하나만 활성화 가능

  • leaderElection은 스케줄 활동을 이끌 리더를 선출하는데 도움

  • my-scheduler-config.yaml 실제 파일을 참조하고 있음

  • 다중의 마스터 노드가 있으면 이 추가 매개 변수를 넘겨 로그 개체 이름을 설정 가능

⌨️ Use Custom Scheduler

$ kubectl get pods --namespace=kube-system
<중략>
kube-scheduler-master     1/1      Running     0       1h
my-custom-scheduler        1/1      Running     0       9h

# pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  -  image: nginx
     name: nginx
    
  schedulerName: my-custom-scheduler

$ kubectl create -f pod-definition.yaml
  • 만약 스케줄러에 문제가 생기면 pod는 계속 Pending 상태

✨ View Events

$ kubectl get events -o wide
  • 현재 네임스페이스에 있는 모든 이벤트를 열거하고 예정된 이벤트를 찾음

📋 View Scheduler Logs

$ kubectl logs my-custom-scheduler --name-space=kube-system
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글