-
K8S Multiple Scheduler 생성하기K8S 2021. 6. 14. 17:46
이번 포스팅은 쿠버네티스 클러스터 내에서 스케줄러를 하나 더 만들고 이를 사용해보는 실습을 한다.
kubeadm으로 클러스터를 생성하면 /etc/kubernetes/manifest 경로에 있는
definition file들에 의해 static pod 형태로 생성된 포드를 볼 수 있다.
(뒤에 -controlplane이 붙은 포드들이 static pod들이다)
multiple scheduler를 만들기 위해 /etc/kubernetes/manifest 경로의 scheduler file을 사용한다.
참고로 생성할 스케줄러는 /etc/kubernetes/manifest 경로가 아닌 다른 경로에서 수정해주어야 한다.
이유는 다음을 참고
< 수정 전의 custom-scheduler.yaml >
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: component: kube-scheduler tier: control-plane name: kube-scheduler namespace: kube-system spec: containers: - command: - kube-scheduler - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf - --bind-address=127.0.0.1 - --kubeconfig=/etc/kubernetes/scheduler.conf - --leader-elect=true - --port=0 image: k8s.gcr.io/kube-scheduler:v1.20.0 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 8 httpGet: host: 127.0.0.1 path: /healthz port: 10259 scheme: HTTPS initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 15 name: kube-scheduler resources: requests: cpu: 100m startupProbe: failureThreshold: 24 httpGet: host: 127.0.0.1 path: /healthz port: 10259 scheme: HTTPS initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 15 volumeMounts: - mountPath: /etc/kubernetes/scheduler.conf name: kubeconfig readOnly: true hostNetwork: true priorityClassName: system-node-critical volumes: - hostPath: path: /etc/kubernetes/scheduler.conf type: FileOrCreate name: kubeconfig status: {}
이제 스케줄러 name을 my-scheduler로 변경하고 command에 다음 내용을 추가해준다.
- --leader-elect=false - --port=10282 - --scheduler-name=my-scheduler - --secure-port=0
- leader-elect: 커스텀 스케줄러는 main 스케줄러로 사용하지 않을 것이기 때문에 false를 준다.
- port: 기존에 사용하고 있는 스케줄러와 다른 포트를 사용하기 위해 10282포트를 사용
- scheduler-name: scheduler-name은 설정해주지 않으면 default 스케줄러 name으로 정해진다.
- secure-port: https는 사용하지 않겠다.
<수정 후의 custom-scheduler.yaml>
apiVersion: v1 kind: Pod metadata: labels: component: my-scheduler tier: control-plane name: my-scheduler namespace: kube-system spec: containers: - command: - kube-scheduler - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf - --bind-address=127.0.0.1 - --kubeconfig=/etc/kubernetes/scheduler.conf - --leader-elect=false - --port=10282 - --scheduler-name=my-scheduler - --secure-port=0 image: k8s.gcr.io/kube-scheduler:v1.19.0 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 8 httpGet: host: 127.0.0.1 path: /healthz port: 10282 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 15 name: kube-scheduler resources: requests: cpu: 100m startupProbe: failureThreshold: 24 httpGet: host: 127.0.0.1 path: /healthz port: 10282 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 15 volumeMounts: - mountPath: /etc/kubernetes/scheduler.conf name: kubeconfig readOnly: true hostNetwork: true priorityClassName: system-node-critical volumes: - hostPath: path: /etc/kubernetes/scheduler.conf type: FileOrCreate name: kubeconfig status: {}
이제 스케줄러를 생성해주면 다음과 같이 my-scheduler가 생성된 것을 볼 수 있다.
하지만 여기서 READY가 0/1 상태인데 왜 그럴까?
multiple scheduler는 multiple 마스터 노드들에서 돌아가고
한 마스터 노드에서는 하나의 스케줄러만 동작할 수 있기 때문이다.
그렇다면 새로 생성한 스케줄러가 잘 동작하는지는 어떻게 알 수 있을까?
기존의 스케줄러 포드를 지우거나 포드를 생성할 때 직접 사용할 스케줄러를 명시해 줄 수 있다.
후자의 방법을 이용해서 my-scheduler를 사용해보자.
다음과 같이 임의의 포드를 하나 생성해주고 사용할 schedulerName을 명시한다.
만약 스케줄러가 정상적으로 동작하지 않는다면 포드는 pendding 상태에서 머물고
잘 동작한다면 다음과 같이 정상적으로 running status를 유지한다.
반응형'K8S' 카테고리의 다른 글
K8S command와 args (0) 2021.06.15 Dockerfile CMD vs ENTRYPOINT (0) 2021.06.15 K8S Scheduling 정리2 (Resource, Daemonsets, Static pod) (0) 2021.06.13 K8S Scheduling 정리 (Taint, Toleration, Node Affinity) (0) 2021.06.12 K8S 아키텍처 정리 (Kube-scheduler, Kubelet, Kube-proxy) (0) 2021.06.02