見出し画像

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 を使いたいですか? 🚀

いいなと思ったら応援しよう!