単一テナントノードを使用して GKE ワークロードを分離する


このページでは、Compute Engine の単一テナントノード(特定のプロジェクトの VM のみを実行する専用の物理サーバー)を使用して、Google Kubernetes Engine(GKE)の Standard クラスタで実行されているワークロードを分離する方法について説明します。単一テナントノードを使用すると、VM を他のプロジェクトの VM から物理的に分離することや、同じホスト ハードウェア上で VM をグループ化することができます。

この機能は GKE Autopilot ではサポートされていません。Autopilot のセキュリティ境界の詳細については、Autopilot のセキュリティ境界をご覧ください。

GKE で単一テナントノードを使用するには、Compute Engine で単一テナントノード グループを作成し、そのノードグループを使用して GKE ノードプールを作成します。ノードプールは、GKE クラスタのプロジェクトの単一テナントノードを使用して作成できます。また、組織内でプロジェクトをまたいでリソースを使用する共有単一テナントノードで作成することもできます。たとえば、単一テナントノード グループを作成する組織内のオーナー プロジェクトと、オーナー プロジェクトのノードグループを使用するノードプールを持つクラスタがあるコンシューマ プロジェクトを指定できます。

始める前に

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

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

追加の割り当てをリクエスト

単一テナントノードは規模が大きく(例: 96 個の vCPU と 624 GB のメモリ)、デフォルトのプロジェクト割り当てでは過少なため処理できません。

単一テナントノードを作成するには、割り当てページで Compute Engine API CPU の割り当ての引き上げをリクエストする必要があります。引き上げのリクエストの詳細については、割り当てをご覧ください。

必要な CPU の数は、次の条件によって異なります。

  • 現在の CPU 割り当て使用量。
  • ノードグループのサイズ。
  • ノード テンプレート。

単一テナントノード タイプのコア数を調べ、少なくともその量の CPU 上限をリクエストします。プロジェクトに十分な容量を確保するため、10 CPU を足してリクエストすることをおすすめします。

単一テナントノード テンプレートを作成する

単一テナントノード テンプレートは、ノードグループの作成時にすべてのノードでプロパティを定義し、適用するリージョン リソースです。詳細については、ノードタイプをご覧ください。

共有単一テナントノードを使用している場合は、クラスタのコンシューマ プロジェクトではなく、ノードグループのオーナー プロジェクトで以下の手順を行ってください。

コンソール

  1. Google Cloud コンソールで、[単一テナントノード] ページに移動します。

    [単一テナントノード] ページに移動

  2. [ノード テンプレートを作成] をクリックします。

  3. ノード テンプレートの [名前] と [リージョン] を指定します。

  4. ノードタイプを選択します。

  5. 必要に応じて、1 つ以上のノード アフィニティ ラベルを追加します。

  6. [作成] をクリックして、ノード テンプレートを作成します。

gcloud

gcloud compute sole-tenancy node-templates create コマンドを使用してノード テンプレートを作成します。

gcloud compute sole-tenancy node-templates create TEMPLATE_NAME \
    --node-type=NODE_TYPE \
    --node-affinity-labels=AFFINITY_LABELS \
    --region=COMPUTE_REGION

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

  • TEMPLATE_NAME: 新しいノード テンプレートの名前。
  • NODE_TYPE: このテンプレートに基づいて作成された単一テナントノードのノードタイプ。gcloud compute sole-tenancy node-types list コマンドを使用して、各ゾーンで使用可能なノードタイプのリストを取得します。
  • AFFINITY_LABELS: アフィニティ ラベルの Key-Value([KEY=VALUE,...])。アフィニティ ラベルを使用すると、ノードとノードグループを論理的にグループ化できます。後で VM をプロビジョニングする際、VM にアフィニティ ラベルを指定して、特定のノードまたはノードグループのセットに VM をスケジュールできます。詳細については、ノード アフィニティとアンチアフィニティをご覧ください。
  • COMPUTE_REGION: ノード テンプレートを作成するリージョン。指定したリージョンの任意のゾーンで、このノード テンプレートを使用してノードグループを作成できます。

