タグを使用して GKE リソースを管理する


このページでは、タグを使用して Google Kubernetes Engine(GKE)クラスタを管理し、Identity and Access Management ポリシーをノードに条件付きで適用する方法について説明します。

概要

タグは、組織レベルまたはプロジェクト レベルで Google Cloud リソースにアノテーションを付けて管理できる Key-Value です。タグを使用してリソースを整理し、ファイアウォールや IAM ポリシーなどの条件付きでポリシーを適用できます。タグは IAM アクセス制御をサポートしており、タグの添付、作成、更新、削除を実施できるユーザーを定義できます。

GKE でタグを使用するユースケース

次のような状況では、GKE でタグを使用できます。

  • 特定のノードにネットワーク ファイアウォール ポリシーを条件付きで適用します。たとえば、公共のインターネットからステージング環境またはテスト環境のクラスタのすべてのノードへの上り(内向き)トラフィックを拒否します。手順については、GKE でネットワーク ファイアウォール ポリシーを選択的に適用するをご覧ください。
  • タグに基づいて IAM ロールを条件付きで付与します。たとえば、通常はフルタイムの従業員のみが使用できる特定の環境へのアクセスを請負業者に自動的に許可します。手順については、このドキュメントの残りの部分をご覧ください。
  • プロジェクト レベルまたは組織レベルで適用されたタグに基づいて、課金情報の監査と分析を行います。

仕組み

ネットワーク ファイアウォール ポリシーの適用では、タグを作成し、ファイアウォールで使用するタグを明示的に指定します。それ以外の目的では、ファイアウォールを指定せずにタグを作成します。

タグを作成したら、そのタグを Key-Value ペアとして GKE リソースに追加します。ネットワーク ファイアウォール ポリシーの場合は GKE API を使用し、その他の場合は Tags API を使用します。

キーごとに、1 つの値を 1 つのリソースに付加できます。たとえば、env:dev を GKE クラスタに付加した場合、env:prod または env:test は付加できません。各リソースには、ファイアウォール以外のタグを最大 50 個、ファイアウォール タグを最大 5 個適用できます。

GKE でのリソース アノテーションの方法

GKE では、次の表に概要を示すように、リソースにアノテーションを付加する方法がいくつかあります。

アノテーション タイプ 説明
タグ(ファイアウォール以外)
  • Tags API を使用してクラスタ リソースに適用する
  • リソースを整理して、使用状況と課金を追跡する
  • IAM ポリシーを条件付きで適用する
  • IAM を使用して特定のタグへのアクセスを制御する

詳細については、タグの概要をご覧ください。

IAM のロールを条件付きで付与して、特定のタグを持つリソースへのアクセスを制御します
タグ(ファイアウォール)
  • GKE API を使用してクラスタまたはノードプールに適用する
  • Cloud Next Generation Firewall のネットワーク ファイアウォール ポリシーを条件付きで適用します。
  • IAM を使用して特定のタグへのアクセスを制御する
  • GKE は、基盤となる Compute Engine VM に Key-Value ペアを関連付けます。

詳細については、GKE でネットワーク ファイアウォール ポリシーを選択的に適用するをご覧ください。

公共のインターネットからステージング環境またはテスト環境への上り(内向き)トラフィックをすべて自動的に拒否する
ネットワーク タグ
  • GKE API を使用してクラスタまたはノードプールに適用する
  • IAM アクセス制御のない単純な文字列
  • VPC ファイアウォール ルールを条件付きで適用するために使用します。
  • GKE が Key-Value ペアを基盤となる Compute Engine VM に関連付けます。

詳細については、ネットワーク タグを使用してファイアウォール ルールをノードに適用するをご覧ください。

公共のインターネットからステージング環境またはテスト環境への上り(内向き)トラフィックをすべて自動的に拒否する
GKE クラスタラベル
  • GKE API を使用してクラスタまたはノードプールに適用する
  • リソースを整理して、使用状況と課金を追跡する

詳細については、クラスタラベルをご覧ください。

組織内の特定のコストセンターまたはチームが所有するクラスタを区別します。
Kubernetes ラベル
  • Kubernetes API オブジェクトに適用する
  • クラスタ コンポーネントとリソースを相互に関連付け、リソースのライフサイクルを管理します。

詳細については、Kubernetes のラベルとセレクタをご覧ください。

特定のラベルを持つノードでワークロードがスケジュールされる必要があります。

始める前に

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

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

クラスタにタグを付加する

適切な権限を付与されている場合は、Google Cloud CLI、Google Cloud コンソール、Tags API、または Terraform を使用して既存のクラスタにタグを付加できます。

gcloud

gcloud CLI を使用して GKE リソースにタグを適用するには、まず、タグを作成して値を構成する必要があります。タグキーとタグ値を作成するには、タグの作成タグ値の追加をご覧ください。

