
Kubernetes の nodeSelector を使いこなそう!シンプルなノード指定の方法
Kubernetes でアプリをデプロイしていると、「この Pod は特定のノードで動かしたい!」と思うことがありますよね。例えば、高速な SSD を搭載したノードにだけデータベースの Pod を配置したい、あるいは GPU ノードにだけ機械学習用の Pod を配置したい など。
そんなときに使えるのが nodeSelector です。これは、指定した条件に合うノードだけに Pod をスケジュールするシンプルな方法 です。
nodeSelector の基本構文
まずは nodeSelector を使った Pod の YAML 定義を見てみましょう。
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
nodeSelector:
disktype: ssd
containers:
- name: example-container
image: nginx
この設定では、disktype=ssd というラベルが付いたノードにだけ Pod をスケジュールするように指定しています。
イメージとしては、こんな感じです👇
Kubernetes のノード一覧
node-1(disktype=ssd) → Pod 配置 OK!
node-2(disktype=hdd) → 条件に合わないのでスケジュールされない
node-3(disktype=ssd) → Pod 配置 OK!
このように、ラベルを使って 特定のノードにのみ Pod を配置できる のが nodeSelector の基本的な仕組みです。
nodeSelector の特徴と制限
nodeSelector には以下のような特徴があります。
(1) シンプルなラベルマッチング
nodeSelector は 「このラベルがあるノードに配置する」 という単純な仕組みです。
例えば、disktype=ssd や gpu=true など、ラベルを 1 つ指定すれば OK。
直感的で使いやすいですね!
(2) 複数の AND 条件は可能
nodeSelector では、複数のキーと値を指定できます。
nodeSelector:
disktype: ssd
region: us-west
この場合、「disktype=ssd かつ region=us-west」のノードだけが対象 になります。
(3) OR 条件や範囲指定はできない
nodeSelector には 「disktype=ssd または disktype=hdd」のような OR 条件 を指定できません。
また、数値範囲(例:CPU コア数が 4 以上のノード)といった条件も扱えません。
こうした より柔軟な条件指定をしたい場合は nodeAffinity を使う のがオススメです!
nodeSelector と nodeAffinity の違い
「nodeSelector だけでいいの?」と思うかもしれませんが、より細かい指定ができる nodeAffinity という仕組み もあります。
イメージとしては、nodeSelector は「絶対にこの条件!」と決めるシンプルな仕組み なのに対して、
nodeAffinity は 「この条件がいいけど、別の選択肢もあり」 というような柔軟な設定ができます。
例えば、以下のような違いがあります。
「SSD のノードに配置したい」
nodeSelector → 「SSD 以外は絶対にダメ」
nodeAffinity → 「SSD が理想だけど、なければ HDD でもOK」
「東京リージョンか大阪リージョンに配置したい」
nodeSelector → 「どちらかを指定するしかない」
nodeAffinity → 「どちらでも OK(OR 条件が使える)」
「CPU コア数が 8 以上のノードに配置したい」
nodeSelector → 「そもそも数値範囲での指定はできない」
nodeAffinity → 「CPU コア数 8 以上のノードに優先的に配置できる」
例えば、nodeAffinity を使うと 「disktype=ssd または disktype=hdd のノードに配置」 という指定ができます。
apiVersion: v1
kind: Pod
metadata:
name: affinity-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
- hdd
containers:
- name: example-container
image: nginx
これなら、SSD でも HDD でも OK な Pod を作れます。
また、preferredDuringSchedulingIgnoredDuringExecution を使えば「できれば SSD に配置したいけど、なければ他のノードでもいい」というような優先度付きの指定もできます。
どんなときに nodeSelector を使うべき?
では、nodeSelector を使うべきなのはどんなケースでしょうか?
✅ シンプルなノード指定がしたい場合
「このラベルがついたノードにだけ配置したい!」という 単純なルール なら nodeSelector がベストです。
✅ クラスタのラベル管理がしっかりしている場合
あらかじめノードに適切なラベルが設定されていれば、nodeSelector で簡単に管理できます。
🚀 逆に nodeAffinity を使うべきケース
「SSD か HDD どちらかに配置」など OR 条件を指定したい
「このノードが望ましいが、なければ他でも OK」など柔軟な制約をつけたい
まとめ
nodeSelector は シンプルなキー・バリューのラベルマッチング で Pod を特定のノードに配置する
AND 条件は指定できるが、OR 条件や範囲指定は できない
より柔軟な条件(OR 条件、優先度付き配置など)が必要なら nodeAffinity を使うのがオススメ
「とにかく手軽に特定のノードに配置したい!」というときは nodeSelector が便利です。
一方で、もう少し細かい制御をしたいなら nodeAffinity も検討してみるといいでしょう!
あなたの Kubernetes 環境では、どんなケースで nodeSelector を使いたいですか? 🚀