为 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 后,Hybrid 组件可与 Kubernetes 服务账号交互。

不使用 Workload Identity 的 Apigee Hybrid 中的 Google 服务账号

在不使用 Workload Identity 的情况下,您必须使用对证书文件或 Kubernetes Secret 的引用将 Google 服务账号关联到 overrides.yaml 文件中的每个组件。例如:

这些步骤中使用的环境变量

这些过程使用以下环境变量。请在命令 shell 中设置这些变量,或在代码示例中将它们替换为实际值:

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • ORG_NAME:您的 Apigee 组织的名称。
  • ENV_NAME:Apigee 环境的名称。
  • NAMESPACE:Apigee 命名空间的名称。通常为 apigee
  • CLUSTER_NAME:您的集群的名称。
  • CLUSTER_LOCATION:集群的区域或可用区,例如 us-west1
  • APIGEECTL_HOMEapigeectl 的安装目录。
  • 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 服务账号

Google 服务账号是在安装期间为许多 Apigee Hybrid 组件创建的。此过程用于验证 Google 服务账号,并创建所需的任何账号。

  1. 使用以下命令检查项目的 Google 服务账号的名称:
    gcloud iam service-accounts list --project $PROJECT_ID

    输出应如下所示:

    Prod

    对于非生产环境:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@my_project_id.iam.gserviceaccount.com     False
    apigee-logger        apigee-logger@my_project_id.iam.gserviceaccount.com        False
    apigee-mart          apigee-mart@my_project_id.iam.gserviceaccount.com          False
    apigee-metrics       apigee-metrics@my_project_id.iam.gserviceaccount.com       False
    apigee-runtime       apigee-runtime@my_project_id.iam.gserviceaccount.com       False
    apigee-synchronizer  apigee-synchronizer@my_project_id.iam.gserviceaccount.com  False
    apigee-udca          apigee-udca@my_project_id.iam.gserviceaccount.com          False
    apigee-watcher       apigee-watcher@my_project_id.iam.gserviceaccount.com       False
    

    非生产

    对于非生产环境:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    

    如果您需要为项目创建 Google 服务账号,则可以使用以下两种方法:

    • apigeectl/tools/ 目录中使用 Apigee 随附的 create-service-account 工具。此工具可以使用单个命令创建所有服务账号,也可以单独创建它们。
    • 使用 gcloud iam service-accounts create 命令一次创建一个服务账号,并使用 gcloud projects add-iam-policy-binding 命令为每个服务账号分配适当的角色。此方法要求您单独创建每个服务账号,但您可以避免下载密钥文件。

    create-service-account

    使用以下命令为每个组件创建一个 Google 服务账号:

    Prod

    对于非生产环境:

    $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 Hybrid 组件创建 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. 使用 apigeectl--restore 标志来应用更改:
    $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 运行时 apigee-runtime-my-project-id-env-name-num-id2-sa apigee-runtime
同步器 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 = validation)
      • apigee-cassandra-user-setup
      • apigee-datastore-default

      Prod

      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

      Prod

      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

      Prod

      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 指标

      Prod

      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(组织级)

      Prod

      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

      Prod

      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

    对于每个环境:

    • 运行时

      Prod

      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
    • 同步器

      Prod

      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(环境级层)

      Prod

      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. 如果要从先前的安装升级,请清理包含服务账号私钥的 Secret:
    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 添加到现有 Hybrid 安装。

以下示例展示了为 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 Synchronizer 设置权限,请运行以下命令:

    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. 使用 GSA 详细信息为每个 KSA 添加注解:
    kubectl annotate serviceaccount \
      --namespace $NAMESPACE \
      $KSA_NAME \
      iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    例如,如果为 Apigee Synchronizer 设置权限,请运行以下命令:

    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. 如果要从先前的安装升级,请清理包含服务账号私钥的 Secret:
    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