本主題說明如何為 Apigee Hybrid 啟用 Workload Identity。
總覽
Workload Identity 是一種讓在 GKE (Google Kubernetes Engine) 中執行的應用程式存取 Google Cloud 服務的方式。如要瞭解 Workload Identity 的總覽,請參閱:
Google Cloud IAM 服務帳戶是可供應用程式用於向 Google API 提出要求的身分,這些服務帳戶在文件中稱為 GSA (Google 服務帳戶)。如要進一步瞭解 GSA,請參閱「服務帳戶」一文。
另外,Kubernetes 也有服務帳戶的概念。服務帳戶會為在 Pod 中執行的程序提供身分。Kubernetes 服務帳戶是 Kubernetes 資源,而 Google 服務帳戶則是 Google Cloud 專屬。如要瞭解 Kubernetes 服務帳戶,請參閱 Kubernetes 說明文件中的「 為 Pod 設定服務帳戶」一節。
在 Apigee hybrid 1.4 以上版本中,Apigee 會為每種類型的元件建立及使用 Kubernetes 服務帳戶。啟用 Workload Identity 後,混合式元件就能與 Kubernetes 服務帳戶互動。
Apigee Hybrid 中未啟用 Workload Identity 的 Google 服務帳戶
如果您不使用 Workload Identity,就必須將 Google 服務帳戶連結至 overrides.yaml 檔案中的每個元件,並參照憑證檔案或 Kubernetes 密鑰。例如:
- 憑證檔案:watcher: serviceAccountPath: ./apigee-org/my-hybrid-project-apigee-watcher.json 請參閱: 
- Kubernetes 密鑰:watcher: serviceAccountRef: my-watcher-k8s-secret 請參閱: 
這些程序中使用的環境變數
這些程序會使用下列環境變數。您可以在指令殼層中設定這些值,或在程式碼範例中將這些值替換為實際值:
- APIGEECTL_HOME:您安裝- apigeectl的目錄。
- CLUSTER_LOCATION:叢集的區域或可用區,例如:- us-west1。
- ENV_NAME:Apigee 環境的名稱。
- NAMESPACE:您用於 Apigee Hybrid 的 Kubernetes 命名空間。一般為- apigee。
- HYBRID_FILES:混合式檔案目錄,例如- hybrid-base-directory/hybrid-files。
- ORG_NAME:Apigee 機構名稱。
- PROJECT_ID:Google Cloud 專案的 ID。
驗證環境變數:
echo $PROJECT_IDecho $ORG_NAMEecho $ENV_NAMEecho $NAMESPACEecho $CLUSTER_LOCATIONecho $APIGEECTL_HOMEecho $HYBRID_FILES
初始化所需的任何變數:
export PROJECT_ID=my-project-idexport ORG_NAME=$PROJECT_IDexport ENV_NAME=my-environment-nameexport NAMESPACE=apigeeexport CLUSTER_LOCATION=my-cluster-locationexport APIGEECTL_HOME=hybrid-base-directory/apigeectlexport HYBRID_FILES=hybrid-base-directory/hybrid-files
Workload Identity 和服務帳戶金鑰檔案
在 GKE 上執行 Apigee hybrid 時,標準做法是為每個服務帳戶建立及下載私密金鑰 (.json 檔案)。使用 Workload Identity 時,您不需要下載服務帳戶私密金鑰,然後將這些金鑰新增至 GKE 叢集。
如果您在 Apigee Hybrid 安裝期間下載了服務帳戶金鑰檔案,啟用 Workload Identity 後即可刪除這些檔案。在大多數安裝作業中,這些檔案會位於 hybrid-base-directory/hybrid-files/service-accounts/ 目錄中。
為 Apigee Hybrid 啟用 Workload Identity
首先,請按照「準備啟用 Workload Identity」中的指示更新節點集區,並在啟用 Workload Identity 前初始化變數。
接著,請根據您要執行的步驟,按照其中一個部分的說明操作:- 為新安裝的叢集啟用 Workload Identity。如果您是新安裝 Apigee Hybrid,或是尚未在混合式安裝中安裝 ASM,請按照這些操作說明操作。
- 升級安裝項目以使用 Workload Identity。請按照這些操作說明,在現有的 Apigee Hybrid 安裝作業中啟用 Workload Identity。
準備啟用 Workload Identity
開始安裝程序前,請按照本節中的步驟操作。
- 將專案設為要修改的專案:
    gcloud config set project $PROJECT_ID 