出力は次のようになります。

Created [https://www.googleapis.com/compute/v1/projects/my-project/regions/us-central1/nodeTemplates/template-name].

単一テナントノード グループを作成する

ノードグループは、同じ単一テナントノード テンプレートからの特定のゾーン内の単一テナントノードのセットです。複数のゾーンで使用できるリージョン クラスタとノードプールの場合は、各ゾーンで同じ名前のノードグループを作成する必要があります。この手順を行う前に、十分な割り当てがあることを確認してください。

共有単一テナントノードを使用している場合は、クラスタのコンシューマ プロジェクトではなく、ノードグループのオーナー プロジェクトで以下の手順を行ってください。

コンソール

単一テナントノード グループを作成するには、次の手順を行います。

  1. Google Cloud コンソールで、[単一テナントノード] ページに移動します。

    [単一テナントノード] ページに移動

  2. [ノードグループを作成] をクリックします。

  3. ノード テンプレートの [名前] を指定します。

  4. ノード テンプレートを作成したリージョンを選択し、そのリージョンゾーンを選択します。

  5. ノード テンプレートを選択します。

  6. 必要に応じて、自動スケーリング モードを有効にします。

  7. グループに含めるノードの数を指定します。

  8. 必要に応じて、メンテナンス ポリシーを変更します。

  9. 必要に応じて、単一テナントノード グループを共有するために、[共有設定の構成] セクションで次のいずれかを指定して共有設定を構成します。

    • このノードグループを組織内のすべてのプロジェクトと共有する
    • このノードグループを組織内の選択したプロジェクトと共有する
  10. [作成] をクリックして、ノードグループを作成します。

gcloud

テンプレートからノードグループを作成します。

gcloud compute sole-tenancy node-groups create GROUP_NAME \
    --zone COMPUTE_ZONE \
    --node-template TEMPLATE_NAME --target-size TARGET_SIZE \
    --share-settings=SHARE_SETTING \
    --share-with=PROJECTS

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

  • GROUP_NAME: 新しいノードグループに付ける名前。
  • COMPUTE_ZONE: このノードグループが存在するゾーン。このゾーンは、使用しているノード テンプレートと同じリージョンに存在する必要があります。
  • TEMPLATE_NAME: 使用しているノード テンプレートの名前。
  • TARGET_SIZE: グループ内に作成するノードの数。
  • SHARE_SETTING: ノードグループの共有設定。特定のプロジェクトと共有する場合は projects に設定し、組織全体と共有する場合は organization に設定します。
  • PROJECTS: ノードグループを共有するプロジェクト ID またはプロジェクト番号のリスト。SHARE_SETTINGprojects に設定する場合にのみ必要です。

GKE 単一テナントノード プールを作成する

Compute Engine での単一テナントノード グループの作成が完了したため、単一テナントノード プールを作成できます。

すでに GKE クラスタを使用している場合は、そのクラスタに単一テナント ノードプールを追加できます。そうでない場合は、gcloud container clusters create を使用したクラスタを作成します。

リージョン クラスタを使用している場合、または複数のゾーンでノードプールが使用可能な場合は、各ゾーンに同じ名前のノードグループを作成する必要があります。各ゾーンでその名前を再利用できない場合は、ゾーンごとに個別のノードプールを作成します。

クラスタのプロジェクトの単一テナントノード グループを使用してノードプールを作成する

クラスタのプロジェクトのノードグループを使用してノードプールを作成するには、単一テナントノード グループの名前を渡します。共有単一テナントノード グループを使用する場合や、単一テナントノード テンプレートの作成時に構成したカスタムノード アフィニティ ラベルを使用する場合は、ノード アフィニティ ファイルを使用して、共有単一テナントノードでノードプールを作成する手順をご覧ください。

指定したノードグループで、新しいノードプールを作成します。

ゾーンのノードプールの場合:

  gcloud container node-pools create NODE_POOL_NAME \
      --node-group GROUP_NAME --cluster CLUSTER_NAME \
      --zone COMPUTE_ZONE --machine-type=MACHINE_TYPE \
      --node-locations=COMPUTE_ZONE

リージョンのノードプールの場合:

  gcloud container node-pools create NODE_POOL_NAME \
      --node-group GROUP_NAME --cluster CLUSTER_NAME \
      --region COMPUTE_REGION --machine-type=MACHINE_TYPE \
      --node-locations=COMPUTE_ZONE1,COMPUTE_ZONE2

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

  • NODE_POOL_NAME: 新しいノードプールの名前。
  • GROUP_NAME: 使用する既存の単一テナントノード グループの名前。
  • CLUSTER_NAME: ノードプールを作成するクラスタの名前。
  • COMPUTE_REGION: クラスタと同じリージョン。
  • MACHINE_TYPE: ノードプールのマシンタイプ。
  • COMPUTE_ZONE1COMPUTE_ZONE2,[...]: 単一テナントノード グループのゾーン

指定できるオプションのフラグの完全なリストについては、gcloud container node-pools create のドキュメントをご覧ください。

ノード アフィニティ ファイルを使用して、共有単一テナントノードでノードプールを作成する

共有単一テナントノード グループを使用してノードプールを作成するには、ノード アフィニティ ラベルを使用する必要があります。ノード アフィニティを使用して、同じプロジェクトからノードグループを選択することもできます。

ラベルを参照するには、ノードプールの作成手順に沿って操作します。その際、--node-group フラグは --sole-tenant-node-affinity-file フラグに置き換えてください。これらのラベルを含む JSON ファイルを渡します。たとえば、次のコマンドをご覧ください。

  gcloud container node-pools create sole-tenant-node-pool \
      --sole-tenant-node-affinity-file /path/to/affinity/file --cluster my-cluster \
      --region us-central1 --machine-type n1-standard-4  \
      --node-locations=us-central1-a,us-central1-b,us-central1-c

以降のセクションでは、単一テナントノードでのノード アフィニティ ラベルのユースケースについて説明します。

プロジェクトのノードグループ名を指定する

特定のプロジェクトの単一テナントノード グループとノードグループ名を使用するには、ノード アフィニティ ファイルでこれらの値を指定します。このアフィニティは、各ゾーンのノードグループ名が一致する必要があるマルチゾーン ノードプールを作成する場合に使用できます。指定したオーナー プロジェクトのノードグループを使用するには、JSON ファイルの compute-googleapis.com/node-group-name ブロック全体を省略します。

次の例をご覧ください。

[
  {
    "key" : "compute.googleapis.com/project",
    "operator" : "IN",
    "values" : ["OWNER_PROJECT"]
  },
  {
    "key" : "compute.googleapis.com/node-group-name",
    "operator" : "IN",
    "values" : ["GROUP_NAME"]
  },
]

カスタムラベルを指定する

ノード アフィニティとアンチ アフィニティを使用して、カスタムラベルを持つノードグループからノードプールを作成することもできます。各ノードグループには、デフォルトのアフィニティ ラベルが自動的に割り当てられます。前の例と同様にデフォルトのラベルを参照することも、ノード テンプレートを作成するときに指定したカスタムラベルを使用することもできます。カスタムラベルは、ワークロードを分離またはグループ化するために使用できます。

次の例をご覧ください。

[
  {
    "key" : "compute.googleapis.com/project",
    "operator" : "IN",
    "values" : ["OWNER_PROJECT"]
  },
  {
    "key" : "workload",
    "operator" : "IN",
    "values" : ["frontend"]
  },
]

制限事項

単一テナントノードでノードプールを作成する場合は、単一テナントノード グループの基盤となる容量を管理する責任はユーザーにあります。以下の機能が単一テナントノード グループとどのように相互作用するかを考慮してください。

次のステップ