taint と toleration を適用してスケジュールを制御する

このページでは、GKE on VMware の 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 は、ノード上にスケジュールされません。

GKE on VMware でノード taint を設定する利点

kubectl taint コマンドを使用してノード taint を設定することもできますが、gkectl または Google Cloud コンソールを使用してノード taint を設定すると、kubectl に比べて次のような利点があります。

  • ノードを再起動または置換しても、taint が保持されます。
  • ノードプールがノードに追加されると、taint が自動的に作成されます。
  • gkectl を使用して taint を追加すると、クラスタの自動スケーリング時に taint が自動的に作成されます(Google Cloud コンソールで作成したノードプールの自動スケーリングは現在利用できません。)

ノード taint を設定する

ノードプールにノード taint を設定するには、ユーザー クラスタの作成時に行うか、クラスタの作成後に行います。このセクションでは、すでに作成されたクラスタに taint を追加しますが、新しいクラスタを作成する場合のプロセスも同様です。

新しいノードプールを追加して taint を設定するか、既存のノードプールを更新して taint を設定します。別のノードプールを追加する前に、クラスタで十分な IP アドレスが使用可能であることを確認してください。

Google Cloud コンソールでクラスタを作成した場合、Google Cloud コンソールを使用してノードプールを追加または更新できます。

新しいノードプールに taint を設定する

コンソール

  1. コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。

    GKE クラスタに移動

  2. ユーザー クラスタが存在する Google Cloud プロジェクトを選択します。

  3. クラスタリストでクラスタの名前をクリックし、[詳細] パネルの [詳細を表示] をクリックします。

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

  5. ノードプールを構成します。

    1. [ノードプール名] を入力します。
    2. プール内の各ノードの vCPU の数(ユーザー クラスタ ワーカーあたりの最小値は 4)を入力します。
    3. プール内の各ノードのメモリサイズをメガバイト(MiB)単位で入力します(ユーザー クラスタのワーカーノードあたり最小 8192 MiB、4 の倍数でなければなりません)。
    4. [レプリカ] フィールドにプール内のノードの数(3 以上)を入力します。
    5. [OS イメージタイプ] を選択: [Ubuntu Containerd] または、[COS])。

    6. [ブートディスク サイズ] をギガバイト(GiB)で入力します(デフォルトは 40 GiB)。

  6. [ノードプールのメタデータ(省略可)] セクションで、[+ Taint を追加] をクリックします。taint の [キー]、[]、[効果] を入力します。以上の手順を必要なだけ繰り返してください。

  7. 必要に応じて、[+ Kubernetes ラベルを追加] をクリックします。ラベルの [キー] と [] を入力します。以上の手順を必要なだけ繰り返してください。

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

  9. Google Cloud コンソールに「クラスタのステータス: 変更中」と表示されます。[詳細を表示] をクリックすると、[リソース ステータス条件] と [ステータス メッセージ] が表示されます。

コマンドライン

  1. ユーザー クラスタの構成ファイルで、nodePools セクションに入力します。

    次のフィールドを指定する必要があります。

    • nodePools.[i].name
    • nodePools[i].cpus
    • nodePools.[i].memoryMB
    • nodePools.[i].replicas

    次のフィールドは省略可能です。nodePools[i].bootDiskSizeGB または nodePools[i].osImageType が含まれない場合は、デフォルト値が使用されます。

  2. nodePools[i].taints セクションに入力します。次に例を示します。

    nodePools:
    - name: "my-node-pool"
      taints:
      - key: "staging"
        value: "true"
        effect: "NoSchedule"
    
  3. 必要に応じて、次のセクションに入力します。

    • nodePools[i].labels
    • nodePools[i].bootDiskSizeGB
    • nodePools[i].osImageType
    • nodePools[i].vsphere.datastore
    • nodePools[i].vsphere.tags
  4. 次のコマンドを実行します。

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    以下を置き換えます。

    • [ADMIN_CLUSTER_KUBECONFIG] は、管理クラスタの kubeconfig ファイルのパスに置き換えます。

    • [USER_CLUSTER_CONFIG] は、ユーザー クラスタの構成ファイルのパスに置き換えます。

既存のノードプールに taint を設定する

コンソール

  1. コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。

    GKE クラスタに移動

  2. ユーザー クラスタが存在する Google Cloud プロジェクトを選択します。

  3. クラスタリストでクラスタの名前をクリックし、[詳細] パネルの [詳細を表示] をクリックします。

  4. [ノード] タブをクリックします。

  5. 変更するノードプールの名前をクリックします。

  6. [ノードプールのメタデータ(省略可)] セクションの横にある [ 編集] をクリックし、[+ Taint を追加] をクリックします。taint の [キー]、[]、[効果] を入力します。以上の手順を必要なだけ繰り返してください。

  7. [完了] をクリックします。

  8. [] をクリックして前のページに戻ります。

  9. Google Cloud コンソールに「クラスタのステータス: 変更中」と表示されます。[詳細を表示] をクリックすると、[リソース ステータス条件] と [ステータス メッセージ] が表示されます。

コマンドライン

  1. ユーザー クラスタ構成ファイルで、更新するノードプールの nodePools セクションに移動します。

  2. nodePools[i].taints に入力します。次に例を示します。

    nodePools:
    - name: "my-node-pool"
      taints:
      - key: "staging"
        value: "true"
        effect: "NoSchedule"
    
  3. 次のコマンドを実行します。

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    以下を置き換えます。

    • [ADMIN_CLUSTER_KUBECONFIG] は、管理クラスタの kubeconfig ファイルのパスに置き換えます。

    • [USER_CLUSTER_CONFIG] は、ユーザー クラスタの構成ファイルのパスに置き換えます。

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

taint を容認するように Pod を構成するには、Pod の仕様に tolerations フィールドを追加します。次の例では、dedicated=experimental:NoSchedule taint があるノードで Pod をスケジュールできます。

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

その他の例については、taint と toleration をご覧ください。