GKE ノードのサービス アカウントを構成する

Google Kubernetes Engine(GKE)ノードは、ロギングやワークロードのコンテナ イメージの pull などのタスクに Identity and Access Management(IAM)サービス アカウントを使用します。このドキュメントでは、プラットフォーム管理者とセキュリティ エンジニア向けに、特定のユースケースでサービス アカウントにロールを付与する方法と、デフォルトのサービス アカウントを使用する代わりにカスタム サービス アカウントを作成する方法について説明します。詳細については、ノード サービス アカウントをご覧ください。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。

必要なロール

IAM サービス アカウントとロールの管理に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

  • クラスタ プロジェクトに対する セキュリティ管理者 roles/iam.securityAdmin
  • 別のプロジェクトでサービス アカウントを構成する: サービス アカウント プロジェクトに対するセキュリティ管理者 roles/iam.securityAdmin

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

GKE に必要な最小限のロールを付与する

GKE は、ノードに接続されている IAM サービス アカウントを使用して、ロギングやモニタリングなどのシステムタスクを実行します。これらのノードサービス アカウントには、プロジェクトに対する Kubernetes Engine デフォルト ノードサービス アカウントroles/container.defaultNodeServiceAccount)ロールが最低限必要です。デフォルトでは、GKE はプロジェクトに自動的に作成される Compute Engine のデフォルトのサービス アカウントをノードサービス アカウントとして使用します。

組織で iam.automaticIamGrantsForDefaultServiceAccounts 組織のポリシー制約が適用されている場合、GKE に必要な権限がプロジェクトのデフォルトの Compute Engine サービス アカウントに自動的に付与されないことがあります。

以降のセクションでは、デフォルトの Compute Engine サービス アカウントまたは作成する新しいカスタム サービス アカウントに roles/container.defaultNodeServiceAccount ロールを付与する方法について説明します。

デフォルトの Compute Engine サービス アカウントを構成する

Compute Engine のデフォルト サービス アカウントに roles/container.defaultNodeServiceAccount ロールを付与する手順は次のとおりです。

コンソール

  1. [ようこそ] ページに移動します。

    [ようこそ] に移動

  2. [プロジェクト番号] フィールドで、 [クリップボードにコピー] をクリックします。
  3. [IAM] ページに移動します。

    [IAM] に移動

  4. [ アクセスを許可] をクリックします。
  5. [新しいプリンシパル] フィールドに次の値を指定します。
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    PROJECT_NUMBER は、コピーしたプロジェクト番号に置き換えます。
  6. [ロールを選択] メニューで、[Kubernetes Engine デフォルト ノードサービス アカウント] ロールを選択します。
  7. [保存] をクリックします。

gcloud

  1. Google Cloud プロジェクト番号を確認します。
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

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

    12345678901
    
  2. Compute Engine のデフォルト サービス アカウントに roles/container.defaultNodeServiceAccount ロールを付与します。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    PROJECT_NUMBER は、前の手順のプロジェクト番号に置き換えます。

カスタム ノード サービス アカウントを構成する

カスタム サービス アカウントを作成して GKE に必要なロールを付与する手順は次のとおりです。

コンソール

  1. [サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. [ サービス アカウントを作成] をクリックします。
  3. サービス アカウントの名前を入力します。[サービス アカウント ID] フィールドには、名前に基づいてサービス アカウントの一意の ID が自動的に設定されます。
  4. [作成して続行] をクリックします。
  5. [ロールを選択] メニューで、[Kubernetes Engine デフォルト ノード サービス アカウント] ロールを選択します。
  6. [完了] をクリックします。

gcloud

  1. サービス アカウントを作成します。
    gcloud iam service-accounts create SA_NAME

    SA_NAME は、サービス アカウントを識別する一意の名前に置き換えます。

  2. サービス アカウントに Kubernetes Engine デフォルト ノード サービス アカウントroles/container.defaultNodeServiceAccount)ロールを付与します。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role=roles/container.defaultNodeServiceAccount

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

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • SA_NAME: 作成したサービス アカウントの名前。

