Kubernetesクラスターを運用していると、特定のPodを希望するノードに明確に配置する必要がある状況が発生します。本日は、最も直感的で基本的なスケジューリング方法であるnodeNameとnodeSelectorについて詳しく解説します。

1. Podスケジューリングとは? 📍
Kubernetesにおけるスケジューリングとは、待機中のPodが適切なノードに割り当てられ、実行されるように決定するプロセスです。基本的にはkube-schedulerがノードのリソース状態を確認して自動的に配置しますが、管理者が直接制御する必要がある場合にnodeNameとnodeSelectorを使用します。
2. 最も強力でシンプルな方法: nodeName 🎯
nodeNameは、スケジューラーの複雑な計算を完全に無視し、特定のノード名を明示することでPodを強制的に配置する方法です。
- 特徴: kube-schedulerを経由せず、直接そのノードのkubeletにPodの実行を要求します。
- 長所: 非常に高速で確実です。
- 短所: 柔軟性が全くありません。指定された名前のノードが存在しないか、リソースが不足している場合、Podは実行されません。
💻 YAML設定例
YAML
apiVersion: v1
kind: Pod
metadata:
name: nodename-pod
spec:
containers:
- name: nginx
image: nginx
nodeName: worker-node-01 # このノードにのみ割り当てられる
3. ラベルベースの柔軟な選択: nodeSelector 🏷️
nodeSelectorは、ノードに設定された
ラベル(Label)
に基づいて、Podが割り当てられるノードグループを選択する方法です。現在、Kubernetesで最も推奨される基本的なスケジューリング方法です。
- 特徴: Podの仕様書で定義されたキーと値のペア(Key-Value pair)と一致するラベルを持つノードにのみPodが配置されます。
- 使用フロー:
- ノードにラベルを付与します。
- Podの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. 注意事項と限界 ⚠️
- 大文字小文字の区別: ラベルのキーと値は厳密に大文字小文字を区別します。
- 一致要件: nodeSelectorで指定されたすべてのラベルがノードに存在する必要があります。1つでも一致しない場合、PodはPending状態のままになります。
- 複雑な条件: 「AまたはBノード」、「ラベルのないノードを除外」のような複雑なロジックはnodeSelectorで実装するのが困難です。この場合、より上位の概念であるNode Affinityを使用する必要があります。
この情報がクラスターリソースを効率的に管理するのに役立つことを願っています。
コメントを残す