- 
    使用下列指令,取得您要啟用 Workload Identity 的叢集的 gcloud憑證:gcloud container clusters get-credentials ${CLUSTER_NAME} \ --region ${CLUSTER_LOCATION} \ --project ${PROJECT_ID}
- 請使用下列指令,確認執行 Apigee 的 GKE 叢集是否已啟用 Workload Identity:gcloud container clusters describe $CLUSTER_NAME --region $CLUSTER_LOCATION --project $PROJECT_ID 輸出內容應如下所示: … … status: RUNNING subnetwork: default workloadIdentityConfig: workloadPool: my-project-id.svc.id.goog 如有需要,請在叢集上啟用 Workload Identity。這項作業最多需要 30 分鐘才能完成: gcloud container clusters update $CLUSTER_NAME \ --workload-pool=$PROJECT_ID.svc.id.goog \ --project $PROJECT_ID \ --region $CLUSTER_LOCATION 詳情請參閱「啟用 Workload Identity」。 
- 請確認每個節點集區都已啟用 Workload Identity。- 使用下列指令列出節點集區:gcloud container node-pools list \ --cluster $CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID 輸出內容應如下所示: NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION apigee-runtime e2-standard-4 100 1.23.12-gke.100 apigee-data e2-standard-4 100 1.23.12-gke.100 
- 針對每個節點集區,使用下列指令確認已為每個節點集區啟用 Workload Identity:gcloud container node-pools update NODE_POOL_NAME \ --cluster=$CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --workload-metadata=GKE_METADATA 其中 NODE_POOL_NAME 是各個節點集區的名稱。 
 
- 使用下列指令列出節點集區:
驗證或建立 Google 服務帳戶
安裝期間,系統會為許多 Apigee Hybrid 元件建立 Google 服務帳戶。請按照這個程序驗證 Google 服務帳戶,並建立所需的帳戶。
- 請使用下列指令,查看專案的 Google 服務帳戶名稱:
    gcloud iam service-accounts list --project $PROJECT_ID 輸出內容應如下所示: 正式發布階段針對非正式環境: DISPLAY NAME EMAIL DISABLED apigee-cassandra apigee-cassandra@my_project_id.iam.gserviceaccount.com False apigee-logger apigee-logger@my_project_id.iam.gserviceaccount.com False apigee-mart apigee-mart@my_project_id.iam.gserviceaccount.com False apigee-metrics apigee-metrics@my_project_id.iam.gserviceaccount.com False apigee-runtime apigee-runtime@my_project_id.iam.gserviceaccount.com False apigee-synchronizer apigee-synchronizer@my_project_id.iam.gserviceaccount.com False apigee-udca apigee-udca@my_project_id.iam.gserviceaccount.com False apigee-watcher apigee-watcher@my_project_id.iam.gserviceaccount.com False 非正式環境針對非正式環境: DISPLAY NAME EMAIL DISABLED apigee-non-prod apigee-non-prod@my_project_id.iam.gserviceaccount.com False 如果您需要為專案建立 Google 服務帳戶,可以使用以下兩種方法: - 請使用 apigeectl/tools/目錄中 apigee 隨附的create-service-account工具。這項工具可以透過單一指令建立所有服務帳戶,也可以讓您個別建立服務帳戶。
- 使用 gcloud iam service-accounts create指令逐一建立服務帳戶,並使用gcloud projects add-iam-policy-binding指令為每個服務帳戶指派適當的角色。這個方法需要個別建立每個服務帳戶,但可避免下載金鑰檔案。
 
