Search
🗓️

[CKA] 23. Multiple Schedulers

Date
2024/12/04
Category
Devops
Tag
Kubernetes
CKA
Scheduling
목차
쿠버네티스 클러스터는 한 번에 여러 스케줄러를 가질 수 있다.
Pod를 만들거나 배포할 때 특정 스케줄러가 Pod를 지정하도록 할 수 있다

 Deploy Scheduler

 kube-scheduler

바이너리를 다운로드해 여러 옵션과 함께 서비스로 실행
wget https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/linux/amd64/kube-scheduler
동일한 kube-scheduler 바이너리를 통해 추가적 스케줄러 배포 가능
Custom configuration file들을 통해 스케줄러 구성
# my-scheduler-config.yaml apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration profiles: - schedulerName: my-scheduler
YAML
복사
스케줄러마다 서로 고유한 이름을 가져야 함
kubeadm에서는 controlplane의 구성요소가 Pod나 Deployment 형태로 배포되기 때문에 이렇게 배포하는 것은 일반적이지 않음
스케줄러가 다르게 작동하기 원한다면 직접 빌드한 바이너리 사용

 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 # 위에서 구성한 config 파일 image: k8s.gcr.io/kube-scheduler-amd64:v1.11.3 name: kube-scheduler
YAML
복사
# my-scheduler-config.yaml apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration profiles: - schedulerName: my-scheduler leaderElection: leaderElect: true resourceNamespace: kube-system resourceName: lock-object-my-scheduler
YAML
복사
schedulerName을 통해 스케줄러들을 구분함
leaderElection 옵션은 스케줄러의 복사본을 여러 Master Node에서 실행할 때 사용 (HA)
동일한 스케줄러의 복사본이 다른 노드에서 실행될 경우 한 번에 하나만 활성화

 How to deploy additional scheduler

Package the scheduler

스케줄러 바이너리를 컨테이너 이미지로 패키징한다
git clone https://github.com/kubernetes/kubernetes.git cd kubernetes make
Bash
복사
# Dockerfile FROM busybox ADD ./_output/local/bin/linux/amd64/kube-scheduler /usr/local/bin/kube-scheduler
Docker
복사
docker build -t gcr.io/my-gcp-project/my-kube-scheduler:1.0 . # The image name and the repository gcloud docker -- push gcr.io/my-gcp-project/my-kube-scheduler:1.0 # used in here is just an example
Bash
복사

Define a Kubernetes Deployment for the scheduler

컨테이너 이미지에 스케줄러가 있으므로, 이에 대한 Pod를 만들어 실행
주석 참조
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 --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: my-scheduler-extension-apiserver-authentication-reader namespace: kube-system roleRef: kind: Role name: extension-apiserver-authentication-reader apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: my-scheduler namespace: kube-system --- apiVersion: v1 kind: ConfigMap metadata: name: my-scheduler-config namespace: kube-system data: my-scheduler-config.yaml: | # Configmap으로 custom scheduler configuration file 정의 apiVersion: kubescheduler.config.k8s.io/v1beta2 kind: KubeSchedulerConfiguration profiles: - schedulerName: my-scheduler # 스케줄러 이름 leaderElection: leaderElect: false # scheduler의 replica가 1이기 때문에 false값을 가짐 --- apiVersion: apps/v1 kind: Deployment metadata: labels: component: scheduler tier: control-plane name: my-scheduler namespace: kube-system spec: selector: matchLabels: component: scheduler tier: control-plane replicas: 1 template: metadata: labels: component: scheduler tier: control-plane version: second spec: serviceAccountName: my-scheduler containers: - command: - /usr/local/bin/kube-scheduler # kube-scheduler 바이너리 - --config=/etc/kubernetes/my-scheduler/my-scheduler-config.yaml # custom scheduler configuration file 사용 image: gcr.io/my-gcp-project/my-kube-scheduler:1.0 # 위에서 생성한 스케줄러 이미지 livenessProbe: httpGet: path: /healthz port: 10259 scheme: HTTPS initialDelaySeconds: 15 name: kube-second-scheduler readinessProbe: httpGet: path: /healthz port: 10259 scheme: HTTPS resources: requests: cpu: '0.1' securityContext: privileged: false volumeMounts: - name: config-volume mountPath: /etc/kubernetes/my-scheduler hostNetwork: false hostPID: false volumes: # 위에서 정의한 configmap을 볼륨으로 전달 - name: config-volume configMap: name: my-scheduler-config
YAML
복사
상단의 ServiceAccount, ClusterRoleBinding 등은 인증을 위한 것이며, 추가적 스케줄러를 구성하는데 필수적

 Use Custom Scheduler

커스텀 스케줄러를 사용하는 방법은 정의 파일에 schdulerName 필드를 추가하고 스케줄러 이름을 명시하면 끝
# pod-definition apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx name: nginx schedulerName: my-custom-scheduler
YAML
복사
Scheduler가 제대로 설정되지 않으면 Pod는 계속 Pending 상태가 지속된다

 View Events

어떤 스케줄러가 Pod를 스케줄링했는지 kubectl get events -o wide 명령을 통해 확인할 수 있다
현재 네임스페이스에 있는 모든 이벤트 열거
Reason, Source 필드를 통해 스케줄링이 되었는지, 어떤 스케줄러를 사용했는지 확인 가능

 View Scheduler Logs

문제 발생시 스케줄러의 로그 확인 가능
kubectl logs my-custom-scheduler --name-space=kube-system
Bash
복사