Kubernetes デプロイメントで異なるノードセレクターを使用する方法

KubernetesBeginner
オンラインで実践に進む

はじめに

このチュートリアルでは、Kubernetes のノードセレクターについて包括的に理解することができます。ノードセレクターは、クラスタ内の特定のノードにポッドを配置することを制御できる強力な機能です。ノードラベルとセレクターを使用することで、ハードウェア仕様、ソフトウェアバージョン、その他のカスタム属性など、特定の条件を満たすノードにポッドがスケジュールされるようにすることができます。基本的な概念、アプリケーションシナリオを探索し、Kubernetes のノードセレクターの使用方法を示すコード例も提供します。

Kubernetes のノードセレクターについて

Kubernetes のノードセレクターは、クラスタ内の特定のノードにポッドを配置することを制御できる強力な機能です。ノードラベルとセレクターを使用することで、ハードウェア仕様、ソフトウェアバージョン、その他のカスタム属性など、特定の条件を満たすノードにポッドがスケジュールされるようにすることができます。

このセクションでは、Kubernetes のノードセレクターの基本的な概念、アプリケーションシナリオを探索し、その使用方法を示すコード例も提供します。

Kubernetes のノードセレクターとは?

Kubernetes のノードセレクターは、ポッドをスケジュールするノードを指定する方法です。これは、ノードにラベルを付け、そのラベルをポッド仕様で使用して目的のノードを選択することで実現されます。

