
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
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
pod나 deployment로 배포되어 있어 위와 같이 하는 경우는 거의 없음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 실제 파일을 참조하고 있음
다중의 마스터 노드가 있으면 이 추가 매개 변수를 넘겨 로그 개체 이름을 설정 가능
$ 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 상태$ kubectl get events -o wide
$ kubectl logs my-custom-scheduler --name-space=kube-system