このページでは、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-dns
や metrics-server
のような GKE マネージド コンポーネントをスケジュールできません。これらのコンポーネントにはノード taint に対応する toleration がないため、GKE はこれらのコンポーネントをスケジュールできません。次のいずれかの条件を満たす新しいノードプールを追加する必要があります。
- taint なし
PreferNoSchedule
の効果を持つ taintcomponents.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
:PreferNoSchedule
、NoSchedule
、または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 を含むクラスタを作成するには:
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
[add_box 作成] をクリックします。
必要に応じてクラスタを構成します。
ナビゲーション パネルの [ノードプール] で、変更するノードプールを展開し、[メタデータ] をクリックします。
[Node Taints] セクションで、[add taint を追加] をクリックします。
[効果] プルダウン リストで目的の効果を選択します。
[キー] と [値] に目的の Key-Value ペアを入力します。
[作成] をクリックします。
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
:PreferNoSchedule
、NoSchedule
、または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 を設定したノードプールを作成するには、次の手順を行います。
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
[クラスタの詳細] ページで、[add_box ノードプールを追加] をクリックします。
ナビゲーション パネルで [メタデータ] をクリックします。
[Node Taints] で [add taint を追加] をクリックします。
[効果] プルダウン リストから目的の効果を選択します。
[キー] と [値] に目的の Key-Value ペアを入力します。
[作成] をクリックします。
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
コマンドを使用します。GKE がノードプールに追加する新しいノードは taint を継承しないため、kubectl
を使用して Spot VM に 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
コマンドライン ツールを使用します。
次のコマンドを実行して、クラスタ内のすべてのノードのリストを取得します。
kubectl get nodes
次のコマンドを実行して、ノードを調べます。
kubectl describe node NODE_NAME
返された出力で
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
: ノードプールが作成されるクラスタの名前。