Kubernetes Pod配置の基本: nodeNameとnodeSelectorの完全ガイド ☸️

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が配置されます。
  • 使用フロー:
  1. ノードにラベルを付与します。
  2. 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. 注意事項と限界 ⚠️

  1. 大文字小文字の区別: ラベルのキーと値は厳密に大文字小文字を区別します。
  2. 一致要件: nodeSelectorで指定されたすべてのラベルがノードに存在する必要があります。1つでも一致しない場合、PodはPending状態のままになります。
  3. 複雑な条件: 「AまたはBノード」、「ラベルのないノードを除外」のような複雑なロジックはnodeSelectorで実装するのが困難です。この場合、より上位の概念であるNode Affinityを使用する必要があります。

この情報がクラスターリソースを効率的に管理するのに役立つことを願っています。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です