Kubernetes

[Kubernetes] Multiple Schedulers

thdwldud 2026. 9. 6. 19:40
728x90
반응형

.

해당 내용은 Udemy의 Certified Kubernetes Administrator(CKA) with Practice Tests 강의를 공부한 내용입니다.

 

Certified Kubernetes Administrator (CKA) with Practice Tests

<p><strong>CKA Certification Course – Certified Kubernetes Administrator</strong></p><p>Kubernetes is one of the highest trending technology in Cloud Computing as of today. Kubernetes had the fastest growth in job searches, over 173% from a year before,

www.udemy.com

 

Kubernetes에서는 기본 스케줄러 외에도 여러 개의 사용자 정의(Custom) 스케줄러를 함께 운영할 수 있음

왜 여러 개의 Scheduler가 필요할까?

기본적으로 Kubernetes는

  • 리소스 상태
  • Node Affinity
  • Taints & Tolerations
  • Pod Affinity

등을 고려하여 Pod를 적절한 노드에 배치

기본 스케줄러:

default-scheduler

하지만 다음과 같은 경우에는 커스텀 스케줄러가 필요할 수 있음

예시:

  • 특정 서버에만 금융 서비스 배치
  • GPU 사용량 기반 배치
  • 비용이 저렴한 노드 우선 사용
  • 별도 검증 로직 수행 후 배치

Kubernetes는 여러 Scheduler를 지원

예시:

default-scheduler
my-scheduler
gpu-scheduler
cost-optimizer-scheduler

동시에 여러 개가 존재 가능

중요한 규칙

각 Scheduler는 반드시 고유한 이름을 가져야 함

기본:

default-scheduler

커스텀:

my-scheduler
gpu-scheduler
custom-scheduler

Scheduler 설정 파일

Scheduler는 설정 파일에서 이름을 지정

예시:

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

기본 Scheduler

# scheduler-config.yaml
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration

profiles:
- schedulerName: default-scheduler

추가 Scheduler 배포

Step 1: Download the kube-scheduler Binary

kube-scheduler binary 다운로드

wget <https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/linux/amd64/kube-scheduler>

Step 2: Create Service Files

각 스케줄러에 대해 별도의 서비스 파일을 생성

# 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

Step 3: Define Scheduler Configuration Files

관련 구성 파일에서 스케줄러 이름을 참조

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

예시

기본 스케줄러:

kube-scheduler \
--config=/etc/kubernetes/config/kube-scheduler.yaml

커스텀 스케줄러:

kube-scheduler \
--config=/etc/kubernetes/config/my-scheduler.yaml

kubeadm 환경

최근 Kubernetes(kubeadm)에서는 Scheduler가 Static Pod로 실행됨

확인:

kubectlget pods-n kube-system

예시:

kube-scheduler-controlplane

커스텀 Scheduler 역시 Pod 또는 Deployment로 배포 가능

Deploying the Custom Scheduler as a Pod

apiVersion: v1
kind: Pod
metadata:
  name: my-custom-scheduler
  namespace: kube-system
spec:
  containers:
    - name: kube-scheduler
      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/my-scheduler-config.yaml
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: my-scheduler

Deploying the Custom Scheduler as a Deployment

실무에서는 Deployment 사용이 일반적

Step 1: Build and Push a Custom Scheduler Image

커스텀 Scheduler를 위한 Dockerfile 생성

FROM busybox
ADD ./.output/local/bin/linux/amd64/kube-scheduler /usr/local/bin/kube-scheduler

도커 이미지 빌드 및 푸시

docker build -t gcr.io/my-gcp-project/my-kube-scheduler:1.0 .
gcloud docker -- push gcr.io/my-gcp-project/my-kube-scheduler:1.0

Step 2: Create ServiceAccount and RBAC Configurations

서비스 계정을 생성하고 적절한 RBAC 권한을 설정 (커스텀 Scheduler는 Kubernetes API에 접근해야 하므로)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-scheduler
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: my-scheduler-as-kube-scheduler
subjects:
  - kind: ServiceAccount
    name: my-scheduler
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: system:kube-scheduler
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: my-scheduler-as-volume-scheduler
subjects:
  - kind: ServiceAccount
    name: my-scheduler
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: system:volume-scheduler
  apiGroup: rbac.authorization.k8s.io

Step 3: Create a ConfigMap for Scheduler Configuration

