본문 바로가기
클라우드/쿠버네티스

쿠버네티스 파드 배치의 기본: nodeName과 nodeSelector 완벽 가이드 ☸️

by gasbugs 2026. 2. 19.

쿠버네티스 클러스터를 운영하다 보면 특정 파드를 원하는 노드에 명확하게 배치해야 할 상황이 생깁니다. 오늘은 가장 직관적이고 기초적인 스케줄링 방법인 nodeName과 nodeSelector에 대해 상세히 정리해 드리겠습니다.


1. 파드 스케줄링이란? 📍

쿠버네티스에서 스케줄링은 대기 중인 파드가 적절한 노드에 할당되어 실행되도록 결정하는 과정입니다. 기본적으로 kube-scheduler가 노드의 자원 상태를 확인하여 자동으로 배치하지만, 관리자가 직접 제어해야 할 때 nodeName과 nodeSelector를 사용합니다.


2. 가장 강력하고 단순한 방법: nodeName 🎯

nodeName은 스케줄러의 복잡한 계산을 완전히 무시하고, 특정 노드 이름을 명시하여 파드를 강제로 배치하는 방식입니다.

  • 특징: kube-scheduler를 거치지 않고 바로 해당 노드의 kubelet에게 파드 실행을 요청합니다.
  • 장점: 매우 빠르고 확실합니다.
  • 단점: 유연성이 전혀 없습니다. 해당 이름의 노드가 없거나 자원이 부족하면 파드는 실행되지 않습니다.

💻 예시 YAML 설정

YAML
 
apiVersion: v1
kind: Pod
metadata:
  name: nodename-pod
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: worker-node-01 # 반드시 이 노드에만 배정됨

3. 라벨 기반의 유연한 선택: nodeSelector 🏷️

nodeSelector는 노드에 설정된 **라벨(Label)**을 기반으로 파드가 배정될 노드 그룹을 선택하는 방식입니다. 현재 쿠버네티스에서 가장 권장되는 기초적인 스케줄링 방법입니다.

  • 특징: 파드 명세서에 정의된 키-값 쌍(Key-Value pair)과 일치하는 라벨을 가진 노드에만 파드가 배치됩니다.
  • 사용 흐름:
    1. 노드에 라벨을 부여합니다.
    2. 파드 YAML의 nodeSelector에 해당 라벨을 명시합니다.

🛠️ 노드에 라벨 지정하기

먼저 터미널에서 노드에 고유한 특성을 부여합니다.

Bash
 
kubectl label nodes worker-node-02 disktype=ssd

💻 예시 YAML 설정

YAML
 
apiVersion: v1
kind: Pod
metadata:
  name: nodeselector-pod
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    disktype: ssd # 'disktype=ssd' 라벨이 있는 노드에만 배치됨

4. nodeName vs nodeSelector 비교 요약 📊

구분 nodeName nodeSelector
방식 노드 이름을 직접 명시 노드의 라벨을 조건으로 명시
스케줄러 개입 X (스케줄러 우회) O (스케줄러가 조건 검색)
유연성 매우 낮음 (고정됨) 중간 (동일 라벨 노드 중 선택)
권장 용도 특정 노드 장애 디버깅 시 특정 하드웨어(GPU, SSD) 요구 시

5. 주의사항 및 한계점 ⚠️

  1. 대소문자 구분: 라벨의 키와 값은 대소문자를 엄격히 구분합니다.
  2. 일치 여부: nodeSelector에 명시된 모든 라벨이 노드에 존재해야 합니다. 하나라도 맞지 않으면 파드는 Pending 상태에 머뭅니다.
  3. 복잡한 조건: "A 또는 B 노드", "라벨이 없는 노드 제외" 같은 복잡한 논리는 nodeSelector로 구현하기 어렵습니다. 이 경우 더 상위 개념인 Node Affinity를 사용해야 합니다.

이 내용이 클러스터 자원을 효율적으로 관리하시는 데 도움이 되기를 바랍니다.