[쿠버네티스] 스케쥴링

    728x90
    반응형

    출처

    Cloud Native DevOps with Kubernetes / 쿠버네티스를 활용한 클라우드 네이티브 데브옵스

    Certified Kubernetes Administrator (CKA) with Practice Tests(Udemy)

     

    Manual Scheduling

    What is k8s Scheduler?

    클러스터 내에서 리소스를 최적화하고 Pod의 요구 사항을 충족시키는 적절한 노드를 선택한다.

     

    How scheduling Works

    1. 스케쥴러는 모든 Pod를 살펴보고 nodeName Property가 없는 Pod를 식별한다.
    2. 스케쥴러는 적합한 노드를 선택한 뒤, 해당 Pod가 그 노드에 스케줄링되도록 설정해준다.
    3. Pod의 스케줄링 요구 사항과 제약 조건(리소스 요청, 노드 라벨, 노드 셀렉터)을 분석하여 스케줄링한다.

     

    Manuel Scheduling의 장점

    스케쥴러 무시 nodeName 필드를 사용하면 k8s 스케쥴러는 해당 Pod의 스케쥴링을 건너뛰고, 사용자가 지정한 노드에서 실행한다.
    제약조건 미적용 k8s 스케쥴러가 실행되지 않으므로, 리소스 요구사항이나 제약조건을 확인하지 않는다.
    단순성 설정이 간단하며, 테스트 또는 디버깅 목적에 적합하다.

     

     

    Manuel Scheduling의 단점

    운영환경에 부적합 클러스터의 리소스 사용률 최적화를 보장하지 못한다.
    자동 복구 기능이 지원되지 않는다.
    휴먼에러 사용자가 노드의 상태를 잘못 판단하여 리소스 부족 등의 문제를 초래할 수 있다.
    관리 오버헤드 모든 Pod에 대해 수동으로 노드를 지정해야 하므로 대규모 클러스터 관리에 부적합하다.

     

    How to use Manual Scheduling

    1. Pod를 생성할 때, Pod Yaml에서 nodeName 필드를 지정하여 Pod가 특정 노드에서 실행되도록 설정해준다.
      Manual Scheduling은 Pod가 생성될 때만 동작한다.
    2. Pod Binding으로 Pod가 선택된 노드에서 실제로 실행되도록 설정해준다.
      이미 생성된 Pod를 스케쥴링하기 위해 Binding객체를 만들어 Pod와 노드를 매칭시킨다.

     

    #k8s 스케쥴러가 작동하고 있는지 확인
    #Manual Scheduling 테스트를 위해 kube-scheduler가 없는 것을 확인
    [root@]$ kubectl get po -n kube-system
    NAME                                   READY   STATUS    RESTARTS   AGE
    coredns-77d6fd4654-nhmzc               1/1     Running   0          6m17s
    coredns-77d6fd4654-wx2kf               1/1     Running   0          6m17s
    etcd-controlplane                      1/1     Running   0          6m22s
    kube-apiserver-controlplane            1/1     Running   0          6m22s
    kube-controller-manager-controlplane   1/1     Running   0          6m22s
    kube-proxy-gkp7m                       1/1     Running   0          6m17s
    kube-proxy-s6t65                       1/1     Running   0          5m58s

     

    #Pod를 실행시켰으나 Node가 없어 Pending 상태인 것을 확인
    [root@]$ kubectl run nginx --image=nginx:alpine
    pod/nginx created
    
    [root@]$ kubectl get po
    NAME    READY   STATUS    RESTARTS   AGE
    nginx   0/1     Pending   0          14s
    
    [root@]$ kubectl describe po nginx
    Name:             nginx
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             <none>
    Labels:           <none>
    Annotations:      <none>
    Status:           Pending
    IP:               
    IPs:              <none>
    Containers:
      nginx:
        Image:        nginx
        Port:         <none>
        Host Port:    <none>
        Environment:  <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-w68gs (ro)
    Volumes:
      kube-api-access-w68gs:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:                      <none>

     

    #Pod를 삭제 후 새로 생성해야함
    [root@]$ kubectl delete po nginx
    pod "nginx" deleted
    
    #yaml파일에 nodeName을 직접 추가
    [root@]$ vi nginx.yaml
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      -  image: nginx
         name: nginx
      nodeName: node01 #nodeName 추가
    
    #Pod를 새로 생성
    [root@]$ kubectl apply -f nginx.yaml
    pod/nginx created
    
    #Pod 상태 확인
    [root@]$ kubectl get po
    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          8s

     

    #yaml파일 수정
    [root@]$ vi nginx.yaml
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      -  image: nginx
         name: nginx
      nodeName: node01 #nodeName 추가
    
    #Pod를 삭제하지 않고 replace를 사용해 수정된 내용을 반영
    [root@]$ kubectl replace --force -f nginx.yaml
    pod "nginx" deleted
    pod/nginx replaced
    
    #Pod상태 확인
    [root@]$ kubectl get po
    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          20s

    728x90
    반응형

    댓글