Kubernetes 클러스터에서는 보통 내장된 스케줄러가 Pod를 적절한 노드에 자동으로 배치합니다. 그러나 스케줄러가 없는 경우, 또는 특정 상황에서 수동으로 Pod를 스케줄링해야 할 때가 있습니다. 이번 글에서는 수동으로 Pod를 노드에 스케줄링하는 방법을 알아보겠습니다.
Pod는 Kubernetes에서 가장 기본적인 배포 단위로, 하나 이상의 컨테이너를 포함합니다. 모든 Pod nodeName
이라는 필드를 가지며, 이 필드는 기본적으로 설정되지 않은 상태로 남아있습니다. nodeName
필드를 설정하지 않으면 Kubernetes 스케줄러가 이를 자동으로 지정합니다. 하지만, 스케줄러가 없는 경우에는 사용자가 직접 이 필드를 설정해야 합니다.
Kubernetes 스케줄러는 다음과 같은 역할을 수행합니다:
nodeName
필드가 설정되지 않은 Pod를 찾아냅니다.nodeName
필드를 Pod를 해당 노드에 스케줄링합니다.스케줄러가 없으면 Pod는 계속해서 대기(pending) 상태에 머물게 됩니다. 이 상태에서는 Pod가 실제로 실행되지 않습니다. 따라서, 관리자는 수동으로 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에 대해 이 필드를 수정할 수는 없습니다.
이미 생성된 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를 수동으로 스케줄링할 수 있습니다.
Kubernetes에서 수동으로 Pod를 스케줄링하는 방법은 여러 가지가 있으며, 상황에 따라 적절한 방법을 선택할 수 있습니다. 기본적으로 스케줄러가 없을 때는 nodeName
필드를 사용하거나, Binding 객체를 생성하여 Pods Binding API를 통해 Pod를 할당하는 방법을 사용할 수 있습니다.