Scheduling-Multiple Schedulers

2024. 12. 31. 17:04쿠버네티스/쿠버네티스

728x90
반응형

1. 기본 스케줄러와 커스텀 스케줄러

Kubernetes는 기본적으로 **기본 스케줄러(default scheduler)**를 사용하여 Pod를 클러스터 내의 노드에 배치합니다. 기본 스케줄러는 다음과 같은 조건을 고려하여 Pod를 배치합니다:

  • 노드의 자원 상태
  • Taint와 Toleration
  • Node Affinity 등

하지만 특정 애플리케이션에 대해 더 복잡한 조건이나 사용자 정의 로직이 필요한 경우, 커스텀 스케줄러를 작성하고 Kubernetes 클러스터에 추가로 배포할 수 있습니다. 이를 통해 클러스터 내에서 여러 스케줄러를 동시에 사용할 수 있습니다.

2. 커스텀 스케줄러의 배포 방법

(1) 바이너리를 사용한 배포

  • Kubernetes의 kube-scheduler 바이너리를 다운로드하여 실행합니다.
  • 각 스케줄러는 고유한 이름을 가져야 하며, 이를 설정하기 위해 별도의 구성 파일을 사용합니다.
  • 예제:
kube-scheduler --config=/path/to/custom-config.yaml

(2) Pod로 배포

커스텀 스케줄러를 Pod로 실행하려면 다음 단계를 따릅니다:

  1. Pod 정의 파일 작성:
    • scheduler.conf 파일 경로와 인증 정보를 포함합니다.
    • 예제:
apiVersion: v1
kind: Pod
metadata:
  name: custom-scheduler
  namespace: kube-system
spec:
  containers:
  - name: kube-scheduler
    image: k8s.gcr.io/kube-scheduler:v1.27.0
    command:
    - kube-scheduler
    - --config=/etc/kubernetes/scheduler.conf
    volumeMounts:
    - name: config-volume
      mountPath: /etc/kubernetes/
  volumes:
  - name: config-volume
    hostPath:
      path: /etc/kubernetes/

(3) Deployment로 배포

Pod 대신 Deployment 리소스를 사용하여 고가용성을 제공할 수 있습니다:

  1. Deployment 정의 파일 작성:
    • ConfigMap을 사용해 설정 파일을 관리하고, Deployment에서 이를 마운트합니다.
    • 예제:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-scheduler-deployment
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      component: custom-scheduler
  template:
    metadata:
      labels:
        component: custom-scheduler
    spec:
      containers:
      - name: kube-scheduler
        image: k8s.gcr.io/kube-scheduler:v1.27.0
        command:
        - kube-scheduler
        - --config=/etc/kubernetes/scheduler.conf
        volumeMounts:
        - name: config-volume
          mountPath: /etc/kubernetes/
      volumes:
      - name: config-volume
        configMap:
          name: custom-scheduler-config

 

ConfigMap 생성:

kubectl create configmap custom-scheduler-config --from-file=scheduler.conf -n kube-system

 

Deployment 생성:

kubectl apply -f custom-scheduler-deployment.yaml

 

Deployment 확인:

kubectl get deployments -n kube-system

커스텀 스케줄러 사용 설정

Pod 또는 Deployment가 커스텀 스케줄러를 사용하도록 하려면, Pod 정의 파일에 schedulerName 필드를 추가해야 합니다:

apiVersion: v1
kind: Pod
metadata:
  name: my-app-pod
spec:
  schedulerName: custom-scheduler  # 커스텀 스케줄러 이름 지정
  containers:
  - name: my-app-container
    image: my-app-image:v1.0.0
kubectl get events --namespace=<namespace> -o wide | grep Scheduled

 고가용성(HA) 설정

  • 고가용성을 위해 여러 복사본의 동일한 스케줄러를 실행할 경우, leader-elect 옵션을 활성화해야 합니다.
  • leader-elect 옵션은 여러 스케줄러 중 하나만 활성 상태로 작동하도록 보장합니다.

Let's create a configmap that the new scheduler will employ using the concept of ConfigMap as a volume.
We have already given a configMap definition file called my-scheduler-configmap.yaml at /root/ path that will create a configmap with name my-scheduler-config using the content of file /root/my-scheduler-config.yaml.

  • kubectl create configmap my-scheduler-config --from-file=/root/my-scheduler-config.yaml -n kube-system

A POD definition file is given. Use it to create a POD with the new custom scheduler.

File is located at /root/nginx-pod.yaml

 

반응형