[Scheduling] Manual Scheduling

IMKUNYOUNG·2024년 7월 31일
0

KCNA

목록 보기
10/56

Kubernetes 클러스터에서는 보통 내장된 스케줄러가 Pod를 적절한 노드에 자동으로 배치합니다. 그러나 스케줄러가 없는 경우, 또는 특정 상황에서 수동으로 Pod를 스케줄링해야 할 때가 있습니다. 이번 글에서는 수동으로 Pod를 노드에 스케줄링하는 방법을 알아보겠습니다.

1. Pod 정의 파일의 이해

Pod는 Kubernetes에서 가장 기본적인 배포 단위로, 하나 이상의 컨테이너를 포함합니다. 모든 Pod nodeName이라는 필드를 가지며, 이 필드는 기본적으로 설정되지 않은 상태로 남아있습니다. nodeName 필드를 설정하지 않으면 Kubernetes 스케줄러가 이를 자동으로 지정합니다. 하지만, 스케줄러가 없는 경우에는 사용자가 직접 이 필드를 설정해야 합니다.

2. 스케줄러의 역할

Kubernetes 스케줄러는 다음과 같은 역할을 수행합니다:

  • 모든 Pod를 검사하여 nodeName 필드가 설정되지 않은 Pod를 찾아냅니다.
  • 스케줄링 알고리즘을 통해 Pod를 실행할 적합한 노드를 식별합니다.
  • 적절한 노드가 결정되면, 해당 Pod의 nodeName 필드를 Pod를 해당 노드에 스케줄링합니다.

3. 스케줄러가 없는 경우의 Pod 상태

스케줄러가 없으면 Pod는 계속해서 대기(pending) 상태에 머물게 됩니다. 이 상태에서는 Pod가 실제로 실행되지 않습니다. 따라서, 관리자는 수동으로 Pod를 특정 노드에 할당해 줄 필요가 있습니다.

4. 수동으로 Pod를 스케줄링하는 방법

4.1. Pod 생성 시 nodeName 필드 설정

가장 간단한 방법은 Pod를 생성할 때 nodeName 필드를 지정하는 것입니다. Pod 명세 파일의 spec 부분에 다음과 같이 노드 이름을 설정할 수 있습니다:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: kube-01

이렇게 하면 Pod는 지정된 노드에 할당됩니다. 하지만, nodeName 필드는 Pod 생성 시에만 설정할 수 있습니다. 이미 생성된 Pod에 대해 이 필드를 수정할 수는 없습니다.

4.2. Binding 객체를 사용한 Pod 스케줄링

이미 생성된 Pod를 특정 노드에 할당하고자 할 때는 binding 객체를 사용해야 합니다. 이 방법은 Kubernetes API를 통해 binding 객체를 생성하고, 이를 Pods Binding API에 POST 요청으로 전송하는 방식입니다. Binding 객체에는 다음과 같은 정보가 포함됩니다:

{
  "apiVersion": "v1",
  "kind": "Binding",
  "metadata": {
    "name": "pod이름"
  },
  "target": {
    "apiVersion": "v1",
    "kind": "Node",
    "name": "노드이름"
  }
}

위와 같은 JSON 형식의 데이터를 Kubernetes API 서버에 전송하여, 원하는 노드에 Pod를 수동으로 스케줄링할 수 있습니다.

5. 마치며

Kubernetes에서 수동으로 Pod를 스케줄링하는 방법은 여러 가지가 있으며, 상황에 따라 적절한 방법을 선택할 수 있습니다. 기본적으로 스케줄러가 없을 때는 nodeName 필드를 사용하거나, Binding 객체를 생성하여 Pods Binding API를 통해 Pod를 할당하는 방법을 사용할 수 있습니다.

0개의 댓글