Fairy ' s
[K8s] Scheduling 본문
스케줄러에 의존하지 않고 직접 파드를 예약하려고 할 때, 스케줄러는 어떻게 동작할까?
모든 파드에는 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 |