Manual Scheduling(nodeName)

Yu Sang Min·2025년 5월 25일

CKA

목록 보기
17/110
post-thumbnail

📌 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 개체를 사용할 때는 일단 스케줄러가 동작하지 않는 상태여야 함
  • 생성하고자 하는 PodPending 상태여야 함
  • Binding 개체를 생성하고 여기에 할당할 Node를 명시해주고
  • kubectl create -f binding-pod.yaml 명령어로 Binding개체를 생성해주면 스케줄러의 역할을 대신해 Pod를 명시한 Node에 할당한다.
$ kubectl replace --force -f <yaml Name>.yaml
  • 대부분의 경우 pod의 yaml파일에서 nodeName 필드를 수정하고 위 명령어를 입력하면 삭제 후 할당 할 노드를 바꾸어 Pod를 재배치한다
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글