Terraform

IAM サービス アカウントを作成し、プロジェクトに対する roles/container.defaultNodeServiceAccount ロールを付与します。

resource "google_service_account" "default" {
  account_id   = "gke-node-service-account"
  display_name = "GKE node service account"
}

data "google_project" "project" {
}

resource "google_project_iam_member" "default" {
  project = data.google_project.project.project_id
  role    = "roles/container.defaultNodeServiceAccount"
  member  = "serviceAccount:${google_service_account.default.email}"
}

Config Connector

注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順を実施してください。

  1. サービス アカウントを作成するには、次のリソースを service-account.yaml としてダウンロードします。
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    metadata:
      name: [SA_NAME]
    spec:
      displayName: [DISPLAY_NAME]

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

    • [SA_NAME]: 新しいサービス アカウントの名前。
    • [DISPLAY_NAME]: サービス アカウントの表示名。
  2. サービス アカウントを作成します。
    kubectl apply -f service-account.yaml
  3. サービス アカウントに roles/logging.logWriter ロールを適用します。
    1. 次のリソースを policy-logging.yaml としてダウンロードします。
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-logging
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/logging.logWriter
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

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

      • [SA_NAME]: サービス アカウントの名前。
      • [PROJECT_ID]: 実際の Google Cloud プロジェクト ID。
    2. サービス アカウントにロールを適用します。
      kubectl apply -f policy-logging.yaml
  4. サービス アカウントに roles/monitoring.metricWriter ロールを適用します。
    1. 次のリソースを policy-metrics-writer.yaml としてダウンロードします。[SA_NAME][PROJECT_ID] はお客様自身の情報に置き換えてください。
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-metrics-writer
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/monitoring.metricWriter
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

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

      • [SA_NAME]: サービス アカウントの名前。
      • [PROJECT_ID]: 実際の Google Cloud プロジェクト ID。
    2. サービス アカウントにロールを適用します。
      kubectl apply -f policy-metrics-writer.yaml
  5. サービス アカウントに roles/monitoring.viewer ロールを適用します。
    1. 次のリソースを policy-monitoring.yaml としてダウンロードします。
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-monitoring
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/monitoring.viewer
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

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

      • [SA_NAME]: サービス アカウントの名前。
      • [PROJECT_ID]: 実際の Google Cloud プロジェクト ID。
    2. サービス アカウントにロールを適用します。
      kubectl apply -f policy-monitoring.yaml
  6. サービス アカウントに roles/autoscaling.metricsWriter ロールを適用します。
    1. 次のリソースを policy-autoscaling-metrics-writer.yaml としてダウンロードします。
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-autoscaling-metrics-writer
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/autoscaling.metricsWriter
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

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

      • [SA_NAME]: サービス アカウントの名前。
      • [PROJECT_ID]: 実際の Google Cloud プロジェクト ID。
    2. サービス アカウントにロールを適用します。
      kubectl apply -f policy-autoscaling-metrics-writer.yaml

作成したサービス アカウントは、他のプロジェクトのリソースにも使用できます。手順については、プロジェクト間でのサービス アカウントの権限借用を有効にするをご覧ください。

プリンシパルがカスタム サービス アカウントを接続できるようにする

