Fairy ' s

[K8s] Scheduling 본문

Study/K8s

[K8s] Scheduling

berafairy 2023. 8. 10. 22:34

 

 스케줄러에 의존하지 않고 직접 파드를 예약하려고 할 때, 스케줄러는 어떻게 동작할까?

 모든 파드에는 Node Name이라는 필드가 있다. 디폴트로는 값이 들어가 있지 않은데, 일반적으로 definition file을 만들 때 지정하지 않고, 쿠버네티스가 자동으로 추가하는 필드이다. 스케줄러는 모든 파드들을 검사하면서 Node Name 속성이 설정되지 않은 파드를 찾는데. 이들이 스케줄링의 후보가 되고, 그 다음 스케줄링 알고리즘을 사용해 파드에 적합한 노드를 고른 뒤 파드를 그 노드에 스케줄링한다. 이 때 바인딩 오브젝트를 생성하고, 파드의 Node Name에 그 노드의 이름이 들어가게 된다.

 만약 모니터링하고 스케줄링할 스케줄러가 없다면, 파드는 계속 보류(Pending)중이게 된다. 이 경우 수동으로 파드를 노드에 할당해야 한다. 스케줄러 없이 파드를 스케줄링하는 가장 쉬운 방법은 파드를 생성할 때 pod sepcification file에서 Node Name에 노드 이름을 지정하는 것이다. 이 방법은 파드를 만들 때만 가능하며 이렇게 하면 파드가 지정된 노드에 할당된다. 

# pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
      -containerPort: 8080
  nodeName: node01

 쿠버네티스에서 Node Name 속성을 수정하지 못하게 해두었기 때문에, 이미 파드가 생성된 경우에 파드를 노드에 할당하고 싶다면 바인딩 오브젝트를 만들고, 파드의 바인딩 API에 POST 요청을 보내면 된다. 이 방식은 실제로 스케줄러가 수행하는 작업과 같다.

# pod-bind-definition.yam

apiVersion: v1
kind: Binding
metadata:
  name: nginx
target:
  apiVersion: v1
  kind: Node
  name:
$ curl --header "Content-Type:application/json" --request POST --data '{"apiVersion": "v1",
  "kind": "Binding" ..., http://$SERVER/api/vl/namespaces/default/pods/$PODNAME/binding/

 바인딩 객체에서 target 하위의 name에 노드의 이름이 들어가고, 바인딩 API에 POST 요청을 보낸다. 요청을 보낼 때에는, yaml을 JSON으로 변환한 데이터를 사용해야 한다.

 

'Study > K8s' 카테고리의 다른 글

[K8s] Taints and Tolerations  (0) 2023.08.17
[K8s] Labels & Selectors  (0) 2023.08.14
[K8s] kubectl apply command  (0) 2023.08.09
[K8s] Imperative vs Declarative  (0) 2023.08.08
[K8s] Namespaces  (0) 2023.08.08
Comments