ノード taint によるスケジューリングの制御

このページでは、Google Kubernetes Engine のノード taint の概要について説明します。クラスタにデプロイするワークロードをスケジュールする際に、ノード taint を使用することで、ワークロードの実行を許可するノードを制御できます。

概要

クラスタ内で実行するワークロードを送信すると、スケジューラはそのワークロードに関連付けられたポッドの配置場所を決定します。スケジューラは、ポッドの CPU、メモリ、カスタム リソースの要件を満たす任意のノードにポッドを配置します。

クラスタでさまざまなワークロードが実行されている場合は、特定のノードプールで実行できるワークロードをある程度制御できます。

ノード taint を使用してノードをマークすると、スケジューラは特定のポッドでそのノードの使用を回避または禁止します。これを補完する「容認」機能を使用すると、「taint」としてマークされたノードで使用できるポッドを指定できます。

ノード taint は、1 つの効果に関連付けられた Key-Value ペアです。利用可能な効果は次のとおりです。

  • NoSchedule: この taint を容認しないポッドはノードにスケジュールされません。
  • PreferNoSchedule: Kubernetes は、この taint を容認しないポッドをノードにスケジュールすることを避けます。
  • NoExecute: ノードですでに実行されているポッドは、ノードから強制排除されます。ノードでまだ実行されていないポッドは、ノードにスケジュールされません。

始める前に

このタスクの準備として、次の手順を行います。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project [PROJECT_ID]
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone [COMPUTE_ZONE]
  • リージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud を最新バージョンに更新します。
    gcloud components update

ノード taint を設定したクラスタを作成する

クラスタを作成するときに、ノード taint をクラスタに割り当てることができます。これにより、クラスタとともに作成されたすべてのノードに taint が割り当てられます。

gcloud

ノード taint を設定したクラスタを作成するには、次のコマンドを実行します。

gcloud container clusters create [CLUSTER_NAME] --node-taints [KEY]=[VALUE]:[EFFECT]

ここで

  • [CLUSTER_NAME] は作成するクラスタの名前です。
  • [EFFECT]PreferNoScheduleNoScheduleNoExecute のいずれかです。
  • [KEY][VALUE][EFFECT] に関連付けられた Key-Value ペアです。

たとえば、次のコマンドはキーが dedicated、値が experimental、効果が PreferNoSchedule である taint を適用します。

gcloud container clusters create example-cluster --node-taints dedicated=experimental:PreferNoSchedule

Console

ノード taint を設定したクラスタを作成するには、次の手順を実行します。

  1. GCP Console で Google Kubernetes Engine のメニューにアクセスします。

    Google Kubernetes Engine のメニューに移動

  2. [クラスタを作成] をクリックします。

  3. 必要に応じてクラスタを構成します。次に、設定を変更するノードプールの [高度な編集] をクリックします。

  4. [ノード taint] セクションで、[taint を追加] をクリックします。

  5. [影響] から、目的の影響を選択します。

  6. [キー] と [] に必要な Key-Value ペアを入力します。

  7. 必要に応じてノード taint をさらに追加します。

  8. [保存] をクリックして [高度な編集] オーバーレイを閉じます。

  9. [作成] をクリックします。

API

API を使用してクラスタを作成する場合は、nodeConfig の下に nodeTaints フィールドを追加します。次に例を示します。

POST https://container.googleapis.com/v1/projects/[PROJECT_ID]/zones/[ZONE]/clusters