タグをクラスタに付加するタグ バインディングを作成するには、次のコマンドを実行します。

gcloud alpha resource-manager tags bindings create \
    --tag-value=TAG_VALUE_ID \
    --parent=RESOURCE_ID \
    --location=CLUSTER_LOCATION

以下を置き換えます。

  • TAG_VALUE_ID: 付加するタグ値の永続的な ID または名前空間付きの名前。例: tagValues/4567890123タグ識別子の詳細については、タグの定義と識別子をご覧ください。
  • CLUSTER_LOCATION: Compute Engine のロケーション。ゾーンクラスタの場合は、コンピューティング ゾーンを指定します。
  • RESOURCE_ID: クラスタの完全なリソース名//container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME など)。

    リソース ID で:

    • PROJECT_ID: Google Cloud プロジェクト ID
    • CLUSTER_NAME: クラスタの名前。

コンソール

Google Cloud コンソールを使用して GKE リソースにタグを適用するには、まず、タグを作成して値を構成する必要があります。タグキーとタグ値を作成するには、タグの作成タグ値の追加をご覧ください。

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

    Google Kubernetes Engine に移動

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

  3. [メタデータ] セクションで、[タグ] の横にある [タグの編集] をクリックします。

  4. 組織が [タグ] パネルに表示されない場合は、[スコープの選択] をクリックします。組織を選択して [開く] をクリックします。

  5. [タグ] パネルで、[タグを追加] を選択します。

  6. リストから適用するタグのキーを選択します。リストは、キーワードを入力してフィルタできます。

  7. リストから適用するタグの値を選択します。リストは、キーワードを入力してフィルタできます。

  8. [保存] をクリックします。

  9. [確認] ダイアログで、[確認] をクリックしてタグを適用します。

    タグが更新されたことは、通知によって確認します。

API

タグをリソースに付加するには、まず、タグ値とリソースの永続的な ID を含むタグ バインディングの JSON 表現を作成する必要があります。タグ バインディングの形式について詳しくは、TagBinding リファレンスをご覧ください。

クラスタが配置されているリージョン エンドポイントまたはゾーン エンドポイントを指定して、tagBindings.create メソッドを使用します。

POST https://LOCATION-cloudresourcemanager.googleapis.com/v3/tagBindings

LOCATION は、クラスタが配置されているリージョンまたはゾーンに置き換えます。

JSON リクエストの本文:

{
  "parent": "RESOURCE_ID",
  "tagValue": "TAG_VALUE_ID"
}

以下を置き換えます。

  • RESOURCE_ID: クラスタの完全なリソース名//container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME など)。

    リソース ID で:

    • PROJECT_ID: Google Cloud プロジェクト ID
    • CLUSTER_NAME: クラスタの名前。
  • TAG_VALUE_ID: 付加するタグ値の永続的な ID または名前空間付きの名前。例: tagValues/4567890123タグ識別子の詳細については、タグの定義と識別子をご覧ください。

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

{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.resourcemanager.v3.TagBinding",
    "name": "tagBindings///container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME/tagValues/TAG_VALUE_ID",
    "parent": "//container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME",
    "tagValue": "TAG_VALUE_ID"
  }
}

Terraform

Terraform を使用してタグを作成し、その値を構成してリソースにタグを適用するには、次の例をご覧ください。

resource "google_container_cluster" "default" {
  name     = "gke-autopilot-tag"
  location = "us-central1"

  enable_autopilot = true

  # Set `deletion_protection` to `true` will ensure that one cannot
  # accidentally delete this instance by use of Terraform.
  deletion_protection = false
}

data "google_project" "default" {}

resource "google_tags_tag_key" "default" {
  parent      = "projects/${data.google_project.default.project_id}"
  short_name  = "env"
  description = "Environment tag key"
}

resource "google_tags_tag_value" "default" {
  parent      = "tagKeys/${google_tags_tag_key.default.name}"
  short_name  = "dev"
  description = "Development environment tag value."
}

resource "google_tags_location_tag_binding" "default" {
  parent    = "//container.googleapis.com/${google_container_cluster.default.id}"
  location  = google_container_cluster.default.location
  tag_value = "tagValues/${google_tags_tag_value.default.name}"
}

Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。

クラスタに付加されたタグを一覧取得する

クラスタに付加されたタグは、gcloud CLI、Google Cloud コンソール、または Tags API を使用して一覧表示できます。

gcloud

クラスタに付加されているタグ バインディングのリストを取得するには、次のコマンドを実行します。