使用下列指令,為每個元件建立 Google 服務帳戶:create-service-account正式發布階段針對非正式環境: $APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts 這項指令會建立下列服務帳戶: - apigee-cassandra
- apigee-logger
- apigee-mart
- apigee-metrics
- apigee-runtime
- apigee-synchronizer
- apigee-udca
- apigee-watcher
 非正式環境針對非正式環境: $APIGEECTL_HOME/tools/create-service-account --env non-prod --dir $APIGEECTL_HOME/../service-accounts 這個指令會建立單一服務帳戶 apigee-non-prod,並指派管理所有 Apigee 元件的所有必要角色。gcloud建立下列服務帳戶並指派角色。 - 服務帳戶:apigee-cassandra,角色:roles/storage.objectAdmin建立帳戶: gcloud iam service-accounts create apigee-cassandra \ --display-name="apigee-cassandra" \ --project $PROJECT_ID指派角色: gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/storage.objectAdmin"
- 服務帳戶:apigee-logger,角色:roles/logging.logWriter建立帳戶: gcloud iam service-accounts create apigee-logger \ --display-name="apigee-logger" \ --project $PROJECT_ID指派角色: gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:apigee-logger@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/logging.logWriter"
- 服務帳戶:apigee-mart,角色:roles/apigeeconnect.Agent建立帳戶: gcloud iam service-accounts create apigee-mart \ --display-name="apigee-mart" \ --project $PROJECT_ID指派角色: gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:apigee-mart@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/apigeeconnect.Agent"
- 服務帳戶:apigee-metrics,角色:roles/monitoring.metricWriter建立帳戶: gcloud iam service-accounts create apigee-metrics \ --display-name="apigee-metrics" \ --project $PROJECT_ID指派角色: gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/monitoring.metricWriter"
- 服務帳戶:apigee-runtime,角色:未指派任何角色。建立帳戶: gcloud iam service-accounts create apigee-runtime \ --display-name="apigee-runtime" \ --project $PROJECT_ID
- 服務帳戶:apigee-synchronizer,角色:roles/apigee.synchronizerManager建立帳戶: gcloud iam service-accounts create apigee-synchronizer \ --display-name="apigee-synchronizer" \ --project $PROJECT_ID指派角色: gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/apigee.synchronizerManager"
- 服務帳戶:apigee-udca,角色:roles/apigee.analyticsAgent建立帳戶: gcloud iam service-accounts create apigee-udca \ --display-name="apigee-udca" \ --project $PROJECT_ID指派角色: gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:apigee-udca@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/apigee.analyticsAgent"
- 服務帳戶:apigee-watcher,角色:roles/apigee.runtimeAgent建立帳戶: gcloud iam service-accounts create apigee-watcher \ --display-name="apigee-watcher" \ --project $PROJECT_ID指派角色: gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/apigee.runtimeAgent"
 
- 請使用 
  設定 workloadIdentityEnabled: true 並建立服務帳戶
  當您在覆寫檔案中設定 workloadIdentityEnabled: true 並套用變更時,apigeectl 會為每個 Apigee 混合式元件建立 Kubernetes 服務帳戶。
