步驟 5:設定服務帳戶驗證

總覽

這個步驟說明如何為上一步建立的 Google Cloud 服務帳戶設定驗證方式。

請根據您要使用的驗證方式,選取對應的操作說明。如要概略瞭解不同的驗證方式,請參閱「Apigee hybrid 的服務帳戶驗證方式」。

Kubernetes Secret

服務帳戶

您需要為下列服務帳戶建立 Kubernetes Secret:

正式環境

  • apigee-cassandra
  • apigee-logger
  • apigee-mart
  • apigee-metrics
  • apigee-mint-task-scheduler (如果您使用 Apigee Hybrid 營利功能)
  • apigee-runtime
  • apigee-synchronizer
  • apigee-udca
  • apigee-watcher

非正式環境

  • apigee-non-prod

您會在「建立覆寫檔案」步驟中提供這些 Secret。

這項程序會使用下列選用環境變數:

  • $APIGEE_HELM_CHARTS_HOME
  • $APIGEE_NAMESPACE
  • $PROJECT_ID

如果您未定義這些變數,請在程式碼範例中為每個變數替換適當的值。

建立 Kubernetes Secret

建立 Kubernetes Secret,用於儲存服務帳戶金鑰。

下列程式碼範例中的 kubectl create secret 指令結構如下:

kubectl create secret generic SECRET_NAME \
  --from-file="client_secret.json=PATH_TO_SERVICE_ACCOUNT_KEY" \
  -n $APIGEE_NAMESPACE

正式環境

kubectl create secret generic apigee-logger-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-logger.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-metrics-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-metrics.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-watcher-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-watcher.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-udca-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-udca.json" \
  -n $APIGEE_NAMESPACE
    
kubectl create secret generic apigee-mart-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-mart.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-synchronizer-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-synchronizer.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-runtime-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-runtime.json" \
  -n $APIGEE_NAMESPACE

如果您使用 Apigee hybrid 營利功能,也需要為 apigee-mint-task-scheduler 服務帳戶建立 Kubernetes 密鑰:

kubectl create secret generic apigee-mint-task-scheduler-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-mint-task-scheduler.json" \
  -n $APIGEE_NAMESPACE

非正式環境

kubectl create secret generic apigee-non-prod-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-non-prod.json" \
  -n $APIGEE_NAMESPACE

選用:建立 Kubernetes 密鑰後,您可以刪除服務帳戶 JSON 檔案。

如要進一步瞭解如何搭配使用 Kubernetes Secret 與 Apigee hybrid,請參閱「將服務帳戶金鑰儲存在 Kubernetes Secret 中」。

JSON 檔案

您不需要採取其他步驟,即可使用 JSON 檔案設定驗證。請繼續進行步驟 6:建立 TLS 憑證。

保管箱

設定在 Vault 儲存服務帳戶 Secret

安裝 CSI 驅動程式和 Vault 供應商

如果您尚未透過 Helm 在叢集上安裝 CSI 驅動程式,請按照「Secrets Store CSI 驅動程式:安裝」中的操作說明進行。詳情請參閱 Vault 說明文件中的「安裝 Vault CSI 供應器」一節。

如要瞭解 Apigee hybrid 支援的最低 CSI 驅動程式版本,請參閱「Apigee hybrid 支援的平台和版本」。

建立 Vault 密鑰、政策和角色