{
  'cluster': {
    'name': 'example-cluster',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'special',
          'Value': 'gpu',
          'effect': 'PreferNoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

ノード taint を含むノードプールを作成する

ノードに taint を適用すると、taint を容認するポッドのみがノードで実行可能になります。GKE クラスタではノードプールに taint を適用できます。これにより、プール内のすべてのノードに taint が適用されます。

ノード taint を設定したノードプールを作成するには、gcloud コマンドライン ツールまたは GKE API を使用します。

gcloud

ノード taint を設定したノードプールを作成するには、次のコマンドを実行します。

gcloud container node-pools create [POOL_NAME] --cluster [CLUSTER_NAME] \
--node-taints [KEY]=[VALUE]:[EFFECT]

ここで

  • [POOL_NAME] は作成するノードプールの名前です。
  • [CLUSTER_NAME] は、ノードプールを作成するクラスタの名前です。
  • [EFFECT]PreferNoScheduleNoScheduleNoExecute のいずれかです。
  • [KEY][VALUE][EFFECT] に関連付けられた Key-Value ペアです。

たとえば、次のコマンドはキーが dedicated、値が experimental、効果が NoSchedule である taint を適用します。

gcloud container node-pools create example-pool --cluster example-cluster \
--node-taints dedicated=experimental:NoSchedule

次のコマンドは、キーが special、値が gpu、効果が NoExecute である taint を適用します。

gcloud container node-pools create example-pool-2 --cluster example-cluster \
--node-taints special=gpu:NoExecute

Console

ノード taint を設定したノードプールを作成するには、次の手順を実行します。

  1. GCP Console で Google Kubernetes Engine のメニューにアクセスします。

    Google Kubernetes Engine のメニューに移動

  2. 鉛筆の形をしたクラスタの [編集] ボタンをクリックします。

  3. [ノードプール] で、[ノードプールを追加] をクリックします。

  4. [ノード taint] セクションで、[taint を追加] をクリックします。

  5. [影響] から、目的の影響を選択します。

  6. [キー] と [] に必要な Key-Value ペアを入力します。

  7. 必要に応じてノード taint をさらに追加します。

  8. [保存] をクリックして、ノードプールの変更オーバーレイを終了します。

  9. [作成] をクリックします。

API

API を使用してノードプールを作成する場合は、nodeConfig の下に nodeTaints フィールドを追加します。次に例を示します。

POST https://container.googleapis.com/v1/projects/[PROJECT_ID]/zones/[ZONE]/clusters/[CLUSTER_ID]/nodePools

{
  'nodePool': {
    'name': 'example-pool',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'dedicated',
          'Value': 'experimental',
          'effect': 'NoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

taint を容認するポッドを構成する

taint を容認するようにポッドを構成するには、ポッドの仕様に tolerations フィールドを追加します。ポッドの仕様の一部を次に示します。

このポッドは、taint dedicated=experimental:NoSchedule が適用されたノードでスケジュールすることができます。

tolerations:
- key: dedicated
  operator: Equal
  value: experimental
  effect: NoSchedule

既存のノードに taint を追加する

既存のノードに taint を追加するには、kubectl taint コマンドを使用します。

kubectl taint nodes [NODE_NAME] [KEY]=[VALUE]:[EFFECT]

例:

kubectl taint nodes node1 key=value:NoSchedule

特定のラベルを持つノードに taint を追加することもできます。

kubectl taint node -l myLabel=X dedicated=foo:PreferNoSchedule

詳しくは、Kubernetes ドキュメントの taint と容認をご覧ください。

ノードの taint を検査する

ノードの taint を確認するには、kubectl コマンドライン ツールを使用します。

まず、クラスタ内のすべてのノードのリストを取得するために、次のコマンドを実行します。

kubectl get nodes

次に、ノードを検査するために、次のコマンドを実行します。

kubectl describe node [NODE_NAME]

返されたノードの説明で、Taints フィールドを探します。

Taints: [KEY]=[VALUE]:[EFFECT]

ノードから taint を削除する

kubectl taint を使用して taint を削除できます。キー、キーと値、またはキーと効果を指定して taint を削除できます。

たとえば、次のコマンドはノード foo からキーが dedicated であるすべての taint を削除します。

kubectl taint nodes foo dedicated-

ノード taint を使用する利点

kubectl を使用して手動で taint を設定する場合に比べて、ノード taint を使用することにはいくつかの利点があります。

  • ノードを再起動または置換しても、taint が保持されます。
  • ノードがプールまたはクラスタに追加されたときに、taint が自動的に作成されます。
  • クラスタの自動スケーリング時に taint が自動的に作成されます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント