本主題說明如何為 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
請參閱:
這些程序中使用的環境變數
這些程序會使用下列環境變數。您可以在指令殼層中設定這些值,或在程式碼範例中將這些值替換為實際值:
PROJECT_ID
:Google Cloud 專案的 ID。ORG_NAME
:Apigee 機構名稱。ENV_NAME
:Apigee 環境的名稱。NAMESPACE
:Apigee 命名空間的名稱。這通常是apigee
。CLUSTER_NAME
:叢集名稱。CLUSTER_LOCATION
:叢集的區域或可用區,例如:us-west1
。APIGEECTL_HOME
:您安裝apigeectl
的目錄。HYBRID_FILES
:混合式檔案目錄,例如hybrid-base-directory/hybrid-files
。
驗證環境變數:
echo $PROJECT_IDecho $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_NAME
echo $CLUSTER_LOCATION
echo $APIGEECTL_HOME
echo $HYBRID_FILES
初始化所需的任何變數:
export PROJECT_ID=my-project-idexport ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_NAME=my-cluster-name
export CLUSTER_LOCATION=my-cluster-location
export APIGEECTL_HOME=hybrid-base-directory/apigeectl
export 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 前初始化變數。
接著,請按照「設定 workloadIdentityEnabled: true
並建立服務帳戶」中的操作說明,在 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-backup
Kubernetes 服務帳戶的建立作業: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.workloadIdentityUser
IAM 角色。 - 使用 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