목차
쿠버네티스 클러스터는 한 번에 여러 스케줄러를 가질 수 있다.
Pod를 만들거나 배포할 때 특정 스케줄러가 Pod를 지정하도록 할 수 있다
Deploy Scheduler
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
복사