透過 Apigee Hybrid 啟用 Workload Identity

本主題說明如何為 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 密鑰。例如:

這些程序中使用的環境變數

這些程序會使用下列環境變數。您可以在指令殼層中設定這些值,或在程式碼範例中將這些值替換為實際值:

  • 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_ID
echo $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_NAME
echo $CLUSTER_LOCATION
echo $APIGEECTL_HOME
echo $HYBRID_FILES

初始化所需的任何變數:

export PROJECT_ID=my-project-id
export 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

開始安裝程序前,請按照本節中的步驟操作。

  1. 將專案設為要修改的專案:
    gcloud config set project $PROJECT_ID
  2. 使用下列指令,取得您要啟用 Workload Identity 的叢集的 gcloud 憑證:
    gcloud container clusters get-credentials ${CLUSTER_NAME} \
      --region ${CLUSTER_LOCATION} \
      --project ${PROJECT_ID}
  3. 請使用下列指令,確認執行 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」。

  4. 請確認每個節點集區都已啟用 Workload Identity。
    1. 使用下列指令列出節點集區:
      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
    2. 針對每個節點集區,使用下列指令確認已為每個節點集區啟用 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 服務帳戶,並建立所需的帳戶。

  1. 請使用下列指令,查看專案的 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 指令為每個服務帳戶指派適當的角色。這個方法需要個別建立每個服務帳戶,但可避免下載金鑰檔案。

    create-service-account

    使用下列指令,為每個元件建立 Google 服務帳戶:

    正式發布階段

    針對非正式環境:

    $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

    建立下列服務帳戶並指派角色。

    1. 服務帳戶: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"
                  
    2. 服務帳戶: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"
                  
    3. 服務帳戶: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"
                  
    4. 服務帳戶: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"
                  
    5. 服務帳戶:apigee-runtime角色:未指派任何角色。

      建立帳戶:

      gcloud iam service-accounts create apigee-runtime \
        --display-name="apigee-runtime" \
        --project $PROJECT_ID
                  
    6. 服務帳戶: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"
                  
    7. 服務帳戶: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"
                  
    8. 服務帳戶: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 服務帳戶。

  1. 將下方加粗的程式碼加入 overrides.yaml 檔案的 gcp 段落下方。這會為安裝程序啟用 Workload Identity,並在您套用設定時觸發 apigeectl 建立 Kubernetes 服務帳戶:
    gcp:
      projectID: "my-project-id"
      name: "my-project-id"
      region: "analytics-region"
      workloadIdentityEnabled: true
  2. 將下方加粗的程式碼行新增至 overrides.yaml 檔案的 cassandra 段落下方。這會觸發 apigee-cassandra-backup Kubernetes 服務帳戶的建立作業:
    cassandra:
      ...
      backup:
        enabled: true
  3. 使用 --restore 標記的 apigeectl 指令套用變更:
    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --restore
  4. 請使用下列指令驗證服務帳戶:
    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 服務帳戶。
  1. 繫結角色並為服務帳戶加上註解。

    機構層級元件

    為組織層級元件加上 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

      1. 定義 KSA_NAMEGSA_NAME 環境變數:
        GSA_NAME="apigee-cassandra"
        KSA_NAME="apigee-cassandra-backup"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. 重新定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-cassandra-restore"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        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

      1. 重新定義 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
      2. 為服務帳戶加上註解:
        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

      1. 重新定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        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

      1. 重新定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. 重新定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-datastore-default-sa"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非正式環境

      apigee-cassandra-backup

      1. 定義 KSA_NAMEGSA_NAME 環境變數:
        GSA_NAME="apigee-non-prod"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. 重新定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-cassandra-restore"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        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

      1. 重新定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        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

      1. 重新定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        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

      1. 重新定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        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

      1. 重新定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-datastore-default-sa"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Connect

      正式發布階段

      1. 定義 KSA_NAMEGSA_NAME 環境變數:
        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非正式環境

      1. 定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-connect-agent-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • MART

      正式發布階段

      1. 定義 KSA_NAMEGSA_NAME 環境變數:

        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-mart-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非正式環境

      1. 定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-mart-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee 指標

      正式發布階段

      1. 定義 KSA_NAMEGSA_NAME 環境變數:

        GSA_NAME="apigee-metrics"
        KSA_NAME="apigee-metrics-sa"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非正式環境

      1. 定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-metrics-sa"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (機構層級)

      正式發布階段

      1. 定義 KSA_NAMEGSA_NAME 環境變數:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非正式環境

      1. 定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
          kubectl annotate serviceaccount \
            --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Watcher

      正式發布階段

      1. 定義 KSA_NAMEGSA_NAME 環境變數:

        GSA_NAME="apigee-watcher"
        KSA_NAME="apigee-watcher-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非正式環境

      1. 定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-watcher-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

    針對每個環境:

    • 執行階段

      正式發布階段

      1. 定義 KSA_NAMEGSA_NAME 環境變數:

        GSA_NAME="apigee-runtime"
        KSA_NAME="apigee-runtime-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非正式環境

      1. 定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-runtime-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Synchronizer

      正式發布階段

      1. 定義 KSA_NAMEGSA_NAME 環境變數:

        GSA_NAME="apigee-synchronizer"
        KSA_NAME="apigee-synchronizer-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非正式環境

      1. 定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-synchronizer-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (環境層級)

      正式發布階段

      1. 定義 KSA_NAMEGSA_NAME 環境變數:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非正式環境

      1. 定義 KSA_NAME 環境變數:

        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. 繫結 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
      3. 為服務帳戶加上註解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
  2. 驗證步驟是否有效:
    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
  3. 如果您是從先前的安裝作業升級,請清除包含服務帳戶私密金鑰的機密:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  4. 檢查記錄:
    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
  1. 將 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
    
  2. 請在每個 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
    
  3. 驗證步驟是否有效:
    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
  4. 如果您是從先前的安裝作業升級,請清除包含服務帳戶私密金鑰的機密:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  5. 檢查記錄:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer