このドキュメントでは、ベアメタル上の Google Distributed Cloud(ソフトウェアのみ)のクラスタのキーレス モード機能を設定して使用する方法について説明します。キーレス モードでは、サービス アカウント キーの代わりに有効期間の短いトークンと Workload Identity 連携を使用して、クラスタを作成して保護します。サービス アカウントの有効期間の短い認証情報は、OAuth 2.0 アクセス トークンの形式で提供されます。デフォルトでは、アクセス トークンは 1 時間後に期限切れになります。ただし、イメージ プル トークンは 12 時間後に期限切れになります。
キーレス モードは、バージョン 1.30 以降のクラスタでのみ使用できます。
一方、クラスタの作成と保護の標準方法である鍵モードでは、ダウンロードされたサービス アカウント キーが使用されます。セルフマネージド(管理、ハイブリッド、スタンドアロン)クラスタを作成する場合は、ダウンロードしたキーのパスを指定します。鍵は、クラスタとマネージド ユーザー クラスタに Secret として保存されます。デフォルトでは、サービス アカウント キーに有効期限はありません。正しく管理しないとセキュリティ上のリスクになります。
キーレス モードには、サービス アカウント キーを使用する場合と比べて主に次の 2 つのメリットがあります。
セキュリティの強化: サービス アカウント キーは、正しく管理されていないとセキュリティ リスクになります。OAuth 2.0 トークンと Workload Identity 連携は、サービス アカウント キーのベスト プラクティスの代替手段と見なされます。サービス アカウント トークンの詳細については、有効期間の短いサービス アカウント認証情報をご覧ください。Workload Identity 連携の詳細については、 Workload Identity 連携をご覧ください。
メンテナンスの削減: サービス アカウント キーは、より多くのメンテナンスが必要です。これらの鍵を定期的にローテーションして保護することは、管理上の負担が非常に大きくなります。
始める前に
次のセクションでは、サービス アカウントを作成し、キーレス モードに必要なロールを付与します。このドキュメントの設定手順は、Google Cloud リソースを設定するの手順に代わるものではありません。標準の Google Distributed Cloud ソフトウェアのみのインストールの前提条件に加えて必要となります。鍵なしモードに必要なサービス アカウントは、Google Cloud リソースを設定するで説明されているサービス アカウントに似ていますが、一意の名前が付けられているため、デフォルトのサービス アカウント鍵を使用するクラスタと競合しません。
このページは、基盤となる技術インフラストラクチャのライフサイクルの設定、モニタリング、管理を行う管理者、アーキテクト、オペレーターを対象としています。Google Cloud のコンテンツで参照する一般的なロールとタスク例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。
次の表に、キーレス モードに必要なサービス アカウントを示します。
サービス アカウント | 目的 | ロール |
---|---|---|
ADMIN_SA |
このサービス アカウントを使用してトークンを生成します。各トークンには、サービス アカウントのロールに関連付けられた権限があります。 |
roles/gkehub.admin roles/logging.admin roles/monitoring.admin roles/monitoring.dashboardEditor roles/iam.serviceAccountAdmin roles/iam.serviceAccountTokenCreator
|
baremetal-controller |
Connect Agent は、このサービス アカウントを使用して、クラスタと Google Cloud 間の接続を維持し、 フリートにクラスタを登録します。このサービス アカウントは、baremetal-gcr サービス アカウントのトークンも更新します。 |
roles/gkehub.admin roles/monitoring.dashboardEditor roles/serviceusage.serviceUsageViewer
|
baremetal-cloud-ops |
Stackdriver Agent は、このサービス アカウントを使用して、クラスタから Cloud Logging と Cloud Monitoring にログと指標をエクスポートします。 |
roles/logging.logWriter roles/monitoring.metricWriter roles/stackdriver.resourceMetadata.writer roles/opsconfigmonitoring.resourceMetadata.writer roles/monitoring.dashboardEditor roles/monitoring.viewer roles/serviceusage.serviceUsageViewer roles/kubernetesmetadata.publisher
|
baremetal-gcr |
Google Distributed Cloud は、このサービス アカウントを使用して Container Registry からコンテナ イメージをダウンロードします。 | なし |
キーレス モードのサービス アカウントを作成して構成する
以降のセクションでは、必要なサービス アカウントを作成し、キーレス モードに必要なロールを付与する手順について説明します。サービス アカウントと必要なロールの一覧については、前のセクションの表をご覧ください。
サービス アカウントを作成する
キーレス モードのサービス アカウントを作成するには、次の操作を行います。
管理ワークステーションで Google Cloud CLI にログインします。
gcloud auth login
必要に応じて、管理サービス アカウントを作成します。
ADMIN_SA
サービス アカウントの名前は任意です。前のセクションの表に示されているロールが既存のサービス アカウントに含まれている場合は、そのサービス アカウントを使用することもできますが、最小権限の原則に反するため、おすすめしません。gcloud iam service-accounts create ADMIN_SA \ --project=PROJECT_ID
PROJECT_ID
は、Google Cloud プロジェクトの ID に置き換えます。キーレス機能の標準サービス アカウントを作成します。
鍵なし機能の標準サービス アカウントには、必要に応じてカスタマイズできる事前定義された名前があります。
gcloud iam service-accounts create baremetal-controller \ --project=PROJECT_ID gcloud iam service-accounts create baremetal-cloud-ops \ --project=PROJECT_ID gcloud iam service-accounts create baremetal-gcr \ --project=PROJECT_ID
PROJECT_ID
は、Google Cloud プロジェクトの ID に置き換えます。
サービス アカウントの Identity and Access Management ポリシー バインディングを追加する
ADMIN_SA
サービス アカウントに必要なロールの IAM ポリシー バインディングを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/gkehub.admin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/logging.admin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.admin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.dashboardEditor gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountAdmin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
baremetal-controller
サービス アカウントに必要なロールの IAM ポリシー バインディングを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/gkehub.admin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.dashboardEditor gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/serviceusage.serviceUsageViewer
baremetal-cloud-ops
サービス アカウントに必要なロールの IAM ポリシー バインディングを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/logging.logWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.dashboardEditor gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.metricWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/opsconfigmonitoring.resourceMetadata.writer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/stackdriver.resourceMetadata.writer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.viewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/serviceusage.serviceUsageViewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/kubernetesmetadata.publisher
baremetal-controller
サービス アカウントに、baremetal-gcr
サービス アカウントに代わってアクセス トークンを生成する権限を付与します。gcloud iam service-accounts add-iam-policy-binding \ baremetal-gcr@PROJECT_ID.iam.gserviceaccount.com \ --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
クラスタの Workload Identity 連携を構成する
GKE 用 Workload Identity 連携を使用して Google Cloud へのアクセス権を付与するには、アプリケーションの ID に対応するプリンシパルに特定の Google Cloud リソースに対するアクセス権を付与する IAM 許可ポリシーを作成します。この場合、Workload Identity 連携はクラスタ内の特定のオペレータへのアクセス権を付与します。Workload Identity Federation for GKE の詳細については、IAM ドキュメントの Workload Identity 連携をご覧ください。
クラスタ オペレーターの IAM ポリシー バインディングを追加する
次のコマンドは、anthos-cluster-operator
Kubernetes サービス アカウントに、baremetal-controller
サービス アカウントの権限借用と、クラスタに代わって Google Cloud リソースの操作を行う権限を付与します。
ブートストラップ クラスタを含む鍵のないクラスタ(または計画されている鍵のないクラスタ)ごとに、クラスタ内の
anthos-cluster-operator
にbaremetal-controller
サービス アカウントの権限を付与します。次のコマンドでは、
principalSet
はワークロード ID プールと、kube-system
Namespace 内の Kubernetes サービス アカウントanthos-cluster-operator
で構成されています。gcloud iam service-accounts add-iam-policy-binding \ baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/anthos-cluster-operator \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID
次のように置き換えます。
PROJECT_NUM
: プロジェクトに対して自動的に生成される固有識別子。REGION
: クラスタのフリート メンバーシップのロケーション。デフォルトはglobal
です。詳細については、フリート メンバーシップのロケーションをご覧ください。CLUSTER_NAME
: クラスタの名前。 デフォルトでは、ブートストラップ クラスタ名はbmctl-MACHINE_NAME
です。
baremetal-controller
サービス アカウントのポリシー バインディングを確認します。gcloud iam service-accounts get-iam-policy \ baremetal-controller@PROJECT_ID.iam.gserviceaccount.com
レスポンスは次のようになります。
bindings: - members: - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/anthos-cluster-operator - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/anthos-cluster-operator - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/anthos-cluster-operator role: roles/iam.workloadIdentityUser etag: BwYoN3QLig0= version: 1
Google Cloud Observability オペレータの IAM ポリシー バインディングを追加する
次のコマンドは、次の Google Cloud Observability Kubernetes サービス アカウントに、baremetal-cloud-ops
サービス アカウントの権限を借用し、クラスタに代わって Google Cloud リソースを操作する権限を付与します。
cloud-audit-logging
gke-metrics-agent
kubestore-collector
metadata-agent
stackdriver-log-forwarder
ブートストラップ クラスタを含む鍵のないクラスタ(または計画されている鍵のないクラスタ)ごとに、クラスタ内の Google Cloud Observability オペレーターに
baremetal-cloud-ops
サービス アカウントの権限借用を許可します。次の各コマンドでは、
principalSet
はワークロード ID プールと、kube-system
Namespace 内の Kubernetes サービス アカウント(cloud-audit-logging
など)で構成されています。gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/cloud-audit-logging \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/gke-metrics-agent \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/kubestore-collector \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/metadata-agent \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/stackdriver-log-forwarder \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID
baremetal-cloud-ops
サービス アカウントのポリシー バインディングを確認します。gcloud iam service-accounts get-iam-policy \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com
レスポンスは次のようになります。
bindings: - members: - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/cloud-audit-logging - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/gke-metrics-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/kubestore-collector - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/metadata-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/stackdriver-log-forwarder - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/cloud-audit-logging - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/gke-metrics-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/kubestore-collector - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/metadata-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/stackdriver-log-forwarder - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/cloud-audit-logging - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/gke-metrics-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/kubestore-collector - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/metadata-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/stackdriver-log-forwarder role: roles/iam.workloadIdentityUser etag: BwYhT4gL-dY= version: 1
クラスタ構成
キーレス モードを使用するクラスタとのクラスタ構成の最も明らかな違いは、ダウンロードしたサービス アカウント キーのパスを指定しないことです。
構成ファイルにクラスタ設定を入力する場合は、次の例に示すように、認証情報セクションのサービス アカウント キーパスを空白のままにします。
gcrKeyPath: sshPrivateKeyPath: /home/USERNAME/.ssh/id_rsa gkeConnectAgentServiceAccountKeyPath: gkeConnectRegisterServiceAccountKeyPath: cloudOperationsServiceAccountKeyPath: --- apiVersion: v1 kind: Namespace metadata: name: cluster-CLUSTER_NAME --- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: cluster-CLUSTER_NAME spec: type: admin profile: default anthosBareMetalVersion: 1.30.0-gke.1930 ...
必要に応じて、キーレス モードのサービス アカウントにカスタム名を設定します。
カスタム名を指定すると、既存のサービス アカウントを使用できます。複数のサービス アカウントに同じカスタム名を指定すると、サービス アカウントを統合できます。
apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: cluster-CLUSTER_NAME annotations: baremetal.cluster.gke.io/controller-service-account: "CUSTOM_CONTROLLER_GSA" baremetal.cluster.gke.io/cloud-ops-service-account: "CUSTOM_CLOUD_OPS_GSA" baremetal.cluster.gke.io/gcr-service-account: "CUSTOM_GCR_GSA" spec: type: admin profile: default anthosBareMetalVersion: 1.30.0-gke.1930 ...
クラスタ オペレーション
キーレス モードのクラスタを作成、アップグレード、削除する準備ができたら、次の手順を行います。
Google Cloud CLI にログインします。
gcloud auth login
管理ワークステーションで、
ADMIN_SA
サービス アカウントのキーを作成してダウンロードします。gcloud iam service-accounts keys create TMP_KEY_FILE_PATH \ --iam-account=ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com
TMP_KEY_FILE_PATH
は、ダウンロードした鍵ファイルのパスとファイル名に置き換えます。ADMIN_SA
サービス アカウントを使用して Google Cloud へのアクセスを承認します。gcloud auth activate-service-account ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --key-file=TMP_KEY_FILE_PATH
ダウンロードした JSON キーファイルを削除します。
rm TMP_KEY_FILE_PATH
管理ワークステーションで、
ADMIN_SA
サービス アカウントによって作成されたアクセス トークンの値を使用してGCP_ACCESS_TOKEN
環境変数を作成します。export GCP_ACCESS_TOKEN=$(gcloud auth print-access-token \ --impersonate-service-account=ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com)
デフォルトでは、アクセス トークンの有効期間は 1 時間です。
トークンが
ADMIN_SA
サービス アカウントによって生成され、有効期限が正しいことを確認します。curl "https://oauth2.googleapis.com/tokeninfo?access_token=$GCP_ACCESS_TOKEN"
レスポンスには、次のような行が含まれます。
... "expires_in": "3582", "email": "ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com)", ...
有効期限の値は秒単位で、
3600
未満にする必要があります。これは、トークンが 1 時間未満で期限切れになることを示します。bmctl
コマンドを実行して、キーレス モードのクラスタを作成、アップグレード、削除します。bmctl
は、GCP_ACCESS_TOKEN
環境変数が設定されていることを検出すると、トークンの検証を実行します。トークンが有効な場合、bmctl
はキーレス モードのクラスタ オペレーションにトークンを使用します。キーレス モードを使用するクラスタの場合、次のコマンドでは、
GCP_ACCESS_TOKEN
環境変数を有効なアクティブなアクセス トークンに設定する必要があります。bmctl create cluster -c CLUSTER_NAME
bmctl reset cluster -c CLUSTER_NAME
bmctl upgrade cluster -c CLUSTER_NAME
制限事項
キーレス モードはプレビュー版であるため、キーレス モードで実行されているクラスタでは次の機能は使用できません。
- プロキシ サーバーの使用
- VPC Service Controls