本文說明如何為 Google Distributed Cloud 連結網路方案 設定及使用 Workload Identity 叢集驗證。Workload Identity 叢集驗證功能會使用短期權杖和 Workload Identity Federation,讓工作負載安全存取 Google Cloud 資源,而非服務帳戶金鑰。短期憑證是 OAuth 2.0 存取權杖。根據預設,存取權杖會在 1 小時後失效。
透過 Workload Identity 叢集驗證,工作負載可以使用自己的 Kubernetes 身分直接存取 Google Cloud 資源,或模擬 Google 服務帳戶。
相較於使用服務帳戶金鑰,Workload Identity 叢集驗證有兩大優點:
提升安全性:如未妥善管理服務帳戶金鑰,可能會產生安全性風險,OAuth 2.0 權杖和 Workload Identity Federation 是服務帳戶金鑰的最佳替代方案。如要進一步瞭解服務帳戶權杖,請參閱「短期服務帳戶憑證」。如要進一步瞭解 Workload Identity Federation,請參閱「 Workload Identity Federation」。
減少維護作業:服務帳戶金鑰需要更多維護作業。 定期輪替及保護這些金鑰可能會造成管理負擔。
本文適用於負責設定、監控及管理基礎技術架構生命週期的管理員、架構師和營運人員。如要進一步瞭解Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
叢集管理
本指南說明如何為應用程式使用 Workload Identity Federation。系統會自動管理 Distributed Cloud 連線叢集的叢集層級 Workload Identity Federation。
Google 會透過 Distributed Cloud Edge Container API 建立及管理 Distributed Cloud 連線叢集,您可以使用 gcloud edge-cloud container clusters create 指令或在 Google Cloud 控制台中執行這項操作。
Distributed Cloud 連線叢集會自動註冊至所建立專案中的 Fleet。您不需要手動註冊車隊。系統會自動提供 Workload Identity Federation Pool,格式為 PROJECT_ID.svc.id.goog。
事前準備
設定工作負載身分聯盟前,請先確認 Google Cloud 專案中已啟用下列 API。如要瞭解如何啟用 API,請參閱「啟用服務」:
iam.googleapis.comsts.googleapis.comiamcredentials.googleapis.comgkehub.googleapis.com
確認您已安裝下列指令列工具:
- 最新版 Google Cloud CLI,其中包含
gcloud,這是與 Google Cloud互動的指令列工具。 kubectl
如果您使用 Cloud Shell 做為與Google Cloud互動的殼層環境,系統會為您安裝這些工具。
- 最新版 Google Cloud CLI,其中包含
確認您已初始化 gcloud CLI,以便搭配專案使用。
請確認您在專案中具備下列 IAM 角色。您必須具備下列角色才能完成設定:
- 擁有者 (
roles/owner) 或 - IAM 安全管理員 (
roles/iam.securityAdmin) 和服務帳戶管理員 (roles/iam.serviceAccountAdmin)
- 擁有者 (
在接下來的幾節中,您將建立服務帳戶,並授予 Workload Identity 叢集驗證所需的角色。
建議:Workload Identity 聯盟直接資源存取權
透過 Workload Identity Federation 直接存取資源,您可以使用 Workload Identity Federation 將 IAM 角色授予 Kubernetes ServiceAccount,讓該帳戶直接存取 Google Cloud資源。
| 身分識別 | 目的 | 角色 |
|---|---|---|
| Kubernetes ServiceAccount |
工作負載使用的 Kubernetes 身分。授予這個身分存取必要 Google Cloud 資源所需的角色。這個範例會授予 roles/storage.objectViewer 角色和 roles/logging.admin 角色。 |
roles/storage.objectViewerroles/logging.admin |
替代做法:模擬 IAM 服務帳戶
或者,您也可以將 Kubernetes ServiceAccount 設定為使用 IAM 服務帳戶模擬功能。
| 服務帳戶 | 目的 | 角色 |
|---|---|---|
| Google 服務帳戶 | 叢集內工作負載模擬的 Google 服務帳戶。授予此服務帳戶存取必要資源所需的角色。 Google Cloud | 視存取的資源而定。 |
| Kubernetes ServiceAccount |
授予這個身分模擬 Google 服務帳戶的權限。這項授權使用 roles/iam.workloadIdentityUser 角色。 |
roles/iam.workloadIdentityUser
|
設定服務帳戶
下列各節包含建立必要 Kubernetes ServiceAccount 的操作說明,並說明如何使用 Workload Identity 聯盟直接資源存取權或 Google 服務帳戶模擬,授予該帳戶 Workload Identity 叢集驗證所需的角色。
建立 Kubernetes ServiceAccount
在叢集中,使用 kubectl create 指令為 Pod 建立 Kubernetes ServiceAccount。您也可以使用任何現有的 ServiceAccount,包括命名空間中的預設 ServiceAccount。
kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
替換下列值:
KSA_NAME:Kubernetes ServiceAccount 的名稱NAMESPACE:叢集的命名空間
使用 Workload Identity 聯盟授予資源直接存取權
如要直接將 Identity and Access Management 角色授予 Kubernetes ServiceAccount 身分,請按照下列步驟操作。
使用 gcloud projects describe 指令找出專案編號:
gcloud projects describe PROJECT_ID --format="value(projectNumber)"將
PROJECT_ID替換為專案 ID。使用 gcloud projects add-iam-policy-binding 指令,將必要角色授予 Kubernetes 身分主體:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role=roles/storage.objectViewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role=roles/logging.admin替換下列值:
PROJECT_NUMBER:您的專案編號 (數值)NAMESPACE:叢集的命名空間KSA_NAME:Kubernetes ServiceAccount 的名稱
替代做法:使用 IAM 服務帳戶模擬功能授予存取權
如要讓工作負載模擬 Google 服務帳戶,請按照下列步驟操作。
使用 gcloud iam service-accounts create 指令建立 Google 服務帳戶:
gcloud iam service-accounts create my-app-sa \ --project=PROJECT_ID將
PROJECT_ID替換為專案 ID。使用 gcloud projects add-iam-policy-binding 指令,將必要角色授予 Google 服務帳戶:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/storage.objectViewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/logging.admin使用 gcloud iam service-accounts add-iam-policy-binding 指令,授予 Kubernetes ServiceAccount 模擬 Google 服務帳戶的能力:
gcloud iam service-accounts add-iam-policy-binding my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.workloadIdentityUser \ --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"替換下列值:
NAMESPACE:叢集的命名空間KSA_NAME:Kubernetes ServiceAccount 的名稱
使用 kubectl annotate 指令為 Kubernetes ServiceAccount 加上註解,將其連結至 Google 服務帳戶:
kubectl annotate serviceaccount \ --namespace NAMESPACE KSA_NAME \ iam.gke.io/gcp-service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com
設定工作負載
更新 Pod 規格,使用 Kubernetes ServiceAccount 並掛接投射的權杖磁碟區。由於 Distributed Cloud 連線叢集位於Google Cloud外部,您也必須提供憑證設定檔,並設定 GOOGLE_APPLICATION_CREDENTIALS 環境變數來指向該檔案。Pod 中的Google Cloud 用戶端程式庫會使用這些憑證,透過 Security Token Service API 將 Kubernetes 權杖換成 Google Cloud 存取權杖。
產生
credential-configuration.json檔案。根據您是使用 Workload Identity Federation 直接存取資源,還是使用 IAM 服務帳戶模擬功能,選擇適用的指令。Workload Identity 聯盟直接資源存取權
使用 gcloud iam workload-identity-pools create-cred-config 指令:
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \ --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \ --credential-source-type=text \ --output-file=credential-configuration.json使用 IAM 服務帳戶模擬功能授予存取權
使用 gcloud iam workload-identity-pools create-cred-config 指令:
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \ --service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \ --credential-source-type=text \ --output-file=credential-configuration.json將
PROJECT_NUMBER替換為 Google Cloud 專案編號。您可以執行gcloud projects describe PROJECT_ID --format="value(projectNumber)"來找出專案編號。使用
kubectl create configmap指令建立 KubernetesConfigMap,儲存設定檔:kubectl create configmap CREDENTIAL_CONFIG_MAP \ --namespace NAMESPACE \ --from-file=credential-configuration.json替換下列值:
CREDENTIAL_CONFIG_MAP:ConfigMap的名稱,其中包含憑證設定檔NAMESPACE:叢集的命名空間
使用下列 YAML 內容更新 Pod 規格:
spec: serviceAccountName: KSA_NAME containers: - name: MY_CONTAINER image: MY_IMAGE env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-creds/credential-configuration.json volumeMounts: - mountPath: /var/run/secrets/tokens/gcp-ksa name: gcp-ksa - mountPath: /var/run/secrets/tokens/gcp-creds name: gcp-creds readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 0420 sources: - serviceAccountToken: path: token audience: PROJECT_ID.svc.id.goog expirationSeconds: 3600 - name: gcp-creds configMap: name: CREDENTIAL_CONFIG_MAP替換下列值:
KSA_NAME:Kubernetes ServiceAccount 的名稱MY_CONTAINER:容器名稱MY_IMAGE:圖片名稱
限制
使用 Distributed Cloud connected 的 Workload Identity Federation 時,不支援下列功能:
- 在權杖交換程序中使用 Proxy 伺服器
如要瞭解如何搭配使用 Workload Identity Federation 與 VPC Service Controls,請參閱「設定 VPC Service Controls 整合」。