gcloud alpha resource-manager tags bindings list \
    --parent=RESOURCE_ID \
    --location=CLUSTER_LOCATION

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

  • CLUSTER_LOCATION: リージョン クラスタの場合は、コンピューティング リージョンを指定します。ゾーンクラスタの場合は、コンピューティング ゾーンを指定します。

  • RESOURCE_ID: クラスタの完全なリソース名//container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME など)。

    リソース ID で:

    • PROJECT_ID: Google Cloud プロジェクト ID

    • CLUSTER_NAME: クラスタの名前。

Console

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

    Google Kubernetes Engine に移動

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

  3. [メタデータ] セクションで、[タグ] の横に現在付加されているタグ値を探します。

API

クラスタのタグ バインディングのリストを取得するには、クラスタが配置されているリージョン エンドポイントまたはゾーン エンドポイントを指定して tagBindings.list メソッドを使用します。

GET https://LOCATION-cloudresourcemanager.googleapis.com/v3/tagBindings

JSON リクエストの本文:

{
  "parent": RESOURCE_ID,
}

以下を置き換えます。

  • RESOURCE_ID: クラスタの完全なリソース名//container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME など)。

    リソース ID で:

    • PROJECT_ID: Google Cloud プロジェクト ID
    • CLUSTER_NAME: クラスタの名前。

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

"tagBindings": [
  {
    "name": "tagBindings/%2F%2Fcontainer.googleapis.com%2Fprojects%2Ftags-bugbash-project%2Flocations%2LOCATION%2Fclusters%2Ftestcluster/tagValues/758072120217",
    "parent": "//container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME",
    "tagValue": "TAG_VALUE_ID"
  }
]

クラスタからタグを切り離す

gcloud CLI、Google Cloud コンソール、または Tags API を使用して、クラスタに接続されたタグ バインディング リソースを削除することで、タグをクラスタから切り離すことができます。タグを削除する必要がある場合は、まず、接続されているすべてのリソースから切断する必要があります。

gcloud

クラスタに接続されているタグ バインディングを切り離すには、次のコマンドを実行します。

gcloud alpha resource-manager tags bindings delete \
    --tag-value=TAG_VALUE_ID \
    --parent=RESOURCE_ID \
    --location=CLUSTER_LOCATION

以下を置き換えます。

  • TAG_VALUE_ID: 切断するタグ値の永続的な ID または名前空間付きの名前。例: tagValues/4567890123タグ識別子の詳細については、タグの定義と識別子をご覧ください。

  • CLUSTER_LOCATION: リージョン クラスタの場合は、コンピューティング リージョンを指定します。ゾーンクラスタの場合は、コンピューティング ゾーンを指定します。

  • RESOURCE_ID: クラスタの完全なリソース名//container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME など)。

    リソース ID で:

    • PROJECT_ID: Google Cloud プロジェクト ID

    • CLUSTER_NAME: クラスタの名前。

Console

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

    Google Kubernetes Engine に移動

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

  3. [メタデータ] セクションで、[タグ] の横にある [タグの編集] をクリックします。

  4. [タグ] パネルで、切断するタグの横にある [項目を削除] をクリックします。

  5. [保存] をクリックします。

  6. [確認] ダイアログで、[確認] をクリックしてタグを切断します。

    タグが更新されたことは、通知によって確認します。

API

クラスタのタグ バインディングを削除するには、クラスタが配置されているリージョン エンドポイントまたはゾーン エンドポイントを指定して tagBindings.delete メソッドを使用します。

DELETE https://LOCATION-cloudresourcemanager.googleapis.com/v3/TAG_BINDING_NAME

TAG_BINDING_NAME は、切断する tagBinding オブジェクトの完全なリソース名に置き換えます。例: tagBindings/container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/tagValues/TAG_VALUE_ID

タグキーとタグ値を削除する

タグキーとタグ値を削除する前に、すべてのリソースからタグが切断されていることを確認します。その後、タグの削除を参照して、キーと値を削除します。

Identity and Access Management の条件とタグ

タグと IAM の条件を使用すると、プロジェクト階層内のユーザーに条件付きでロール バインディングを付与できます。条件付きロール バインディングを含む IAM 許可ポリシーが適用されている場合、クラスタに付加されたタグを変更または削除すると、GKE はそのクラスタへのユーザー アクセスを削除できます。

GKE クラスタの一覧取得と作成の承認は、個々のクラスタレベルではなく、プロジェクト レベルで確認されます。クラスタレベルのタグで条件付き IAM ロール バインディングを使用して特定のクラスタへのアクセスを制限すると、それらのユーザーがプロジェクトでクラスタを一覧取得または作成しようとすると、エラーが発生する可能性があります。これらのエラーを回避するには、親プロジェクトにタグを付加し、条件付きロール バインディングを使用して一覧取得または作成を行うためのアクセス権を付与します。ロールと権限については、IAM ロールのリファレンスをご覧ください。

IAM での条件付きアクセス権付与の詳細については、Identity and Access Management の条件とタグをご覧ください。

次のステップ