使用 Vault UI 或 API 建立 Secret,並授予權限給 Apigee hybrid 使用的 Kubernetes 服務帳戶,以便讀取這些 Secret。

  1. 請按照下列格式建立組織和環境專屬 Secret:
    密鑰Secret 資料
    secret/data/apigee/orgsakeys
    {
        "cassandraBackup": "***",
        "cassandraRestore": "***",
        "connectAgent": "***",
        "logger": "***",
        "mart": "***",
        "metrics": "***",
        "mint": "***",
        "udca": "***",
        "watcher": "***"
    }
    secret/data/apigee/envsakeys-ENV_NAME
    {
        "runtime": "***",
        "synchronizer": "***",
        "udca": "***".
    }

    將每組中的 "***" 替換為 Google 服務帳戶的 .json 檔案內容,該帳戶對應至 Apigee 元件。apigee-cassandra-backup 和 apigee-cassandra-restore 都使用 apigee-cassandra 服務帳戶。例如:

    {
        "cassandraBackup": "{
            "type": "service_account",
            "project_id": "myhybridorg",
            "private_key_id": "PRIVATE_KEY_ID",
            "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY_TEXT\n-----END PRIVATE KEY-----\n",
            "client_email": "apigee-cassandra@myhybridorg.iam.gserviceaccount.com",
            "client_id": "123456789012345678901",
            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
            "token_uri": "https://oauth2.googleapis.com/token",
            "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
            "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/apigee-cassandra%40myhybridorg.iam.gserviceaccount.com",
            "universe_domain": "googleapis.com"
        }",
        "cassandraRestore":...
    ...
    }
  2. 授予組織密鑰的存取權。建立名為 orgsakeys-auth-policy.txt 的文字檔,並加入下列內容:
    path "secret/data/apigee/orgsakeys" {
        capabilities = ["read"]
    }
  3. 在 Vault 中建立政策,授予組織 Secret 的存取權:
    vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
  4. 針對每個環境,建立名為 envsakeys-ENV_NAME-auth-policy.txt 的文字檔,並加入下列內容:
    path "secret/data/apigee/envsakeys-ENV_NAME" {
        capabilities = ["read"]
    }

    為每個環境重複這個步驟。

  5. 在 Vault 中建立政策,授予環境密鑰的存取權:
    vault policy write apigee-envsakeys-ENV_NAME-auth envsakeys-ENV_NAME-auth-policy.txt

    為每個環境重複這個步驟。

  6. 建立名為 generate-encoded-sas.sh 的指令碼,並加入以下內容:
    # generate-encoded-sas.sh
    
    ORG=$APIGEE_ORG            # Apigee organization name
    ENVS=$APIGEE_ENV_LIST      # comma separated env names, for example: dev,prod
    
    ORG_SHORT_NAME=$(echo $ORG | head -c 15)
    ENCODE=$(echo -n $ORG | shasum -a 256 | head -c 7)
    ORG_ENCODE=$(echo "$ORG_SHORT_NAME-$ENCODE")
    NAMES=apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-${ORG_ENCODE},apigee-cassandra-schema-val-${ORG_ENCODE},apigee-cassandra-user-setup-${ORG_ENCODE},apigee-mart-${ORG_ENCODE},apigee-mint-task-scheduler-${ORG_ENCODE},apigee-connect-agent-${ORG_ENCODE},apigee-watcher-${ORG_ENCODE},apigee-udca-${ORG_ENCODE},apigee-metrics-apigee-telemetry,apigee-open-telemetry-collector-apigee-telemetry,apigee-logger-apigee-telemetry
    
    for ENV in ${ENVS//,/ }
    do
        ENV_SHORT_NAME=$(echo $ENV | head -c 15)
        ENCODE=$(echo -n $ORG:$ENV | shasum -a 256 | head -c 7)
        ENV_ENCODE=$(echo "$ORG_SHORT_NAME-$ENV_SHORT_NAME-$ENCODE")
        NAMES+=,apigee-synchronizer-${ENV_ENCODE},apigee-runtime-${ENV_ENCODE}
    done
    
    echo $NAMES
    
  7. 執行指令碼,產生要繫結政策的服務帳戶名稱清單:
    ./generate-encoded-sas.sh

    輸出內容應為以半形逗號分隔的 Kubernetes 服務帳戶名稱清單,類似以下範例:

    ./generate-encoded-sas.sh
    apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
    apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
    rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
    assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
    44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
    agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
    -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
    en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
    try,apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhy
    bridorg-dev-ee52aca,apigee-synchronizer-myhybridorg-prod-2d0221c,ap
    igee-runtime-myhybridorg-prod-2d0221c
  8. 將輸出文字複製並分成多份清單,一份列出 org 服務帳戶名稱,另一份列出各環境的 env 服務帳戶名稱。機構服務帳戶會先顯示在輸出清單中,最多 apigee-logger-apigee-telemetry 個。

    上一個範例中的 org 服務名稱清單:

    apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
    apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
    rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
    assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
    44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
    agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
    -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
    en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
    try

    env 服務帳戶名稱的格式為 apigee-synchronizer-ORG_NAME-ENV_NAME-HASH_TEXT 和 apigee-runtime-ORG_NAME-ENV_NAME-HASH_TEXT。請為每個環境建立個別清單。舉例來說,上一個範例的輸出內容可以分成以下兩個清單:

    dev環境:

    apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhybrid
    org-dev-ee52aca

    prod環境:

    apigee-synchronizer-myhybridorg-prod-2d0221c,apigee-runtime-myhybri
    dorg-prod-2d0221c
  9. 使用政策建立 Vault 角色,繫結組織專屬的 Apigee 服務帳戶:
    vault write auth/kubernetes/role/apigee-orgsakeys \
        bound_service_account_names=LIST_OF_ORG_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-orgsakeys-auth \
        ttl=1m
    
  10. 為每個環境的服務帳戶金鑰建立 Vault 角色:
    vault write auth/kubernetes/role/apigee-envsakeys-ENV_NAME \
        bound_service_account_names=LIST_OF_ENV_NAME_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-envsakeys-ENV_NAME-auth \ 
        ttl=1m
    

    對每個環境重複這個步驟。

建立 SecretProviderClass 物件

SecretProviderClass 資源會告知 CSI 驅動程式,在要求 Secret 時要與哪個供應商通訊。服務帳戶金鑰必須透過這個物件設定。下表列出 Apigee Hybrid 預期的檔案名稱 (objectNames):

服務帳戶預期的 Secret 檔案名稱
Cassandra 備份 cassandraBackup
還原 Cassandra cassandraRestore
連結代理 connectAgent
Logger logger
MART mart
指標 metrics
營利
(如果使用 Apigee Hybrid 營利功能)
mint
執行階段 runtime
同步處理工具 synchronizer
UDCA udca
Watcher watcher
  1. 請使用下列 SecretProviderClass 範本,為組織專屬密鑰設定這項資源:
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
        name: apigee-orgsakeys-spc
    spec:
        provider: vault
        parameters:
            roleName: apigee-orgsakeys
            vaultAddress: VAULT_ADDRESS
            # "objectName" is an alias used within the SecretProviderClass to reference
            # that specific secret. This will also be the filename containing the secret.
            # Apigee Hybrid expects these exact values so they must not be changed.
            # "secretPath" is the path in Vault where the secret should be retrieved.
            # "secretKey" is the key within the Vault secret response to extract a value from.
            objects: |
                - objectName: "cassandraBackup"
                    secretPath: ""
                    secretKey: ""
                - objectName: "cassandraRestore"
                    secretPath: ""
                    secretKey: ""
                - objectName: "connectAgent"
                    secretPath: ""
                    secretKey: ""
                - objectName: "logger"
                    secretPath: ""
                    secretKey: ""
                - objectName: "mart"
                    secretPath: ""
                    secretKey: ""
                - objectName: "metrics"
                    secretPath: ""
                    secretKey: ""
                - objectName: "mint"
                    secretPath: ""
                    secretKey: ""
                - objectName: "udca"
                    secretPath: ""
                    secretKey: ""
                - objectName: "watcher"
                    secretPath: ""
                    secretKey: ""
    

    VAULT_ADDRESS 是 Vault 伺服器執行的端點。如果 Vault 與 Apigee 在同一個叢集中執行,格式通常會是 http://vault.$APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT。

    將範本儲存至名為 spc-org.yaml 的檔案。

  2. 將機構專屬的 SecretProviderClass 套用至 Apigee 命名空間:
    kubectl -n $APIGEE_NAMESPACE apply -f spc-org.yaml
  3. 請使用下列 SecretProviderClass 範本,為各環境設定這項資源,以便處理環境專屬密鑰。針對每個環境重複這個步驟:
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
        name: apigee-envsakeys-ENV_NAME-spc
    spec:
        provider: vault
        parameters:
            roleName: apigee-envsakeys-ENV_NAME
            vaultAddress: VAULT_ADDRESS
            # "objectName" is an alias used within the SecretProviderClass to reference
            # that specific secret. This will also be the filename containing the secret.
            # Apigee Hybrid expects these exact values so they must not be changed.
            # "secretPath" is the path in Vault where the secret should be retrieved.
            # "secretKey" is the key within the Vault secret response to extract a value from.
            objects: |
                - objectName: "runtime"
                    secretPath: ""
                    secretKey: ""
                - objectName: "synchronizer"
                    secretPath: ""
                    secretKey: ""
                - objectName: "udca"
                    secretPath: ""
                    secretKey: ""
    

    VAULT_ADDRESS 是 Vault 伺服器執行的端點。如果 Vault 與 Apigee 在同一個叢集和命名空間中執行,格式通常會是 http://vault.$APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT。

    將範本儲存至名為 spc-env-ENV_NAME.yaml 的檔案。

  4. 針對每個環境,將環境專屬的 SecretProviderClass 套用至 Apigee 命名空間:
    kubectl -n $APIGEE_NAMESPACE apply -f spc-env-ENV_NAME.yaml

    對每個環境重複這個步驟。

  5. 選用:建立 SecretProviderClass 物件後,您可以刪除服務帳戶 JSON 檔案。

GKE 適用的 WIF

準備設定 Workload Identity Federation for GKE

  1. 確認覆寫檔案中已啟用 Workload Identity Federation for GKE。請在覆寫檔案中啟用下列屬性。
    • 必須提供namespace。例如:
      instanceID: "hybrid-instance-1"
      namespace: "apigee"
      
    • 如果您為所有元件使用單一服務帳戶 (非正式環境),請使用 gcp.workloadIdentity.gsa 指定該帳戶。例如:
        gcp:
          workloadIdentity:
            enabled: true
            gsa: "apigee-non-prod@my-hybrid-project.iam.gserviceaccount.com"
        
    • 如果您為每個元件使用不同的服務帳戶 (正式版安裝),請使用元件的 gsa 屬性指定服務帳戶。例如:
        logger:
          gsa: "apigee-logger@my-hybrid-project.iam.gserviceaccount.com"
        

    請參閱:gcp.workloadIdentity.enabled。

  2. 使用下列指令,確認目前的 gcloud 設定已設為 Google Cloud 專案 ID:
    gcloud config get project
  3. 視需要設定目前的 gcloud 設定:

    gcloud config set project $PROJECT_ID
  4. 確認 GKE 叢集已啟用 Workload Identity Federation for GKE。在步驟 1:建立叢集中,步驟 6 是啟用 Workload Identity Federation for GKE。使用下列指令確認是否已啟用:

    地區性叢集

    gcloud container clusters describe $CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten 'workloadIdentityConfig'

    區域叢集

    gcloud container clusters describe $CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten 'workloadIdentityConfig'

    輸出內容應如下所示:

      ---
      workloadPool: $PROJECT_ID.svc.id.goog

    如果結果顯示 null,請執行下列指令,為叢集啟用 Workload Identity Federation for GKE:

    地區性叢集

    gcloud container clusters update $CLUSTER_NAME \
      --workload-pool=$PROJECT_ID.svc.id.goog \
      --project $PROJECT_ID \
      --region $CLUSTER_LOCATION

    區域叢集

    gcloud container clusters update  $CLUSTER_NAME \
      --workload-pool=$PROJECT_ID.svc.id.goog \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID
  5. 使用下列指令,為各個節點集區啟用 Workload Identity Federation for GKE。每個節點最多可能需要 30 分鐘才能完成這項作業:

    地區性叢集

    gcloud container node-pools update NODE_POOL_NAME \
      --cluster=$CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --workload-metadata=GKE_METADATA

    區域叢集

    gcloud container node-pools update NODE_POOL_NAME \
      --cluster=$CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --workload-metadata=GKE_METADATA

    其中 NODE_POOL_NAME 是各節點集區的名稱。在大多數 Apigee hybrid 安裝中,兩個預設節點集區分別命名為 apigee-data 和 apigee-runtime。

  6. 使用下列指令,確認節點集區已啟用 Workload Identity Federation for GKE:

    地區性叢集

    gcloud container node-pools describe apigee-data \
      --cluster $CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"
    gcloud container node-pools describe apigee-runtime \
      --cluster $CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"

    區域叢集

    gcloud container node-pools describe apigee-data \
      --cluster $CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"
    gcloud container node-pools describe apigee-runtime \
      --cluster $CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"

    輸出內容應大致如下:

    ---
    diskSizeGb: 100
    diskType: pd-standard
    ...
    workloadMetadataConfig:
      mode: GKE_METADATA
        

其他平台上的 WIF

在 GKE 以外的平台使用 Workload Identity Federation 時,您可以透過下列方法設定 SA 驗證:

  • Kubernetes Secret
  • 服務帳戶 JSON 檔案
  • 保管箱

在下列操作說明中,請根據您使用的驗證方式選擇分頁。

這項程序會使用「步驟 2:下載 Apigee Helm 圖表」中定義的下列兩個環境變數。這些變數為選用。如果未定義,請在程式碼範例中將每個變數替換為適當的目錄路徑。

如要在 AKS 上安裝,請務必啟用 OpenID Connect (OIDC) 核發者。您必須啟用這項功能,Workload Identity Federation 才能存取叢集的 OpenID Connect 中繼資料和 JSON Web Key Set (JWKS)。

將叢集設為使用 Workload Identity Federation。

  1. 使用下列指令,確認目前的 gcloud 設定已設為 Google Cloud 專案 ID:
    gcloud config get project
  2. 視需要設定目前的 gcloud 設定:

    gcloud config set project $PROJECT_ID
  3. 啟用 Security Token Service API:

    使用下列指令,確認已啟用 Security Token Service API:

    gcloud services list --enabled --project $PROJECT_ID | grep sts.googleapis.com

    如果 API 尚未啟用:

    控制台

    啟用 Security Token Service API (如果尚未啟用)。

    啟用 API 所需的角色

    您必須具備 serviceusage.services.enable 權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    啟用 API

    指令列

    使用下列指令啟用 API:

    gcloud services enable sts.googleapis.com --project $PROJECT_ID
  4. 建立 workload identity pool 和提供者。

    必要的角色

    如要取得設定 Workload Identity Federation 所需的權限,請要求管理員授予您專案的下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

    您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

    或者,IAM 擁有者 (roles/owner) 基本角色也包含設定身分聯盟的權限。請勿在正式環境中授予基本角色,但可以在開發或測試環境中授予。

    如要建立 workload identity pool 和提供者,請按照下列步驟操作:

    1. 判斷 AKS 叢集的核發者網址:

      AKS

      az aks show -n CLUSTER_NAME -g RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv

      更改下列內容:

      • CLUSTER_NAME:叢集名稱。
      • RESOURCE_GROUP:叢集的資源群組。

      指令會輸出核發者網址。您會在後續步驟中用到核發者網址。

      如果指令未傳回核發者網址,請確認您已啟用 OIDC 核發者功能。

      EKS

      aws eks describe-cluster --name CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text
      

      將 CLUSTER_NAME 替換為叢集名稱。

      指令會輸出核發者網址。您在後續步驟中會需要核發者網址。

      其他 Kubernetes

      連線至 Kubernetes 叢集,並使用「kubectl」判斷叢集的核發者網址:

      kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
      

      您在後續步驟中會需要核發者網址。

    2. 選用:如果 OIDC 發行者不開放公開存取,請下載叢集的 JSON Web Key Set (JWKS):
      kubectl get --raw /openid/v1/jwks > cluster-jwks.json

      如要確認 OIDC 供應商是否公開,您應該能使用 CURL 指令存取供應商網址,並收到 200 回應。

    3. 建立新的 workload identity pool:
      gcloud iam workload-identity-pools create POOL_ID \
          --location="global" \
          --description="DESCRIPTION" \
          --display-name="DISPLAY_NAME"
      

      更改下列內容:

      • POOL_ID:集區的專屬 ID。
      • DISPLAY_NAME:(選用) 集區名稱。
      • DESCRIPTION:(選用) 您選擇的集區說明。授予集區身分的存取權時,會顯示這段說明。

      例如:

      gcloud iam workload-identity-pools create my-wi-pool --display-name="My workload pool" --description="My workload pool description"
    4. 將叢集新增為 workload identity pool 提供者。根據 OIDC 核發者是否可公開存取,選擇建立提供者的指令:

      可公開存取

      如果 OIDC 核發者可公開存取,請使用下列指令建立提供者:

      gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
          --location="global" \
          --workload-identity-pool="POOL_ID" \
          --issuer-uri="ISSUER" \
          --attribute-mapping="google.subject=assertion.sub"

      不公開

      如果 OIDC 核發者無法公開存取,請使用下列指令建立提供者:

      gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
          --location="global" \
          --workload-identity-pool="POOL_ID" \
          --issuer-uri="ISSUER" \
          --jwks-file="cluster-jwks.json" \
          --attribute-mapping="google.subject=assertion.sub"

      更改下列內容:

      • WORKLOAD_PROVIDER_ID:您選擇的不重複 workload identity pool 提供者 ID。
      • POOL_ID:您先前建立的 workload identity pool ID。
      • ISSUER:使用先前確定的核發者網址做為核發者 URI。

      attribute-mapping="google.subject=assertion.sub" 會將 Kubernetes 主體對應至 IAM 主體。

建立憑證設定檔

如要部署可存取 Google Cloud 資源的 Kubernetes 工作負載,請先為每個 IAM 服務帳戶建立憑證設定檔:

  1. 使用下列指令,列出 IAM 服務帳戶 (也稱為「Google 服務帳戶」):
    gcloud iam service-accounts list --project $PROJECT_ID

    您需要為下列 IAM 服務帳戶建立憑證設定檔:

    正式環境

    正式環境:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@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
    

    如果您在 v1.15.1 以上版本使用 Apigee hybrid 營利功能,也需要為 apigee-mint-task-scheduler 服務帳戶建立憑證設定檔。

    DISPLAY NAME                 EMAIL                                                              DISABLED
    ...
    apigee-mint-task-scheduler   apigee-mint-task-scheduler@my_project_id.iam.gserviceaccount.com   False
    ...

    非正式環境

    非正式環境:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    
  2. 為上列各個 IAM 服務帳戶建立憑證設定檔。

    WIF:Secret

    這種方法會使用儲存在 Kubernetes Secret 中的憑證設定。在步驟 7:建立覆寫中建構覆寫檔案時,請使用 serviceAccountRef 或 envs.serviceAccountRefs 屬性提供各服務帳戶的 Secret 名稱。

    建立憑證設定檔

    正式環境

    您需要為下列服務帳戶建立憑證設定檔:

    • apigee-cassandra
    • apigee-mart
    • apigee-metrics
    • apigee-mint-task-scheduler 如果您使用 Apigee Hybrid 營利功能。
    • apigee-runtime
    • apigee-synchronizer
    • apigee-udca
    1. 建立憑證設定檔的目錄。目錄名稱不限。在本程序中,目錄名稱為 credential-configurations:
      mkdir $APIGEE_HELM_CHARTS_HOME/credential-configurations
    2. 為 apigee-cassandra 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-cassandra-credential-configuration.json
      

      其中:

      • PROJECT_NUMBER:workload identity pool 所在專案的專案編號。請務必使用專案編號,而非專案 ID。
      • POOL_ID:workload identity pool 的 ID
      • WORKLOAD_PROVIDER_ID:workload identity pool 提供者的 ID
    3. 為 apigee-mart 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mart@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-mart-credential-configuration.json
      
    4. 為 apigee-metrics 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-metrics-credential-configuration.json
      
    5. 為 apigee-runtime 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-runtime@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-runtime-credential-configuration.json
      
    6. 為 apigee-synchronizer 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-synchronizer-credential-configuration.json
      
    7. 為 apigee-udca 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-udca@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-udca-credential-configuration.json
      
    8. 為 apigee-watcher 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-watcher-credential-configuration.json
      
    9. 如果您使用 Apigee hybrid 的營利功能,也需要為 apigee-mint-task-scheduler 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mint-task-scheduler@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-mint-task-scheduler-credential-configuration.json
      

    非正式環境

    1. 建立憑證設定檔的目錄。目錄名稱不限。在本程序中,目錄名稱為 credential-configurations:
      mkdir $APIGEE_HELM_CHARTS_HOME/credential-configurations
    2. 使用下列指令,在 credential-configurations 目錄中為 apigee-non-prod 服務帳戶建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-non-prod-credential-configuration.json
      

      其中:

      • PROJECT_NUMBER:workload identity pool 所在專案的專案編號。請務必使用專案編號,而非專案 ID。
      • POOL_ID:workload identity pool 的 ID
      • WORKLOAD_PROVIDER_ID:workload identity pool 提供者的 ID

    建立 Kubernetes Secret

    建立 Kubernetes Secret,儲存各服務帳戶的憑證設定檔。

    下列程式碼範例中的 kubectl create secret 指令結構如下:

    kubectl create secret generic SECRET_NAME \
            --from-file="client_secret.json=PATH_TO_CREDENTIAL_CONFIGURATION_FILE" \
            -n APIGEE_NAMESPACE

    正式環境

    1. 建立 apigee-cassandra 的密鑰檔案:
      kubectl create secret generic apigee-cassandra-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-cassandra.json" \
        -n APIGEE_NAMESPACE
      
    2. 建立 apigee-mart 的密鑰檔案:
      kubectl create secret generic apigee-mart-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-mart.json" \
        -n APIGEE_NAMESPACE
      
    3. 建立 apigee-metrics 的密鑰檔案:
      kubectl create secret generic apigee-metrics-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-metrics.json" \
        -n APIGEE_NAMESPACE
      
    4. 建立 apigee-runtime 的密鑰檔案:
      kubectl create secret generic apigee-runtime-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-runtime.json" \
        -n APIGEE_NAMESPACE
    5. 建立 apigee-synchronizer 的密鑰檔案:
      kubectl create secret generic apigee-synchronizer-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-synchronizer.json" \
        -n APIGEE_NAMESPACE
      
    6. 建立 apigee-udca 的 Secret 檔案:
      kubectl create secret generic apigee-udca-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-udca.json" \
        -n APIGEE_NAMESPACE
      
    7. 建立 apigee-watcher 的密鑰檔案:
      kubectl create secret generic apigee-watcher-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-watcher.json" \
        -n APIGEE_NAMESPACE
      
    8. 如果您使用 Apigee Hybrid 的營利功能,請為 apigee-mint-task-scheduler 建立 Secret 檔案:
      kubectl create secret generic apigee-mint-task-scheduler-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-mint-task-scheduler.json" \
        -n APIGEE_NAMESPACE
      
    為 apigee-non-prod 建立 Secret 檔案:

    非正式環境

    kubectl create secret generic apigee-non-prod-svc-account \
            --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-non-prod.json" \
            -n APIGEE_NAMESPACE

    WIF:檔案

    這個方法會使用憑證設定檔,取代 Google 服務帳戶金鑰檔案。在步驟 7:建立覆寫中建構覆寫檔案時,請為每個 serviceAccountPath 或 envs.serviceAccountPaths 屬性提供憑證設定檔的路徑。

    正式環境

    您必須在對應的圖表目錄中建立憑證設定檔:

    服務帳戶 Apigee Helm chart 目錄
    apigee-cassandra apigee-datastore/
    apigee-mart apigee-org/
    apigee-metrics apigee-telemetry/
    apigee-mint-task-scheduler
    (如果使用 Apigee Hybrid 的營利功能)
    apigee-org/
    apigee-runtime apigee-env/
    apigee-synchronizer apigee-env/
    apigee-udca apigee-org/
    apigee-env/
    apigee-watcher apigee-org/

    使用下列指令建立憑證設定檔:

    • apigee-cassandra:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-cassandra-credential-configuration.json
      

      其中:

      • PROJECT_NUMBER:workload identity pool 所在專案的專案編號。請務必使用專案編號,而非專案 ID。
      • POOL_ID:workload identity pool 的 ID
      • WORKLOAD_PROVIDER_ID:workload identity pool 提供者的 ID
    • apigee-mart:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mart@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-mart-credential-configuration.json
      
    • apigee-metrics:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-telemetry/apigee-metrics-credential-configuration.json
      
    • apigee-runtime:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-runtime@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-env/apigee-runtime-credential-configuration.json
      
    • apigee-synchronizer:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-env/apigee-synchronizer-credential-configuration.json
      
    • apigee-udca:

      apigee-org 和 apigee-env 圖表都會使用 apigee-udca 服務帳戶。

      1. 在 apigee-org 圖表目錄中建立憑證設定檔。
        gcloud iam workload-identity-pools create-cred-config \
          projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
          --service-account=apigee-udca@$PROJECT_ID.iam.gserviceaccount.com \
          --credential-source-file=/var/run/service-account/token \
          --credential-source-type=text \
          --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-udca-credential-configuration.json
        
      2. 將憑證設定檔複製到 apigee-env 圖表目錄。
        cp $APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-udca-credential-configuration.json \
          $APIGEE_HELM_CHARTS_HOME/apigee-env/apigee-udca-credential-configuration.json
        
    • apigee-watcher:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-watcher-credential-configuration.json
      
    • 如果您使用 href="monetization-for-hybrid">Apigee hybrid 營利功能,則也需要為 apigee-mint-task-scheduler 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mint-task-scheduler@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-mint-task-scheduler-credential-configuration.json
      

    非正式環境

    您必須建立憑證設定檔,並複製到對應的圖表目錄:

    服務帳戶 Apigee Helm 圖表
    apigee-non-prod apigee-datastore/
    apigee-telemetry/
    apigee-org/
    apigee-env/
    1. 使用下列指令,在 apigee-datastore 圖表目錄中建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
      --service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com \
      --credential-source-file=/var/run/service-account/token \
      --credential-source-type=text \
      --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-non-prod-credential-configuration.json
      

      其中:

      • PROJECT_NUMBER:workload identity pool 所在專案的專案編號。請務必使用專案編號,而非專案 ID。
      • POOL_ID:workload identity pool 的 ID
      • WORKLOAD_PROVIDER_ID:workload identity pool 提供者的 ID
    2. 將憑證設定檔複製到 apigee-env、apigee-org/ 和 apigee-telemetry/ 圖表目錄。
      cp $APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-non-prod-credential-configuration.json \
        $APIGEE_HELM_CHARTS_HOME/apigee-env/apigee-non-prod-credential-configuration.json
      cp $APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-non-prod-credential-configuration.json \
        $APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-non-prod-credential-configuration.json
      cp $APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-non-prod-credential-configuration.json \
        $APIGEE_HELM_CHARTS_HOME/apigee-telemetry/apigee-non-prod-credential-configuration.json
      

    WIF:保管箱

    這種方法會使用儲存在外部 Secret Manager Hashicorp Vault 中的憑證設定。在步驟 7:建立覆寫中建構覆寫檔案時,請使用 serviceAccountSecretProviderClass 或 envs.serviceAccountSecretProviderClass 屬性提供組織層級和環境層級的 Vault 密鑰。

    建立憑證設定檔

    正式環境

    您需要為下列服務帳戶建立憑證設定檔:

    • apigee-cassandra
    • apigee-mart
    • apigee-metrics
    • apigee-mint-task-scheduler (如果使用 Apigee Hybrid 的營利功能)
    • apigee-runtime
    • apigee-synchronizer
    • apigee-udca
    1. 建立憑證設定檔的目錄。目錄名稱不限。在本程序中,目錄名稱為 credential-configurations:
      mkdir $APIGEE_HELM_CHARTS_HOME/credential-configurations
    2. 為 apigee-cassandra 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-cassandra-credential-configuration.json
      

      其中:

      • PROJECT_NUMBER:workload identity pool 所在專案的專案編號。請務必使用專案編號,而非專案 ID。
      • POOL_ID:workload identity pool 的 ID
      • WORKLOAD_PROVIDER_ID:workload identity pool 提供者的 ID
    3. 為 apigee-mart 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mart@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-mart-credential-configuration.json
      
    4. 為 apigee-metrics 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-metrics-credential-configuration.json
      
    5. 為 apigee-runtime 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-runtime@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-runtime-credential-configuration.json
      
    6. 為 apigee-synchronizer 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-synchronizer-credential-configuration.json
      
    7. 為 apigee-udca 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-udca@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-udca-credential-configuration.json
      
    8. 為 apigee-watcher 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-watcher-credential-configuration.json
      
    9. 如果您使用 Apigee hybrid 的營利功能,也需要為 apigee-mint-task-scheduler 建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mint-task-scheduler@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-mint-task-scheduler-credential-configuration.json
      

    非正式環境

    1. 建立憑證設定檔的目錄。目錄名稱不限。在本程序中,目錄名稱為 credential-configurations:
      mkdir $APIGEE_HELM_CHARTS_HOME/credential-configurations
    2. 使用下列指令,在 credential-configurations 目錄中為 apigee-non-prod 服務帳戶建立憑證設定檔:
      gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-non-prod-credential-configuration.json
      

      其中:

      • PROJECT_NUMBER:workload identity pool 所在專案的專案編號。請務必使用專案編號,而非專案 ID。 "
      • POOL_ID:workload identity pool 的 ID
      • WORKLOAD_PROVIDER_ID:workload identity pool 提供者的 ID

    安裝 CSI 驅動程式和 Vault 供應商

    如果您尚未透過 Helm 在叢集上安裝 CSI 驅動程式,請按照「Secrets Store CSI 驅動程式:安裝」中的操作說明進行。詳情請參閱 Vault 說明文件中的「安裝 Vault CSI 供應器」。

    如要瞭解 Apigee hybrid 支援的最低 CSI 驅動程式版本,請參閱「Apigee hybrid 支援的平台和版本」。

    建立 Vault 密鑰、政策和角色

    使用 Vault UI 或 API 建立密鑰,並授予權限給 Apigee hybrid 使用的 Kubernetes 服務帳戶,以便讀取這些密鑰。

    1. 請按照下列格式建立組織和環境專屬 Secret:
      密鑰Secret 資料
      secret/data/apigee/orgsakeys
      {
        "cassandraBackup": "***",
        "cassandraRestore": "***",
        "connectAgent": "***",
        "logger": "***",
        "mart": "***",
        "metrics": "***",
        "mint": "***",
        "udca": "***",
        "watcher": "***"
      }
      secret/data/apigee/envsakeys-ENV_NAME
      {
        "runtime": "***",
        "synchronizer": "***",
        "udca": "***".
          }

      正式環境

      將每組中的 "***" 替換為 Google 服務帳戶憑證設定檔的內容,該帳戶對應至 Apigee 元件。apigee-cassandra-backup 和 apigee-cassandra-restore 都使用 apigee-cassandra 服務帳戶。例如:

      {
        "cassandraBackup": "{
          "universe_domain": "googleapis.com",
          "type": "external_account:,"
          "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider",
          "subject_token_type": "urn:ietf:params:oauth: token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "service
          "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-cassandra@my-project.iam.gserviceaccount.com:generateAccessToken",
          "credential_source": {
            "file": "/var/run/service-account/token",
            "format": {
              "type": "text"
            }
          }
        }",
        "cassandraRestore":...
      ...
      }

      非正式環境

      將每組中的 "***" 替換為 apigee-non-prod 服務帳戶的憑證設定檔內容。apigee-cassandra-backup 和 apigee-cassandra-restore 都使用 apigee-cassandra 服務帳戶。例如:

      {
        "cassandraBackup": "{
          "universe_domain": "googleapis.com",
          "type": "external_account:,"
          "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider",
          "subject_token_type": "urn:ietf:params:oauth: token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "service
          "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-non-prod@my-project.iam.gserviceaccount.com:generateAccessToken",
          "credential_source": {
            "file": "/var/run/service-account/token",
            "format": {
              "type": "text"
            }
          }
        }",
        "cassandraRestore":...
      ...
      }
    2. 授予組織密鑰的存取權。建立名為 orgsakeys-auth-policy.txt 的文字檔,並在當中加入下列內容:
      path "secret/data/apigee/orgsakeys" {
        capabilities = ["read"]
      }
    3. 在 Vault 中建立政策,授予組織 Secret 的存取權:
      vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
    4. 針對每個環境,建立名為 envsakeys-ENV_NAME-auth-policy.txt 的文字檔,並在當中加入下列內容:
      path "secret/data/apigee/envsakeys-ENV_NAME" {
        capabilities = ["read"]
      }

      為每個環境重複這個步驟。

    5. 在 Vault 中建立政策,授予環境密鑰的存取權:
      vault policy write apigee-envsakeys-ENV_NAME-auth envsakeys-ENV_NAME-auth-policy.txt

      為每個環境重複這個步驟。

    6. 建立名為 generate-encoded-sas.sh 的指令碼,並加入以下內容:
      # generate-encoded-sas.sh
      
      ORG=$APIGEE_ORG            # Apigee organization name
      ENVS=$APIGEE_ENV_LIST      # comma separated env names, for example: dev,prod
      
      ORG_SHORT_NAME=$(echo $ORG | head -c 15)
      ENCODE=$(echo -n $ORG | shasum -a 256 | head -c 7)
      ORG_ENCODE=$(echo "$ORG_SHORT_NAME-$ENCODE")
      NAMES=apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-${ORG_ENCODE},apigee-cassandra-schema-val-${ORG_ENCODE},apigee-cassandra-user-setup-${ORG_ENCODE},apigee-mart-${ORG_ENCODE},apigee-mint-task-scheduler-${ORG_ENCODE},apigee-connect-agent-${ORG_ENCODE},apigee-watcher-${ORG_ENCODE},apigee-udca-${ORG_ENCODE},apigee-metrics-apigee-telemetry,apigee-open-telemetry-collector-apigee-telemetry,apigee-logger-apigee-telemetry
      
      for ENV in ${ENVS//,/ }
        do
          ENV_SHORT_NAME=$(echo $ENV | head -c 15)
          ENCODE=$(echo -n $ORG:$ENV | shasum -a 256 | head -c 7)
          ENV_ENCODE=$(echo "$ORG_SHORT_NAME-$ENV_SHORT_NAME-$ENCODE")
          NAMES+=,apigee-synchronizer-${ENV_ENCODE},apigee-runtime-${ENV_ENCODE}
        done
      
      echo $NAMES
      
    7. 執行指令碼,產生要繫結政策的服務帳戶名稱清單:
      ./generate-encoded-sas.sh

      輸出內容應為以半形逗號分隔的 Kubernetes 服務帳戶名稱清單,類似以下範例:

      ./generate-encoded-sas.sh
      apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
      apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
      rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
      assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
      44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
      agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
      -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
      en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
      try,apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhy
      bridorg-dev-ee52aca,apigee-synchronizer-myhybridorg-prod-2d0221c,ap
      igee-runtime-myhybridorg-prod-2d0221c
    8. 將輸出文字複製並分成多份清單,一份列出 org 服務帳戶名稱,另一份列出各環境的 env 服務帳戶名稱。org 服務帳戶會先顯示在輸出清單中,最多 apigee-logger-apigee-telemetry 個。

      上一個範例中的 org 服務名稱清單:

      apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
      apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
      rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
      assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
      44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
      agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
      -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
      en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
      try

      env 服務帳戶名稱的格式為 apigee-synchronizer-ORG_NAME-ENV_NAME-HASH_TEXT 和 apigee-runtime-ORG_NAME-ENV_NAME-HASH_TEXT。請為每個環境建立個別清單。舉例來說,上一個範例的輸出內容可以分成以下兩個清單:

      dev環境:

      apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhybrid
      org-dev-ee52aca

      prod環境:

      apigee-synchronizer-myhybridorg-prod-2d0221c,apigee-runtime-myhybri
      dorg-prod-2d0221c
    9. 使用政策建立 Vault 角色,繫結組織專屬的 Apigee 服務帳戶:
      vault write auth/kubernetes/role/apigee-orgsakeys \
        bound_service_account_names=LIST_OF_ORG_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-orgsakeys-auth \
        ttl=1m
          
    10. 為每個環境的服務帳戶金鑰建立 Vault 角色:
      vault write auth/kubernetes/role/apigee-envsakeys-ENV_NAME \
        bound_service_account_names=LIST_OF_ENV_NAME_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-envsakeys-ENV_NAME-auth \ 
        ttl=1m
      

      為每個環境重複這個步驟。

    建立 SecretProviderClass 物件

    SecretProviderClass 資源會告知 CSI 驅動程式,在要求 Secret 時要與哪個供應商通訊。服務帳戶金鑰必須透過這個物件設定。下表列出 Apigee Hybrid 預期的檔案名稱 (objectNames):

    服務帳戶預期的 Secret 檔案名稱
    Cassandra 備份 cassandraBackup
    還原 Cassandra cassandraRestore
    連結代理 connectAgent
    MART mart
    指標 metrics
    營利
    (如果使用 Apigee Hybrid 營利功能)
    mint
    執行階段 runtime
    同步處理工具 synchronizer
    UDCA udca
    Watcher watcher
    1. 使用下列 SecretProviderClass 範本,為組織專屬密鑰設定這項資源:
      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: apigee-orgsakeys-spc
      spec:
        provider: vault
        parameters:
          roleName: apigee-orgsakeys
          vaultAddress: VAULT_ADDRESS
          # "objectName" is an alias used within the SecretProviderClass to reference
          # that specific secret. This will also be the filename containing the secret.
          # Apigee Hybrid expects these exact values so they must not be changed.
          # "secretPath" is the path in Vault where the secret should be retrieved.
          # "secretKey" is the key within the Vault secret response to extract a value from.
            objects: |
            - objectName: "cassandraBackup"
              secretPath: ""
              secretKey: ""
            - objectName: "cassandraRestore"
              secretPath: ""
              secretKey: ""
            - objectName: "connectAgent"
              secretPath: ""
              secretKey: ""
            - objectName: "logger"
              secretPath: ""
              secretKey: ""
            - objectName: "mart"
              secretPath: ""
              secretKey: ""
            - objectName: "metrics"
              secretPath: ""
              secretKey: ""
            - objectName: "mint"
              secretPath: ""
              secretKey: ""
            - objectName: "udca"
              secretPath: ""
              secretKey: ""
            - objectName: "watcher"
              secretPath: ""
              secretKey: ""
      

      VAULT_ADDRESS 是 Vault 伺服器執行的端點。如果 Vault 與 Apigee 在同一個叢集內執行,格式通常會是 http://vault.$APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT。

      將範本儲存至名為 spc-org.yaml 的檔案。

    2. 將機構專屬的 SecretProviderClass 套用至 Apigee 命名空間:
      kubectl -n $APIGEE_NAMESPACE apply -f spc-org.yaml
    3. 請使用下列 SecretProviderClass 範本,為各環境設定這項資源,以便處理環境專屬密鑰。為每個環境重複這個步驟:
      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: apigee-envsakeys-ENV_NAME-spc
      spec:
        provider: vault
        parameters:
          roleName: apigee-envsakeys-ENV_NAME
          vaultAddress: VAULT_ADDRESS
          # "objectName" is an alias used within the SecretProviderClass to reference
          # that specific secret. This will also be the filename containing the secret.
          # Apigee Hybrid expects these exact values so they must not be changed.
          # "secretPath" is the path in Vault where the secret should be retrieved.
          # "secretKey" is the key within the Vault secret response to extract a value from.
          objects: |
            - objectName: "runtime"
              secretPath: ""
              secretKey: ""
            - objectName: "synchronizer"
              secretPath: ""
              secretKey: ""
            - objectName: "udca"
              secretPath: ""
              secretKey: ""
          

      VAULT_ADDRESS 是 Vault 伺服器執行的端點。如果 Vault 與 Apigee 在同一個叢集和命名空間中執行,格式通常會是 http://vault.$APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT。

      將範本儲存至名為 spc-env-ENV_NAME.yaml 的檔案。

    4. 針對每個環境,將環境專屬的 SecretProviderClass 套用至 Apigee 命名空間:
      kubectl -n $APIGEE_NAMESPACE apply -f spc-env-ENV_NAME.yaml

      為每個環境重複這個步驟。

下一步

1 2 3 4 5 (下一步) 步驟 6:建立 TLS 憑證 7 8 9 10 11