クラスタまたはノードプールの作成時に、カスタム サービス アカウントを関連付けることができます。プリンシパル(プラットフォーム管理者など)がカスタム サービス アカウントを使用して GKE リソースを作成できるようにするには、そのプリンシパルにカスタム サービス アカウントに対するサービス アカウント ユーザーroles/iam.serviceAccountUser)ロールを付与します。このロールを付与するには、次のいずれかのオプションを選択します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

    リソース セレクタで、カスタム サービス アカウントを含むプロジェクトを選択します。

  2. GKE ノードで使用するために作成したカスタム サービス アカウントのチェックボックスをオンにします。

  3. [ アクセスを管理する] をクリックします。[アクセス権の管理] ペインが開きます。

  4. [ プリンシパルを追加] をクリックします。アクセス権の付与ペインが開きます。

  5. [新しいプリンシパル] フィールドで、管理者グループなどのプリンシパルを指定します。

  6. [ロールを選択] プルダウン メニューで、[サービス アカウント ユーザー] ロールを選択します。

  7. [保存] をクリックします。[アクセス権の付与] ペインが閉じます。

  8. [アクセスを管理] ペインを閉じます。

gcloud

roles/iam.serviceAccountUser ロールを付与します。

gcloud iam service-accounts add-iam-policy-binding \
    SA_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
    --member=PRINCIPAL \
    --role=roles/iam.serviceAccountUser

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

  • SA_NAME: カスタム サービス アカウントの名前。
  • SERVICE_ACCOUNT_PROJECT_ID: カスタム サービス アカウントを含むプロジェクト ID。
  • PRINCIPAL: プリンシパル IDuser:baklavainthebalkans@example.com など)。

Config Connector

注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順に従ってください。

iam.serviceAccountUser ロールをサービス アカウントに適用します。次のリソースを policy-service-account-user.yaml としてダウンロードします。[SA_NAME][PROJECT_ID] はお客様自身の情報に置き換えてください。

apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
  name: policy-service-account-user
spec:
  member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
  role: roles/iam.serviceAccountUser
  resourceRef:
    kind: Project
    name: [PROJECT_ID]
kubectl apply -f policy-service-account-user.yaml

サービス アカウントにロールを付与すると、これらのプリンシパルはそのサービス アカウントを使用してクラスタとノードプールを作成できます。詳細については、次のドキュメントをご覧ください。

プロジェクト間のサービス アカウントの使用を構成する

ノード サービス アカウントがクラスタと同じプロジェクトにない場合、クラスタ プロジェクトのサービス エージェントにはサービス アカウントに対する追加の権限が必要です。詳細については、ノード サービス アカウントとプロジェクト サービス エージェントをご覧ください。

クラスタ プロジェクトにないノード サービス アカウントに必要なロールを付与する手順は次のとおりです。

  1. プロジェクト間のサービス アカウントの関連付けを有効にするには、組織のポリシーを更新します。
  2. クラスタ プロジェクトのサービス エージェントにカスタム サービス アカウントに対する必要なロールを付与するには、次のいずれかのオプションを選択します。

    コンソール

    1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

      [サービス アカウント] に移動

    2. GKE ノードで使用するために作成したカスタム サービス アカウントのチェックボックスをオンにします。

    3. [ アクセスを管理する] をクリックします。[アクセスを管理] ペインが開きます。

    4. クラスタ プロジェクトの Compute Engine サービス エージェントにサービス アカウント トークン作成者のロールを付与します。

      1. [アクセスを管理] ペインで、[ プリンシパルを追加] をクリックします。[アクセス権を付与] ペインが開きます。
      2. [新しいプリンシパル] フィールドに、クラスタ プロジェクトの Compute Engine サービス エージェントのメールアドレスを指定します。

        service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com
        

        CLUSTER_PROJECT_NUMBER は、クラスタ プロジェクトのプロジェクト番号に置き換えます。

      3. [ロールを選択] メニューで、[サービス アカウント トークン作成者] ロールを選択します。

      4. [保存] をクリックします。[アクセス権の付与] ペインが閉じます。

    5. クラスタ プロジェクトの GKE サービス エージェントにサービス アカウント ユーザーのロールを付与します。

      1. [アクセスを管理] ペインで、 [プリンシパルを追加] をクリックします。[アクセス権を付与] ペインが開きます。
      2. [新しいプリンシパル] フィールドに、クラスタ プロジェクトの GKE サービス エージェントのメールアドレスを指定します。

        service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
        
      3. [ロールを選択] メニューで、[サービス アカウント ユーザー] ロールを選択します。

      4. [保存] をクリックします。[アクセス権の付与] ペインが閉じます。

    6. [アクセスを管理] ペインを閉じます。

    gcloud

    1. クラスタ プロジェクトのプロジェクト番号を取得します。

      gcloud projects describe CLUSTER_PROJECT_ID \
          --format='value(projectNumber)'
      

      CLUSTER_PROJECT_ID は、クラスタ プロジェクトのプロジェクト ID に置き換えます。

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

    2. クラスタ プロジェクトの Compute Engine サービス エージェントに、カスタム サービス アカウントの roles/iam.serviceAccountTokenCreator ロールを付与します。

      gcloud iam service-accounts add-iam-policy-binding \
          SA_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
          --member=service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
          --role=roles/iam.serviceAccountTokenCreator
      

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

      • SA_NAME: カスタム サービス アカウントの名前。
      • SERVICE_ACCOUNT_PROJECT_ID: カスタム サービス アカウントを含むプロジェクトのプロジェクト ID。
      • CLUSTER_PROJECT_NUMBER: クラスタ プロジェクトのプロジェクト番号。
    3. クラスタ プロジェクトの GKE サービス エージェントに、カスタム サービス アカウントに対する roles/iam.serviceAccountUser ロールを付与します。

      gcloud iam service-accounts add-iam-policy-binding \
          SA_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
          --member=service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
          --role=roles/iam.serviceAccountUser
      

