ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 경로가 아닌 다른 경로에서 수정해주어야 한다.

    이유는 다음을 참고 

     

    K8S Scheduling 정리2 (Resource, Daemonsets, Static pod)

    1. 리소스 관리 Docker container에서의 컨테이너 리소스 제한은 없다. 즉 계속 확장된다. 하지만 쿠버네티스에서 리소스 사용량을 제한하며 default resource request는 container당 0.5vcpu와 256Mi, default re..

    seungjuitmemo.tistory.com

     

     

     

    < 수정 전의 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를 유지한다. 

     

    반응형

    댓글

Designed by Tistory.