- 將下方加粗的程式碼加入 overrides.yaml檔案的gcp段落下方。這會為安裝程序啟用 Workload Identity,並在您套用設定時觸發apigeectl建立 Kubernetes 服務帳戶:gcp: projectID: "my-project-id" name: "my-project-id" region: "analytics-region" workloadIdentityEnabled: true 
- 將下方加粗的程式碼行新增至 overrides.yaml檔案的cassandra段落下方。這會觸發apigee-cassandra-backupKubernetes 服務帳戶的建立作業:cassandra: ... backup: enabled: true
- 使用 --restore標記的apigeectl指令套用變更:$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --restore 
- 請使用下列指令驗證服務帳戶:kubectl get sa -n $NAMESPACE 輸出內容應如下所示。粗體字體的 Kubernetes 服務帳戶,是您需要使用 Google 服務帳戶加上註解的帳戶: NAME SECRETS AGE apigee-cassandra-backup 1 11m apigee-cassandra-restore 1 11m apigee-cassandra-schema-setup-my-project-id-123abcd-sa 1 11m apigee-cassandra-schema-val-my-project-id-123abcd 1 11m apigee-cassandra-user-setup-my-project-id-123abcd-sa 1 11m apigee-connect-agent-my-project-id-123abcd-sa 1 11m apigee-datastore-default-sa 1 11m apigee-ingressgateway 1 11m apigee-ingressgateway-my-project-id-123abcd 1 11m apigee-ingressgateway-manager 1 11m apigee-init 1 11m apigee-mart-my-project-id-123abcd-sa 1 11m apigee-metrics-sa 1 11m apigee-mint-task-scheduler-my-project-id-123abcd-sa 1 11m apigee-redis-default-sa 1 11m apigee-redis-envoy-default-sa 1 11m apigee-runtime-my-project-id-env-name-234bcde-sa 1 11m apigee-synchronizer-my-project-id-env-name-234bcde-sa 1 11m apigee-udca-my-project-id-123abcd-sa 1 11m apigee-udca-my-project-id-env-name-234bcde-sa 1 11m apigee-watcher-my-project-id-123abcd-sa 1 11m default 1 11m
使用 Google 服務帳戶為 Kubernetes 服務帳戶加上註解
針對每個 Apigee 元件,請使用元件的 Google 服務帳戶為對應的 Kubernetes 服務帳戶加上註解。
機構層級元件
您 Apigee 機構的每個 Kubernetes 服務帳戶都只有一個例項。
| 元件 | Kubernetes 服務帳戶 | Google 服務帳戶 | 
|---|---|---|
| Cassandra | apigee-cassandra-backup | apigee-cassandra | 
| apigee-cassandra-restore  | apigee-cassandra | |
| apigee-cassandra-schema-setup-my-project-id-num-id1-sa | apigee-cassandra | |
| apigee-cassandra-schema-val-my-project-id-num-id1 | apigee-cassandra | |
| apigee-cassandra-user-setup-my-project-id-num-id1-sa | apigee-cassandra | |
| apigee-datastore-default-sa | apigee-cassandra | |
| Apigee Connect | apigee-connect-agent-my-project-id-num-id1-sa | apigee-mart | 
| MART | apigee-mart-my-project-id-num-id1-sa | apigee-mart | 
| 指標 | apigee-metrics-sa | apigee-metrics | 
| UDCA (機構層級) | apigee-udca-my-project-id-num-id1-sa | apigee-udca | 
| Watcher | apigee-watcher-my-project-id-num-id1-sa | apigee-watcher | 
環境層級元件
每個 Apigee 環境都會有一個 Kubernetes 服務帳戶執行個體。
| 元件 | Kubernetes 服務帳戶 | Google 服務帳戶 | 
|---|---|---|
| Apigee Runtime | apigee-runtime-my-project-id-env-name-num-id2-sa | apigee-runtime | 
| Synchronizer | apigee-synchronizer-my-project-id-env-name-num-id2-sa | apigee-synchronizer | 
| UDCA (環境層級) | apigee-udca-my-project-id-env-name-num-id2-sa | apigee-udca | 
  在下列指令中使用 kubectl get sa -n $NAMESPACE 指令傳回的 Kubernetes 服務帳戶名稱,例如:apigee-cassandra-schema-val-hybrid-example-project-123abcd。
在這個程序中,您將針對每個 Kubernetes 服務帳戶執行以下操作:
- 
    將 Kubernetes 服務帳戶和主要 Google 服務帳戶繫結至 roles/iam.workloadIdentityUserIAM 角色。
