始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- 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 ロールを付与する手順は次のとおりです。
コンソール
- [ようこそ] ページに移動します。
- [プロジェクト番号] フィールドで、 [クリップボードにコピー] をクリックします。
- [IAM] ページに移動します。
- [ アクセスを許可] をクリックします。
- [新しいプリンシパル] フィールドに次の値を指定します。
PROJECT_NUMBER-compute@developer.gserviceaccount.comPROJECT_NUMBERは、コピーしたプロジェクト番号に置き換えます。 - [ロールを選択] メニューで、[Kubernetes Engine デフォルト ノードサービス アカウント] ロールを選択します。
- [保存] をクリックします。
gcloud
- Google Cloud プロジェクト番号を確認します。
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
PROJECT_IDは、実際のプロジェクト ID に置き換えます。出力は次のようになります。
12345678901
- 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 に必要なロールを付与する手順は次のとおりです。
コンソール
- [サービス アカウント] ページに移動します。
- [ サービス アカウントを作成] をクリックします。
- サービス アカウントの名前を入力します。[サービス アカウント ID] フィールドには、名前に基づいてサービス アカウントの一意の ID が自動的に設定されます。
- [作成して続行] をクリックします。
- [ロールを選択] メニューで、[Kubernetes Engine デフォルト ノード サービス アカウント] ロールを選択します。
- [完了] をクリックします。
gcloud
- サービス アカウントを作成します。
gcloud iam service-accounts create SA_NAME
SA_NAMEは、サービス アカウントを識別する一意の名前に置き換えます。 - サービス アカウントに 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 ロールを付与します。
Config Connector
注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順を実施してください。
- サービス アカウントを作成するには、次のリソースを
service-account.yamlとしてダウンロードします。次のように置き換えます。
[SA_NAME]: 新しいサービス アカウントの名前。[DISPLAY_NAME]: サービス アカウントの表示名。
- サービス アカウントを作成します。
kubectl apply -f service-account.yaml
- サービス アカウントに
roles/logging.logWriterロールを適用します。- 次のリソースを
policy-logging.yamlとしてダウンロードします。次のように置き換えます。
[SA_NAME]: サービス アカウントの名前。[PROJECT_ID]: 実際の Google Cloud プロジェクト ID。
- サービス アカウントにロールを適用します。
kubectl apply -f policy-logging.yaml
- 次のリソースを
- サービス アカウントに
roles/monitoring.metricWriterロールを適用します。- 次のリソースを
policy-metrics-writer.yamlとしてダウンロードします。[SA_NAME]と[PROJECT_ID]はお客様自身の情報に置き換えてください。次のように置き換えます。
[SA_NAME]: サービス アカウントの名前。[PROJECT_ID]: 実際の Google Cloud プロジェクト ID。
- サービス アカウントにロールを適用します。
kubectl apply -f policy-metrics-writer.yaml
- 次のリソースを
- サービス アカウントに
roles/monitoring.viewerロールを適用します。- 次のリソースを
policy-monitoring.yamlとしてダウンロードします。次のように置き換えます。
[SA_NAME]: サービス アカウントの名前。[PROJECT_ID]: 実際の Google Cloud プロジェクト ID。
- サービス アカウントにロールを適用します。
kubectl apply -f policy-monitoring.yaml
- 次のリソースを
- サービス アカウントに
roles/autoscaling.metricsWriterロールを適用します。- 次のリソースを
policy-autoscaling-metrics-writer.yamlとしてダウンロードします。次のように置き換えます。
[SA_NAME]: サービス アカウントの名前。[PROJECT_ID]: 実際の Google Cloud プロジェクト ID。
- サービス アカウントにロールを適用します。
kubectl apply -f policy-autoscaling-metrics-writer.yaml
- 次のリソースを
作成したサービス アカウントは、他のプロジェクトのリソースにも使用できます。手順については、プロジェクト間でのサービス アカウントの権限借用を有効にするをご覧ください。
プリンシパルがカスタム サービス アカウントを接続できるようにする
クラスタまたはノードプールの作成時に、カスタム サービス アカウントを関連付けることができます。プリンシパル(プラットフォーム管理者など)がカスタム サービス アカウントを使用して GKE リソースを作成できるようにするには、そのプリンシパルにカスタム サービス アカウントに対するサービス アカウント ユーザー(roles/iam.serviceAccountUser)ロールを付与します。このロールを付与するには、次のいずれかのオプションを選択します。
コンソール
Google Cloud コンソールで、[サービス アカウント] ページに移動します。
リソース セレクタで、カスタム サービス アカウントを含むプロジェクトを選択します。
GKE ノードで使用するために作成したカスタム サービス アカウントのチェックボックスをオンにします。
[ アクセスを管理する] をクリックします。[アクセス権の管理] ペインが開きます。
[ プリンシパルを追加] をクリックします。アクセス権の付与ペインが開きます。
[新しいプリンシパル] フィールドで、管理者グループなどのプリンシパルを指定します。
[ロールを選択] プルダウン メニューで、[サービス アカウント ユーザー] ロールを選択します。
[保存] をクリックします。[アクセス権の付与] ペインが閉じます。
[アクセスを管理] ペインを閉じます。
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: プリンシパル ID(user:baklavainthebalkans@example.comなど)。
Config Connector
注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順に従ってください。
iam.serviceAccountUser ロールをサービス アカウントに適用します。次のリソースを policy-service-account-user.yaml としてダウンロードします。[SA_NAME] と [PROJECT_ID] はお客様自身の情報に置き換えてください。
kubectl apply -f policy-service-account-user.yaml
サービス アカウントにロールを付与すると、これらのプリンシパルはそのサービス アカウントを使用してクラスタとノードプールを作成できます。詳細については、次のドキュメントをご覧ください。
プロジェクト間のサービス アカウントの使用を構成する
ノード サービス アカウントがクラスタと同じプロジェクトにない場合、クラスタ プロジェクトのサービス エージェントにはサービス アカウントに対する追加の権限が必要です。詳細については、ノード サービス アカウントとプロジェクト サービス エージェントをご覧ください。
クラスタ プロジェクトにないノード サービス アカウントに必要なロールを付与する手順は次のとおりです。
- プロジェクト間のサービス アカウントの関連付けを有効にするには、組織のポリシーを更新します。
クラスタ プロジェクトのサービス エージェントにカスタム サービス アカウントに対する必要なロールを付与するには、次のいずれかのオプションを選択します。
コンソール
Google Cloud コンソールで、[サービス アカウント] ページに移動します。
GKE ノードで使用するために作成したカスタム サービス アカウントのチェックボックスをオンにします。
[ アクセスを管理する] をクリックします。[アクセスを管理] ペインが開きます。
クラスタ プロジェクトの Compute Engine サービス エージェントにサービス アカウント トークン作成者のロールを付与します。
- [アクセスを管理] ペインで、[ プリンシパルを追加] をクリックします。[アクセス権を付与] ペインが開きます。
[新しいプリンシパル] フィールドに、クラスタ プロジェクトの Compute Engine サービス エージェントのメールアドレスを指定します。
service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.comCLUSTER_PROJECT_NUMBERは、クラスタ プロジェクトのプロジェクト番号に置き換えます。[ロールを選択] メニューで、[サービス アカウント トークン作成者] ロールを選択します。
[保存] をクリックします。[アクセス権の付与] ペインが閉じます。
クラスタ プロジェクトの GKE サービス エージェントにサービス アカウント ユーザーのロールを付与します。
- [アクセスを管理] ペインで、 [プリンシパルを追加] をクリックします。[アクセス権を付与] ペインが開きます。
[新しいプリンシパル] フィールドに、クラスタ プロジェクトの GKE サービス エージェントのメールアドレスを指定します。
service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com[ロールを選択] メニューで、[サービス アカウント ユーザー] ロールを選択します。
[保存] をクリックします。[アクセス権の付与] ペインが閉じます。
[アクセスを管理] ペインを閉じます。
gcloud
クラスタ プロジェクトのプロジェクト番号を取得します。
gcloud projects describe CLUSTER_PROJECT_ID \ --format='value(projectNumber)'CLUSTER_PROJECT_IDは、クラスタ プロジェクトのプロジェクト ID に置き換えます。出力は
123456789のようになります。クラスタ プロジェクトの 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: クラスタ プロジェクトのプロジェクト番号。
クラスタ プロジェクトの 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)をノード サービス アカウントに付与します。
コンソール
Google Cloud コンソールで、[リポジトリ] ページに移動します。
リポジトリのチェックボックスを選択します。
[情報パネルを表示] をクリックします。リポジトリ情報ペインが開きます。
[権限] タブで、[ プリンシパルを追加] をクリックします。[アクセス権を付与] ペインが開きます。
[新しいプリンシパル] フィールドに、ノードサービス アカウントのメールアドレスを指定します。
[ロールを選択] をクリックして、ロール選択ダイアログを開きます。
[Artifact Registry 読み取り] ロールを選択します。
[保存] をクリックします。
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
次のように置き換えます。
REPOSITORY_NAME: Artifact Registry リポジトリの名前。SERVICE_ACCOUNT_EMAIL: ノード サービス アカウントのメールアドレス。REPOSITORY_PROJECT_ID: リポジトリを含むプロジェクトのプロジェクト ID。
Config Connector
注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順を実施してください。
次のマニフェストを
policy-artifact-registry-reader.yamlとして保存します。次のように置き換えます。
- SA_NAME: IAM サービス アカウントの名前。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REPOSITORY_NAME: Artifact Registry リポジトリの名前。
Artifact Registry 読み取りロールをサービス アカウントに付与します。
kubectl apply -f policy-artifact-registry-reader.yaml