Node Taints でスケジューリングを制御する


このページでは、Google Kubernetes Engine(GKE)の Node Taints の概要について説明します。Node taint は、ワークロードを実行するノードを指定する際に役立ちます。

Autopilot クラスタでは、ワークロードの分離にのみ Node Taints を使用できます。手順については、GKE でワークロードの分離を構成するをご覧ください。

概要

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

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

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

taint と容認機能が連携して、Pod が不適切なノードでスケジュールされないようにします。

taint は、1 つの効果に関連付けられた Key-Value ペアです。次の表に、使用可能な効果の一覧を示します。

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

GKE で Node Taints を設定するメリット

Node Taints は GKE のクラスタとノードに追加できます。また、kubectl taint コマンドを使用して追加することもできます。GKE で Node Taints を指定すると、kubectl と比べて次のようなメリットがあります。

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

始める前に

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

  • Google Kubernetes Engine API を有効にします。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得します。

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

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

NoSchedule 影響または NoExecute 影響を持つノードを含む Standard クラスタを作成すると、GKE は、クラスタの作成時に GKE が作成するデフォルトのノードプールに kube-dnsmetrics-server のような GKE マネージド コンポーネントをスケジュールできません。これらのコンポーネントにはノード taint に対応する toleration がないため、GKE はこれらのコンポーネントをスケジュールできません。次のいずれかの条件を満たす新しいノードプールを追加する必要があります。

  • taint なし
  • PreferNoSchedule の効果を持つ taint
  • components.gke.io/gke-managed-components=true:NoSchedule taint

これらの条件のいずれかにより、GKE は新しいノードプールで GKE マネージド コンポーネントをスケジュールできます。

手順については、専用ノードでのワークロードの分離をご覧ください。

gcloud

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

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

次のように置き換えます。

  • CLUSTER_NAME: 新しいクラスタの名前。
  • EFFECT: PreferNoScheduleNoSchedule、または NoExecute のいずれかの効果値
  • KEY=VALUE: EFFECT に関連付けられた Key-Value ペア。

たとえば、次のコマンドは dedicated=experimental という Key-Value を持つ PreferNoSchedule の taint を適用します。

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

Console

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

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

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

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

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

  5. [Node Taints] セクションで、[ taint を追加] をクリックします。

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

  7. [キー] と [] に目的の Key-Value ペアを入力します。

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

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'
        }
      ]
      ...
    }
    ...
  }
}

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

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

Node Taints を設定したノードプールを作成するには、Google Cloud CLI、Google Cloud コンソール、または GKE API を使用します。

gcloud

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

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

次のように置き換えます。

  • POOL_NAME: 作成するノードプールの名前。
  • CLUSTER_NAME: ノードプールが作成されるクラスタの名前。
  • EFFECT: PreferNoScheduleNoSchedule、または NoExecute のいずれかの効果値
  • KEY=VALUE: EFFECT に関連付けられた Key-Value ペア。

たとえば、次のコマンドは、既存のクラスタにノードプールを作成し、NoSchedule 効果を持つ Key-Value dedicated=experimental の taint を適用します。

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

このコマンドはノードプールを作成し、Key-Value が special=gpu の taint を NoExecute 効果で適用します。

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

Console

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

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [クラスタの詳細] ページで、[ ノードプールを追加] をクリックします。

  4. ナビゲーション パネルで [メタデータ] をクリックします。

  5. [Node Taints] で [ taint を追加] をクリックします。

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

  7. [キー] と [] に目的の Key-Value ペアを入力します。

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

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 フィールドを追加します。Pod の仕様の一部を次に示します。

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

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

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

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

kubectl taint nodes NODE_NAME KEY=VALUE:EFFECT

たとえば、次のコマンドは、効果が NoSchedule、Key-Value が dedicated=experimental の taint を mynode ノードに適用します。

kubectl taint nodes mynode dedicated=experimental:NoSchedule

-l セレクタを使用してラベルと値を指定し、特定のラベルを持つノードに taint を追加することもできます。

kubectl taint nodes -l LABEL=LABEL_VALUE KEY=VALUE:EFFECT

たとえば、次のコマンドは、キーが dedicated-pool の taint を my_pool ノードプールの GKE ノードに追加します。

kubectl taint nodes -l cloud.google.com/gke-nodepool=my_pool dedicated-pool=my_pool:NoSchedule

ノードの taint を検査する

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

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

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

    kubectl describe node NODE_NAME
    
  3. 返された出力で Taints フィールドを探します。出力は次のようになります。

    Taints:  dedicated-pool=mypool:NoSchedule
    

ノードから taint を削除する

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

たとえば、次のコマンドは、dedicated キーを持つすべての taint を mynode ノードから削除します。

kubectl taint nodes mynode dedicated-

ノードプールからすべての taint を削除する

ノードプールからすべての taint を削除するには、次のコマンドを実行します。

gcloud beta container node-pools update POOL_NAME \
--node-taints="" \
--cluster=CLUSTER_NAME

次のように置き換えます。

  • POOL_NAME: 変更するノードプールの名前。
  • CLUSTER_NAME: ノードプールが作成されるクラスタの名前。

次のステップ