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

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

概要

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

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

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

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

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

一部のシステム Pod(kube-proxy や fluentd など)は、すべての NoExecuteNoSchedule の taint を容認するため、強制排除されません。

始める前に

作業を始める前に、次のことを確認してください。

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

  1. gcloud init を実行して、次の操作を行います。

    gcloud init

    リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

    gcloud init --console-only
  2. 手順に従って gcloud を承認し、Google Cloud アカウントを使用します。
  3. 新しい構成を作成するか、既存の構成を選択します。
  4. Google Cloud プロジェクトを選択します。
  5. デフォルトの Compute Engine ゾーンを選択します。

gcloud config の使用

  • デフォルトのプロジェクト 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 は、PreferNoScheduleNoSchedule、または NoExecute のいずれかです。
  • keyvalue は、effect に関連付けられた Key-Value ペアです。

たとえば、次のコマンドでは、key が dedicated、value が experimental、effect が PreferNoSchedule の taint が適用されます。

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

Console

Node Taints を含むクラスタを作成するには:

  1. Cloud Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

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

  3. 必要に応じてクラスタを構成します。

  4. ナビゲーション パネルで、変更するノードプールの下の [メタデータ] をクリックします。

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

  6. [効果] プルダウン リストで目的の効果を選択します。

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

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

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

API

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

POST https://container.googleapis.com/v1/projects/project-id/zones/compute-zone/clusters

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

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

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

gcloud コマンドライン ツール、Cloud Console、または GKE API を使用して、ノード taint を含むノードプールを作成できます。

gcloud

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

gcloud container node-pools create pool-name \
  --cluster cluster-name \
  --node-taints key=value:effect

以下を置き換えます。

  • pool-name は、作成するノードプールの名前です。
  • cluster-name は、ノードプールが作成されるクラスタの名前です。
  • effect は、PreferNoScheduleNoSchedule、または NoExecute のいずれかです。
  • keyvalue は、effect に関連付けられた Key-Value ペアです。

たとえば、次のコマンドでは、key が dedicated、value が experimental、effect が 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. Cloud 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/compute-zone/clusters/cluster-id/nodePools

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

taint を容認する Pod を構成する

taint を容認するように Pod を構成するには、Pod の仕様に 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 を確認するには、kubectl コマンドライン ツールを使用します。

  1. 次のコマンドを実行して、クラスタ内のすべてのノードのリストを取得します。

    kubectl get nodes
    
  2. 次のコマンドを実行して、ノードを調べます。

    kubectl describe node node-name
    
  3. 返されたノードの説明で、Taints フィールドを探します。

    Taints: key=value:effect
    

ノードから taint を削除する

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

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

kubectl taint nodes foo dedicated-

ノード taint を使用する利点

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

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

次のステップ