限定公開リポジトリからのイメージ pull を許可する

限定公開の Artifact Registry リポジトリにイメージがある場合は、ノード サービス アカウントにそれらのリポジトリへのアクセス権を付与する必要があります。デフォルトの Compute Engine サービス アカウントを使用する場合でも、リポジトリが別のプロジェクトにある場合は、サービス アカウントにリポジトリへのアクセス権を付与する必要があります。

Artifact Registry から非公開イメージを pull するには、リポジトリに対する Artifact Registry 読み取りロールroles/artifactregistry.reader)をノード サービス アカウントに付与します。

コンソール

  1. Google Cloud コンソールで、[リポジトリ] ページに移動します。

    [リポジトリ] に移動

  2. リポジトリのチェックボックスを選択します。

  3. [情報パネルを表示] をクリックします。リポジトリ情報ペインが開きます。

  4. [権限] タブで、[ プリンシパルを追加] をクリックします。[アクセス権を付与] ペインが開きます。

  5. [新しいプリンシパル] フィールドに、ノードサービス アカウントのメールアドレスを指定します。

  6. [ロールを選択] をクリックして、ロール選択ダイアログを開きます。

  7. [Artifact Registry 読み取り] ロールを選択します。

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

gcloud

リポジトリに対する roles/artifactregistry.reader ロールを付与します。

gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \
    --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --project=REPOSITORY_PROJECT_ID \
    --role=roles/artifactregistry.reader

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

Config Connector

注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順を実施してください。

  1. 次のマニフェストを policy-artifact-registry-reader.yaml として保存します。

    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMPolicyMember
    metadata:
      name: policy-artifact-registry-reader
    spec:
      member: serviceAccount:"SA_NAME"@"PROJECT_ID".iam.gserviceaccount.com
      role: roles/artifactregistry.reader
      resourceRef:
        apiVersion: artifactregistry.cnrm.cloud.google.com/v1beta1
        kind: ArtifactRegistryRepository
        name: "REPOSITORY_NAME"

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

    • SA_NAME: IAM サービス アカウントの名前。
    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • REPOSITORY_NAME: Artifact Registry リポジトリの名前。
  2. Artifact Registry 読み取りロールをサービス アカウントに付与します。

    kubectl apply -f policy-artifact-registry-reader.yaml
    

次のステップ