- 使用 Google 服務帳戶註解 Kubernetes 服務帳戶。
- 繫結角色並為服務帳戶加上註解。機構層級元件為組織層級元件加上 Kubernetes 服務帳戶註解。您必須為 Apigee 組織中的每個元件執行這項操作一次。 - Cassandra
        Cassandra 元件有六個相關聯的 Kubernetes 服務帳戶: - apigee-cassandra-backup
- apigee-cassandra-restore
- apigee-cassandra-schema-setup
- apigee-cassandra-schema-val(- val= 驗證)
- apigee-cassandra-user-setup
- apigee-datastore-default
 正式發布階段apigee-cassandra-backup- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-cassandra" KSA_NAME="apigee-cassandra-backup"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-cassandra-restore- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-cassandra-restore" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-cassandra-schema-setup-service-account-name- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-cassandra-schema-setup-service-account-name" 繫結 IAM 角色: gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-cassandra-schema-val-service-account-name- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-cassandra-schema-val-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-cassandra-user-setup-service-account-name- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-cassandra-user-setup-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-datastore-default-sa- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-datastore-default-sa" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 非正式環境apigee-cassandra-backup- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-non-prod" KSA_NAME="apigee-connect-agent-service-account-name"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-cassandra-restore- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-cassandra-restore" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-cassandra-schema-setup-service-account-name- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-cassandra-schema-setup-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-cassandra-schema-val-service-account-name- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-cassandra-schema-val-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-cassandra-user-setup-service-account-name- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-cassandra-user-setup-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 apigee-datastore-default-sa- 重新定義 KSA_NAME環境變數:KSA_NAME="apigee-datastore-default-sa" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 
- Apigee Connect
        正式發布階段- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-mart" KSA_NAME="apigee-connect-agent-service-account-name"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 非正式環境- 定義 KSA_NAME環境變數:KSA_NAME="apigee-connect-agent-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 
- 定義 
- MART
        正式發布階段- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-mart" KSA_NAME="apigee-mart-service-account-name"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 非正式環境- 定義 KSA_NAME環境變數:KSA_NAME="apigee-mart-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 
- 定義 
- Apigee 指標
          正式發布階段- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-metrics" KSA_NAME="apigee-metrics-sa"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 非正式環境- 定義 KSA_NAME環境變數:KSA_NAME="apigee-metrics-sa" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 
- 定義 
- UDCA (機構層級)
        正式發布階段- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-udca" KSA_NAME="apigee-udca-org-level-service-account-name"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 非正式環境- 定義 KSA_NAME環境變數:KSA_NAME="apigee-udca-org-level-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
- 為服務帳戶加上註解:
              kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
 
- 定義 
- Apigee Watcher
        正式發布階段- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-watcher" KSA_NAME="apigee-watcher-service-account-name"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 非正式環境- 定義 KSA_NAME環境變數:KSA_NAME="apigee-watcher-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 
- 定義 
 針對每個環境: - 執行階段
        正式發布階段- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-runtime" KSA_NAME="apigee-runtime-service-account-name"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 非正式環境- 定義 KSA_NAME環境變數:KSA_NAME="apigee-runtime-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 
- 定義 
- Synchronizer
        正式發布階段- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-synchronizer" KSA_NAME="apigee-synchronizer-service-account-name"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 非正式環境- 定義 KSA_NAME環境變數:KSA_NAME="apigee-synchronizer-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 
- 定義 
- UDCA (環境層級)
        正式發布階段- 定義 KSA_NAME和GSA_NAME環境變數:GSA_NAME="apigee-udca" KSA_NAME="apigee-udca-env-level-service-account-name"
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
 非正式環境- 定義 KSA_NAME環境變數:KSA_NAME="apigee-udca-env-level-service-account-name" 
- 繫結 IAM 角色:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 
- 為服務帳戶加上註解:
            kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com 
 
- 定義 
 
- Cassandra
        
