本主題說明如何為 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 中的 Google 服務帳戶 (不含 Workload Identity)
如果不使用 Workload Identity,您必須將 Google 服務帳戶連結至 overrides.yaml 檔案中的每個元件,並參照憑證檔案或 Kubernetes 密鑰。例如:
- 認證檔案:
watcher: serviceAccountPath: ./apigee-org/my-hybrid-project-apigee-watcher.json
請參閱:
- Kubernetes Secret:
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,或尚未在 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
輸出內容應如下所示:
Prod
非正式環境:
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-accountProd
非正式環境:
$APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts
這項指令會建立下列服務帳戶:
apigee-cassandraapigee-loggerapigee-martapigee-metricsapigee-runtimeapigee-synchronizerapigee-udcaapigee-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 Hybrid 元件建立 Kubernetes 服務帳戶。
- 在
gcp節的下方,將以下粗體字行的程式碼新增至overrides.yaml檔案。這會為安裝項目啟用 Workload Identity,並在您套用設定時,觸發apigeectl建立 Kubernetes 服務帳戶:gcp: projectID: "my-project-id" name: "my-project-id" region: "analytics-region" workloadIdentityEnabled: true
- 在
cassandra節的overrides.yaml檔案中,加入以下以粗體顯示的程式碼行。這會觸發建立 Kubernetes 服務帳戶:apigee-cassandra-backupcassandra: ... backup: enabled: true - 使用
apigeectl指令並加上--restore旗標,套用變更:$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 |
| 監看指令碼 | 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-backupapigee-cassandra-restoreapigee-cassandra-schema-setupapigee-cassandra-schema-val(val= 驗證)apigee-cassandra-user-setupapigee-datastore-default
Prod
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
Prod
- 定義
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
Prod
- 定義
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 指標
Prod
- 定義
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 (機構層級)
Prod
- 定義
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
Prod
- 定義
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
- 定義
針對每個環境:
- 執行階段
Prod
- 定義
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
- 定義
- 同步器
Prod
- 定義
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 (環境層級)
Prod
- 定義
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
請按照下列操作說明,在現有 Hybrid 安裝作業中新增 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