このページでは、Google Distributed Cloud の taint と toleration の概要について説明します。クラスタにデプロイするワークロードをスケジュールする際に、ノード taint を使用することで、ワークロードの実行を許可するノードを制御できます。
概要
クラスタ内で実行するワークロードを送信すると、スケジューラはそのワークロードに関連付けられた Pod の配置場所を決定します。スケジューラは、Pod の CPU、メモリ、カスタム リソースの要件を満たす任意のノードに Pod を配置します。
クラスタでさまざまなワークロードが実行されている場合は、特定のノードプールで実行できるワークロードをある程度制御できます。
ノード taint を使用してノードをマークすると、スケジューラは特定のポッドでそのノードの使用を回避または禁止します。これを補完する「容認」機能を使用すると、「taint」としてマークされたノードで使用できる Pod を指定できます。
taint と容認機能が連携して、Pod が不適切なノードでスケジュールされないようにします。
taint は、1 つの効果に関連付けられた Key-Value ペアです。次の表に、使用可能な効果の一覧を示します。
効果 | 説明 |
---|---|
NoSchedule |
この taint を容認しない Pod はノード上にスケジュールされません。既存の Pod はノードから強制排除されません。 |
PreferNoSchedule |
Kubernetes は、この taint を容認しない Pod をノード上にスケジュールすることを避けます。 |
NoExecute |
ノードですでに実行されている Pod は、ノードから強制排除されます。ノードでまだ実行されていない Pod は、ノード上にスケジュールされません。 |
Google Distributed Cloud で Node Taints を設定するメリット
kubectl taint
コマンドを使用してノード taint を設定することもできますが、gkectl
または Google Cloud コンソールを使用してノード taint を設定すると、kubectl
に比べて次のような利点があります。
- ノードを再起動または置換しても、taint が保持されます。
- ノードプールがノードに追加されると、taint が自動的に作成されます。
gkectl
を使用して taint を追加すると、クラスタの自動スケーリング時に taint が自動的に作成されます(Google Cloud コンソールで作成したノードプールの自動スケーリングは現在利用できません)。
Node Taints を設定する
ノードプールに Node Taints を設定するには、ユーザー クラスタの作成時に行うか、クラスタの作成後に行います。このセクションでは、すでに作成されたクラスタに taint を追加しますが、新しいクラスタを作成する場合のプロセスも同様です。
新しいノードプールを追加して taint を設定するか、既存のノードプールを更新して taint を設定します。別のノードプールを追加する前に、クラスタで十分な IP アドレスが使用可能であることを確認してください。
Google Cloud コンソールでクラスタを作成した場合、Google Cloud コンソールを使用してノードプールを追加または更新できます。
新しいノードプールに taint を設定する
コンソール
コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。
ユーザー クラスタが存在する Google Cloud プロジェクトを選択します。
クラスタリストでクラスタの名前をクリックし、[詳細] パネルの [詳細を表示] をクリックします。
[
ノードプールを追加] をクリックします。ノードプールを構成します。
- ノードプール名を入力します。
- プール内の各ノードの vCPU の数を入力します(ユーザー クラスタ ワーカーあたりの最小値は 4)。
- プール内の各ノードのメモリサイズを MiB 単位で入力します(ユーザー クラスタのワーカーノードあたり最小 8192 MiB、4 の倍数でなければなりません)。
- [レプリカ] フィールドにプール内のノードの数(3 以上)を入力します。
[OS イメージタイプ] で、[Ubuntu Containerd] または、[COS] を選択します。
[ブートディスク サイズ] を GiB 単位で入力します(デフォルトは 40 GiB)。
[ノードプールのメタデータ(省略可)] セクションで、[+ taint を追加] をクリックします。taint のキー、値、効果を入力します。以上の手順を必要なだけ繰り返してください。
必要に応じて、[+ Add Kubernetes Labels] をクリックします。ラベルのキーと値を入力します。以上の手順を必要なだけ繰り返してください。
[作成] をクリックします。
Google Cloud コンソールに「クラスタのステータス: 変更中」と表示されます。[詳細を表示] をクリックすると、[リソース ステータス条件] と [ステータス メッセージ] が表示されます。
コマンドライン
ユーザー クラスタの構成ファイルで、
nodePools
セクションに入力します。次のフィールドを指定する必要があります。
nodePools.[i].name
nodePools[i].cpus
nodePools.[i].memoryMB
nodePools.[i].replicas
次のフィールドは省略可能です。
nodePools[i].bootDiskSizeGB
またはnodePools[i].osImageType
が含まれない場合は、デフォルト値が使用されます。nodePools[i].taints
セクションに入力します。例:nodePools: - name: "my-node-pool" taints: - key: "staging" value: "true" effect: "NoSchedule"
必要に応じて、次のセクションに入力します。
nodePools[i].labels
nodePools[i].bootDiskSizeGB
nodePools[i].osImageType
nodePools[i].vsphere.datastore
nodePools[i].vsphere.tags
次のコマンドを実行します。
gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
次のように置き換えます。
[ADMIN_CLUSTER_KUBECONFIG]
: 管理クラスタの kubeconfig ファイルのパス。[USER_CLUSTER_CONFIG]
: ユーザー クラスタの構成ファイルのパス。
既存のノードプールに taint を設定する
コンソール
コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。
ユーザー クラスタが存在する Google Cloud プロジェクトを選択します。
クラスタリストでクラスタの名前をクリックし、[詳細] パネルの [詳細を表示] をクリックします。
[ノード] タブをクリックします。
変更するノードプールの名前をクリックします。
[ノードプールのメタデータ(省略可)] セクションの横にある [
編集] をクリックし、[+ Taint を追加] をクリックします。taint のキー、値、効果を入力します。以上の手順を必要なだけ繰り返してください。[完了] をクリックします。
をクリックして前のページに戻ります。
Google Cloud コンソールに「クラスタのステータス: 変更中」と表示されます。[詳細を表示] をクリックすると、[リソース ステータス条件] と [ステータス メッセージ] が表示されます。
コマンドライン
ユーザー クラスタ構成ファイルで、更新するノードプールの
nodePools
セクションに移動します。nodePools[i].taints
に入力します。次に例を示します。nodePools: - name: "my-node-pool" taints: - key: "staging" value: "true" effect: "NoSchedule"
次のコマンドを実行します。
gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
次のように置き換えます。
[ADMIN_CLUSTER_KUBECONFIG]
: 管理クラスタの kubeconfig ファイルのパス。[USER_CLUSTER_CONFIG]
: ユーザー クラスタの構成ファイルのパス。
taint を許容する Pod を構成する
taint を許容するように Pod を構成するには、Pod の仕様に tolerations
フィールドを追加します。次の例では、Pod を dedicated=experimental:NoSchedule
taint が適用されたノードでスケジュールできます。
tolerations:
- key: dedicated
operator: Equal
value: experimental
effect: NoSchedule
その他の例については、taint と toleration をご覧ください。