사용자 지정 스케줄러 구성을 포함하는 ConfigMap을 정의

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-scheduler-config
  namespace: kube-system
data:
  my-scheduler-config.yaml: |
    apiVersion: kubescheduler.config.k8s.io/v1beta2
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: my-scheduler
        leaderElection:
          leaderElect: false

Step 4: Define the Deployment

YAML 파일을 사용하여 사용자 지정 스케줄러를 배포로 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-scheduler
  namespace: kube-system
  labels:
    component: scheduler
    tier: control-plane
spec:
  replicas: 1
  selector:
    matchLabels:
      component: scheduler
      tier: control-plane
  template:
    metadata:
      labels:
        component: scheduler
        tier: control-plane
        version: second
    spec:
      serviceAccountName: my-scheduler
      containers:
        - name: kube-second-scheduler
          image: gcr.io/my-gcp-project/my-kube-scheduler:1.0
          command:
            - /usr/local/bin/kube-scheduler
            - --config=/etc/kubernetes/my-scheduler/my-scheduler-config.yaml
          livenessProbe:
            httpGet:
              path: /healthz
              port: 10259
              scheme: HTTPS
            initialDelaySeconds: 15
          readinessProbe:
            httpGet:
              path: /healthz
              port: 10259
              scheme: HTTPS
          volumeMounts:
            - name: config-volume
              mountPath: /etc/kubernetes/my-scheduler
      volumes:
        - name: config-volume
          configMap:
            name: my-scheduler-config

스케줄러에 적합한 ClusterRole이 있는지 확인

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:kube-scheduler
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
rules:
  - apiGroups:
      - coordination.k8s.io
    resources:
      - leases
    verbs:
      - create
  - apiGroups:
      - coordination.k8s.io
    resourceNames:
      - kube-scheduler
      - my-scheduler
    resources:
      - leases
    verbs:
      - get
      - list
      - watch

Pod에서 Scheduler 지정

Scheduler를 여러 개 실행한다고 자동으로 사용하는 것은 아닙니다.

Pod에서 schedulerName 필드를 명시해야 함

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

동작

schedulerName: my-scheduler
↓
default-scheduler 무시
↓
my-scheduler가 Pod 스케줄링

지정하지 않으면?

schedulerName: # 생략
↓
default-scheduler # 사용

Scheduler 확인

Pod 조회

kubectlget pod nginx

Event 확인

kubectlget events -o wide

예시:

Scheduled   my-custom-scheduler
Successfully assigned nginx to node01

여기서

SOURCE = my-custom-scheduler

가 보이면 해당 Scheduler가 배치한 것

Scheduler 로그 확인

문제 발생 시

kubectl logs my-custom-scheduler -n kube-system

예시

successfully acquired lease
Caches are synced

등의 메시지가 보이면 정상 동작

Leader Election

고가용성(HA) 환경에서는 Scheduler를 여러 개 띄울 수 있음

예시

my-scheduler-1
my-scheduler-2
my-scheduler-3

하지만 실제 스케줄링은 한 개만 수행

이를 위해 사용:

leaderElection:

동작

Leader
 ↓
실제 스케줄링 수행
Follower
 ↓
대기

Leader 장애 시

Follower
 ↓
Leader 승격

CKA 시험 핵심

현재 Scheduler 확인

kubectlget pods-n kube-system

Scheduler 설정

schedulerName: my-scheduler

Pod 생성

spec:
  schedulerName: my-scheduler

Event 확인

kubectlget events -o wide

로그 확인

kubectl logs <scheduler-pod> -n kube-system

자주 나오는 문제

문제

Pod가 Pending 상태

schedulerName: my-scheduler

사용

원인

my-scheduler 없음

또는

my-scheduler 장애

해결

Scheduler 존재 여부 확인

kubectlget pods-n kube-system

Event 확인

kubectl describe pod nginx

보통

no scheduler found

또는

waiting for scheduler

메시지가 나타남

728x90
반응형

'Kubernetes' 카테고리의 다른 글

[Kubernetes] Admission Controllers  (0) 2026.09.19
[Kubernetes] Configuring Scheduler Profiles  (0) 2026.09.09
[Kubernetes] Priority Classes  (0) 2026.09.06
[Kubernetes] Static Pods  (0) 2026.08.30
[Kubernetes] DaemonSets  (0) 2026.08.30