kubernetes의 default scheduler를 통해서 스케줄링을 받지 않고, 직접 pod의 scheduling을 설정하고 싶으면 어떻게해야할까??
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를 호출하는 것이다.
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
에 전달하면 된다.