CKA를 준비해보자 6일차 - Scheduling

0

CKA

목록 보기
6/43

Scheduling

kubernetes의 default scheduler를 통해서 스케줄링을 받지 않고, 직접 pod의 scheduling을 설정하고 싶으면 어떻게해야할까??

  • pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 8080

위의 pod정의에서 사실 nodeName이라는 field가 있다.

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

nodeName는 기본적으로 설정되어있지 않고, 일반적으로 이 field를 사용자가 설정해주진 않는다. pod가 생성되면 kubernetes에서 자동으로 설정해주는 부분이라고 생각하면 된다.

kubernetes는 pod가 생성될 때, pod에 nodeName field가 설정되어있는 지 아닌 지 확인한다. 그러고는 스케줄링 알고리즘에 의해 해당 pod를 어떤 node에 배정할 것인지를 결정하고, nodeName을 해당 node이름으로 놓는다. 이후 해당 node에서 pod를 스케줄링하는 것이다.

만약 위의 pod가 node2에 바인딩된다면, 다음과 같이 nodeName이 설정된다.

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

만약 이러한 스케줄러가 없어 스케줄링 동작이 없었으면 pod는 계속 Pending상태에 빠질 것이다. 이때는 직접 node를 설정해주는 수 밖에 없다. 따라서, nodeName을 원하는 node로 직접 설정해주면 된다.

단, 이는 pod를 초기 생성할 단계에만 유의미하다. 만약 이미 pod가 특정 node에 할당된 상태라면 nodeName이 바뀌어도 kubernetes는 이를 허용하지 않는다.

이를 해결하는 다른 방법이 있는데, Binding object를 만들고 pod binding API를 호출하는 것이다.

  • pod-bind-definition.yaml
apiVersion: v1
kind: Binding
metadata:
  name: nginx
target:
  apiVersion: v1
  kind: Node
  name: node2 # target node name

name부분에 pod를 배포하려는 node의 이름을 적어주고 다음의 POST 요청을 보내면 된다.

curl --header "Content-Type: application/json" --request POST --data '{"apiVersion": "v1", "kind": "Binding" ...}' http://$SERVER/api/v1/namespace/default/pods/$PODNAME/binding/

yaml file을 json file로 바꾸어 --data에 전달하면 된다.

0개의 댓글