- 驗證步驟是否有效:
    gcloud config set project $PROJECT_ID 選取要測試的 Kubernetes 服務帳戶,例如: apigee-cassandra-backup。KSA_NAME="kubernetes-service-account-name" kubectl run --rm -it --image google/cloud-sdk:slim \ --namespace $NAMESPACE workload-identity-test\ -- gcloud auth list 如果沒有看到指令提示,請嘗試按下 Enter 鍵。 如果步驟執行正確,您應該會看到類似以下的回應: Credentialed Accounts ACTIVE ACCOUNT * GSA@PROJECT_ID.iam.gserviceaccount.com
- 如果您是從先前的安裝作業升級,請清除包含服務帳戶私密金鑰的機密:kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
- 檢查記錄:
kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer 
升級安裝項目以使用 Workload Identity
請按照下列操作說明,將 Workload Identity 新增至現有的混合式安裝作業。
以下範例說明為 Apigee 建立的 Google 服務帳戶 (GSA):
gcloud iam service-accounts list --filter "apigee"
DISPLAY NAME EMAIL DISABLED apigee-cassandra apigee-cassandra@PROJECT_ID.iam.gserviceaccount.com False apigee-connect apigee-connect@PROJECT_ID.iam.gserviceaccount.com False apigee-runtime apigee-runtime@PROJECT_ID.iam.gserviceaccount.com False apigee-metrics apigee-metrics@PROJECT_ID.iam.gserviceaccount.com False apigee-mart apigee-mart@PROJECT_ID.iam.gserviceaccount.com False apigee-watcher apigee-watcher@PROJECT_ID.iam.gserviceaccount.com False apigee-sync apigee-sync@PROJECT_ID.iam.gserviceaccount.com False apigee-udca apigee-udca@$PROJECT_ID.iam.gserviceaccount.com False
以下是為 Apigee 建立的 Kubernetes 服務帳戶 (KSA) 範例:
kubectl get sa -n $NAMESPACE
apigee-cassandra-schema-setup-ORG_NAME-cb84b88-sa 1 xxd apigee-cassandra-user-setup-ORG_NAME-cb84b88-sa 1 xxd apigee-connect-agent-ORG_NAME-cb84b88-sa 1 xxd apigee-init 1 xxd apigee-mart-ORG_NAME-cb84b88-sa 1 xxd apigee-metrics-apigee-telemetry 1 xxd apigee-runtime-ORG_NAME-ENV_NAME-1d0dc5e-sa 1 xxd apigee-synchronizer-ORG_NAME-ENV_NAME-1d0dc5e-sa 1 xxd apigee-udca-ORG_NAME-ENV_NAME-1d0dc5e-sa 1 xxd apigee-watcher-ORG_NAME-cb84b88 1 xxd
- 將 Workload Identity 角色新增至每個服務帳戶:gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 舉例來說,如果您要設定 Apigee 同步處理工具的權限,請執行以下命令: export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:$PROJECT_ID.svc.id.goog[apigee/$KSA_NAME]" apigee-sync@$PROJECT_ID.iam.gserviceaccount.com 
- 請在每個 KSA 中加上 GSA 詳細資料的註解:kubectl annotate serviceaccount \ --namespace $NAMESPACE \ $KSA_NAME \ iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com 舉例來說,如果您要設定 Apigee 同步處理工具的權限,請執行以下命令: export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})kubectl annotate serviceaccount --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-sync@$PROJECT_ID.iam.gserviceaccount.com 
- 驗證步驟是否有效:
gcloud config set project $PROJECT_ID kubectl run --rm -it --image google/cloud-sdk:slim \ --namespace $NAMESPACE workload-identity-test\ -- gcloud auth list 如果沒有看到指令提示,請嘗試按下 Enter 鍵。 如果步驟執行正確,您應該會看到類似以下的回應: Credentialed Accounts ACTIVE ACCOUNT * GSA@PROJECT_ID.iam.gserviceaccount.com
- 如果您是從先前的安裝作業升級,請清除包含服務帳戶私密金鑰的機密:kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
- 檢查記錄:
kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer