📌 Manual Scheduling
- node 위에 Pod를 수동으로 스케쥴링 하는법
- 클러스터에 Scheduler가 없는 경우 수동으로 직접 스케쥴링
# pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: pod
spec:
containers:
- name: nginx-pod
image: nginx
ports:
- containerPort: 8080
nodeName: // 이 필드를 주목
nodeName 필드는 default로 설정되어 있지 않음
- 스케쥴러는 모든 pod를 살펴보고 이 필드가 없는 pod를 찾음
- 이후 스케줄러 알고리즘을 통해 올바른 노드를 식별
- 일단 식별되면 노드에 pod를 지정
❓ 만약 스케쥴러가 없다면?
- pod는 여전히 보류 상태이다. (Pending)
- 이 경우 node에 직접 pod를 할당한다.
- Pending 상태에서 직접 pod의 구성 파일(yaml) 에 수동으로
nodeName 필드에 배치할 node를 작성해 주는것이 가장 쉬운 방법
- 노드 이름은 생성 시에만 지정할 수 있다.
❓ pod가 이미 생성 됐는데 그걸 다른 노드에 할당 하고싶다면?
- 쿠버네티스는 한 pod의 nodeName을 수정하지 못하게 한다.
- 이미 있는 pod에 node를 할당하는 방법은
Binding 오브젝트를 생성하고 pod의 Binding API에 게시 요청을 보내는것
- 실제 스케줄러가 하는일을 모방
# Pod-bind-definition.yaml
apiVersion: v1
kind: Binding
metadata:
name: nginx
target:
apiVersion: v1
kind: 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: node02
- 위
Binding 개체를 사용할 때는 일단 스케줄러가 동작하지 않는 상태여야 함
- 생성하고자 하는
Pod는 Pending 상태여야 함
Binding 개체를 생성하고 여기에 할당할 Node를 명시해주고
kubectl create -f binding-pod.yaml 명령어로 Binding개체를 생성해주면 스케줄러의 역할을 대신해 Pod를 명시한 Node에 할당한다.
$ kubectl replace --force -f <yaml Name>.yaml
- 대부분의 경우
pod의 yaml파일에서 nodeName 필드를 수정하고 위 명령어를 입력하면 삭제 후 할당 할 노드를 바꾸어 Pod를 재배치한다