.

해당 내용은 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
메시지가 나타남
'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 |