Kubernetes クラスタ内のノードには、キーと値のペアでラベルを付けることができ、これらはノードのさまざまな属性を表すことができます。例えば以下のようなものがあります。

  • ハードウェア仕様(例: hardware=highperformance, cpu=8, memory=16Gi
  • ソフトウェアバージョン(例: os=ubuntu2204, kubernetes-version=1.21.0
  • ロケーション(例: region=us-east1, zone=a
  • カスタム属性(例: app=frontend, environment=production

ノードにラベルを付けたら、ポッド仕様の nodeSelector フィールドを使用して、ポッドを配置する目的のノードを選択することができます。

ポッドにノードセレクターを適用する

ポッドにノードセレクターを適用するには、ポッド仕様に nodeSelector フィールドを追加する必要があります。nodeSelector フィールドは、ノードのラベルと一致する必要があるキーと値のペアのマップです。

以下は、ノードセレクターを持つポッド仕様の例です。

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: my-app
      image: my-app:v1
  nodeSelector:
    hardware: highperformance
    os: ubuntu2204

この例では、ポッドは hardware=highperformanceos=ubuntu2204 のラベルが付いたノードにスケジュールされます。

ノードセレクターの検証

ポッドが正しいノードにスケジュールされたことを検証するには、kubectl get pods コマンドを使用して、NODE 列を確認します。この列には、ポッドが実行されているノードの名前が表示されます。

また、kubectl describe pod <pod-name> コマンドを使用して、ポッドが実行されているノードや、ポッドのノードセレクターと一致するノードラベルなど、ポッドの詳細を確認することもできます。

Kubernetes のノードセレクターを理解して使用することで、クラスタ内の最も適切なノードにポッドを配置し、リソースの利用効率とアプリケーションのパフォーマンスを最適化することができます。

Kubernetes ポッドのノードセレクターの設定

前のセクションでは、Kubernetes のノードセレクターの基本的な概念を探索しました。では、Kubernetes ポッドのノードセレクターを設定するプロセスについて詳しく見ていきましょう。

ノードにラベルを付ける

ノードセレクターを使用する最初のステップは、Kubernetes クラスタ内のノードに目的の属性でラベルを付けることです。kubectl label コマンドを使用してノードにラベルを付けることができます。

kubectl label nodes node1 hardware=highperformance
kubectl label nodes node2 hardware=lowperformance

この例では、node1hardware=highperformance のラベルを、node2hardware=lowperformance のラベルを付けています。

ポッド仕様でノードセレクターを定義する

ノードにラベルを付けたら、ポッド仕様でノードセレクターを設定することができます。以下は、ノードセレクターを使用するポッド仕様の例です。

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: my-app
      image: my-app:v1
  nodeSelector:
    hardware: highperformance

この例では、ポッドは hardware=highperformance のラベルが付いたノードにスケジュールされます。

高度なノードセレクターの設定

Kubernetes は、以下のようなより高度なノードセレクターの設定もサポートしています。

  • 複数のノードセレクターを使用する: nodeSelector フィールドで複数のキーと値のペアを指定することで、より複雑な選択基準を作成することができます。
  • ノードアフィニティ(node affinity)を使用する: ノードアフィニティは、ノードセレクターのより強力なバージョンで、より複雑なノード選択ルールを指定することができます。
  • ノードのテイント(taint)とトレランス(toleration)を使用する: テイントとトレランスは、ノードセレクターと連携してポッドの配置とエビクションを制御します。

これらの高度なノードセレクター戦略を理解して活用することで、ポッドの配置を細かく調整して、特定の要件を満たすことができます。

Kubernetes における高度なノードセレクター戦略

前のセクションでは、Kubernetes のノードセレクターの基本と、ポッドに対する設定方法を説明しました。では、ポッドの配置とリソース利用を最適化するのに役立ついくつかの高度なノードセレクター戦略を探ってみましょう。

ノードアフィニティとノードアンチアフィニティ

ノードアフィニティ(Node Affinity)は、ノードセレクターのより強力なバージョンで、より複雑なノード選択ルールを指定することができます。ノードアフィニティを使用すると、ノードのラベルに基づいてポッドの配置に関する好みや要件を表現することができます。

以下は、ノードアフィニティを使用するポッド仕様の例です。

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: hardware
                operator: In
                values:
                  - highperformance
                  - mediumperformance
  containers:
    - name: my-app
      image: my-app:v1

この例では、ポッドは hardware ラベルが highperformance または mediumperformance に設定されたノードにスケジュールされます。

一方、ノードアンチアフィニティ(Node anti - affinity)を使用すると、特定のラベルが付いたノードにポッドをスケジュールしないように指定することができます。これは、ポッドを異なるノードに分散させたり、特定のノードへの配置を避けたりするのに役立ちます。

テイントとトレランス

テイント(Taints)とトレランス(Tolerations)は、ノードセレクターやアフィニティと連携して、ポッドの配置とエビクションを制御します。テイントはノードに適用され、トレランスはポッドに追加されます。ノードのテイントを許容しないポッドは、そのノードにスケジュールされません。

以下は、ノードにテイントを適用する例です。

kubectl taint nodes node1 hardware=lowperformance:NoSchedule

そして、そのテイントを許容するポッド仕様の例です。

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  tolerations:
    - key: hardware
      operator: Equal
      value: lowperformance
      effect: NoSchedule
  containers:
    - name: my-app
      image: my-app:v1

テイントとトレランスを使用することで、特定のワークロード用の専用ノードを作成し、それらのノードに適切なポッドのみがスケジュールされるようにすることができます。

ノード選択の最適化

高度なノードセレクター戦略を使用する際には、ノード選択プロセス全体の最適化を考慮することが重要です。これには以下のことが含まれる場合があります。

  • 目的のポッド配置を達成するために、ノードアフィニティとノードアンチアフィニティのルールをバランスさせる
  • ノードへのアクセスを制御するために、テイントとトレランスを慎重に管理する
  • ノードの利用率を監視し、それに応じてノードのラベルとセレクターを調整する

これらの高度なノードセレクター戦略を活用することで、ポッドの配置を細かく調整し、Kubernetes クラスタ内での効率的なリソース利用を確保することができます。

まとめ

このチュートリアルでは、Kubernetes のノードセレクターについて学び、ポッドの配置を制御する方法を学びました。ノードラベルの概念と、ノードにラベルを適用する方法、およびポッド仕様でノードセレクターを設定するプロセスを探索しました。さらに、ノードアフィニティやノードのテイントを使用するなど、より複雑なポッドスケジューリング要件を達成するための高度なノードセレクター戦略も学びました。Kubernetes のノードセレクターを理解して活用することで、アプリケーションのデプロイを最適化し、クラスタ内の最も適したノードでポッドが実行されるようにすることができます。