第 10 步(可选):在 GKE 上配置 Workload Identity

仅限使用 Workload Identity 的 GKE:配置 Workload Identity

如果您在第 6 步:配置集群中为 GKE 上的 Workload Identity 设置了替换文件,请按照以下步骤操作。

如果您未在 GKE 上使用 Workload Identity,请继续执行第 3 部分的第 1 步:公开 Apigee 入站流量网关

Google Cloud 服务账号和 Kubernetes 服务账号

Google Cloud 服务账号是一种特殊类型的账号,可用于通过作为服务账号本身进行身份验证来进行授权 API 调用。您可以向 Google Cloud 服务账号授予与个人用户类似的角色和权限。当应用是使用服务账号证明其身份时,它可以访问该服务账号有权访问的所有资源。如需详细了解 Google Cloud 服务账号,请参阅服务账号概览

您在“第 4 步:创建服务账号”中创建了 Apigee Hybrid 安装的 Google Cloud 服务账号。Apigee 使用这些服务账号对 Hybrid 组件进行身份验证。

Kubernetes 服务账号与 Google Cloud 服务账号类似。Kubernetes 服务账号为 Pod 中运行的进程提供身份,并允许其像用户一样向 API 服务器进行身份验证。如需详细了解 Kubernetes 服务账号,请参阅为 Pod 配置服务账号

您在上一过程中运行 apigeectl apply 时,apigeectl 工具创建了 Apigee Hybrid 所需的大多数 Kubernetes 服务账号。

在 GKE 上配置 Workload Identity 时,您将 Google Cloud 服务账号与 Kubernetes 集群中的 Kubernetes 服务账号相关联。这样,Kubernetes 服务账号就可以模拟 Google Cloud 服务账号,并使用其分配的角色和权限向 Hybrid 组件进行身份验证。

按照以下说明为项目配置 Workload Identity。

准备配置 Workload Identity

这些过程使用以下环境变量。检查它们是否已定义,并对没有定义的进行定义:

echo $APIGEECTL_HOME
echo $CLUSTER_LOCATION
echo $ENV_NAME
echo $HYBRID_FILES
echo $NAMESPACE
echo $PROJECT_ID
echo $ORG_NAME

其中:

  • APIGEECTL_HOME 是您安装 apigeectl 的目录。
  • CLUSTER_LOCATION 是集群的区域(或可用区),例如 us-central1
  • ENV_NAME 是您的环境的名称。
  • HYBRID_FILES 是您创建 overridescerts 目录所在的目录。
  • NAMESPACE 是您的 Apigee 命名空间。
  • PROJECT_ID 是您的 Google Cloud 项目。
  • ORG_NAME 是您的 Apigee 组织的名称。

  1. 使用以下命令检查 gcloud 配置设置为您的 Google Cloud 项目 ID:
    gcloud config get project
  2. 如果需要,请设置当前 gcloud 配置:

    gcloud config set project $PROJECT_ID
  3. 创建 apigee-cassandra-restore Kubernetes 服务账号。

    通过运行 apigeectl apply 应用配置时,该命令创建了 Workload Identity 所需的大多数 Kubernetes 服务账号。

    如需创建 apigee-cassandra-restore Kubernetes 服务账号,请运行带有 --restore 标志的 apigeectl apply

    $APIGEECTL_HOME/apigeectl apply -f $HYBRID_FILES/overrides/overrides.yaml --restore
  4. 验证已为 GKE 集群启用 Workload Identity。在第 1 步:创建集群中创建集群时,第 6 步是启用 Workload Identity。您可以通过运行以下命令来确认是否已启用 Workload Identity:

    区域级集群

    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:

    区域级集群

    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。每个节点最多可能需要 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-dataapigee-runtime

  6. 使用以下命令验证节点池上是否启用了 Workload Identity:

    区域级集群

    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
        
  7. 获取项目的 Google Cloud 服务账号名称列表。您需要使用这些名称来关联 Kubernetes 服务账号以配置 Workload Identity。对于非生产环境中的安装,只应有一个 Google 服务账号。对于生产环境中的安装,应该有 8 个。

    使用以下命令获取名称列表:

    gcloud iam service-accounts list --project $PROJECT_ID

    输出应如下所示:

    非生产

    对于非生产环境:

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

    生产

    对于非生产环境:

    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
    
  8. 获取 Kubernetes 服务账号的名称列表。在此过程中,您需要此名称列表才能与您的 Google Cloud 服务账号关联。使用以下命令:
    kubectl get sa -n $NAMESPACE

    输出内容应如下所示。粗体的 Kubernetes 服务账号是您需要与 Google Cloud 服务账号相关联的服务账号:

    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
        

配置 Workload Identity

请按照以下过程启用 Workload Identity 以进行 Hybrid 安装:

  1. 对于每个 Apigee 组件,使用组件的 Google 服务账号为相应的 Kubernetes 服务账号添加注解。

    以下步骤使用两个环境变量。您需要在每组命令之前重置这些变量的值:

    • GSA_NAME:Google 服务账号的名称。这些是您在第 4 步:创建服务账号中使用 create-service-account 工具创建的服务账号。
    • KSA_NAME:Kubernetes 服务账号的名称。这些是您在上面使用 kubectl get sa -n $NAMESPACE 命令列出的账号,例如 apigee-cassandra-schema-setup-hybrid-example-project-123abcd-sa
    • Cassandra

      为 Cassandra 组件配置 Workload Identity。

      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

      非生产

      配置 apigee-cassandra-backup Kubernetes 服务账号

      1. 定义 KSA_NAMEGSA_NAME 环境变量:
        GSA_NAME="apigee-non-prod"
        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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

        输出应包含描述注释的一行,如下所示:

        Annotations:         iam.gke.io/gcp-service-account: apigee-non-prod@my-project-id.iam.gserviceaccount.com

      配置 apigee-cassandra-restore Kubernetes 服务账号

      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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      配置 apigee-cassandra-schema-setup Kubernetes 服务账号

      1. 重新定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name-sa"
        例如: apigee-cassandra-schema-setup-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      配置 apigee-cassandra-schema-val Kubernetes 服务账号

      1. 重新定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
        例如: apigee-cassandra-schema-val-hybrid-example-project-123abcd
      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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      配置 apigee-cassandra-user-setup Kubernetes 服务账号

      1. 重新定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name-sa"
        例如: apigee-cassandra-user-setup-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      配置 apigee-datastore-default-sa Kubernetes 服务账号

      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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      生产

      配置 apigee-cassandra-backup Kubernetes 服务账号

      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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
      5. 输出应包含描述注释的一行,如下所示:

        Annotations:         iam.gke.io/gcp-service-account: apigee-cassandra@my-project-id.iam.gserviceaccount.com
      6. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      配置 apigee-cassandra-restore Kubernetes 服务账号

      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 \
          --project $PROJECT_ID
      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 Kubernetes 服务账号

      1. 重新定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name-sa"
        例如: apigee-cassandra-schema-setup-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      配置 apigee-cassandra-schema-val Kubernetes 服务账号

      1. 重新定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
        例如: apigee-cassandra-schema-val-hybrid-example-project-123abcd
      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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      配置 apigee-cassandra-user-setup Kubernetes 服务账号

      1. 重新定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name-sa"
        例如: apigee-cassandra-user-setup-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      配置 apigee-datastore-default-sa Kubernetes 服务账号

      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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
    • Apigee Connect

      为 Apigee Connect 组件配置 Workload Identity。

      非生产

      1. 定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-connect-agent-service-account-name-sa"
        例如: apigee-connect-agent-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      生产

      1. 定义 KSA_NAMEGSA_NAME 环境变量:
        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-connect-agent-service-account-name-sa"
        例如: apigee-connect-agent-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
    • MART

      为 MART 组件配置 Workload Identity。

      非生产

      1. 定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-mart-service-account-name-sa"
        例如: apigee-mart-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      生产

      1. 定义 KSA_NAMEGSA_NAME 环境变量:

        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-mart-service-account-name-sa"
        例如: apigee-mart-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
    • Apigee 指标

      为 Apigee 指标组件配置 Workload Identity。

      非生产

      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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      生产

      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 \
        --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
        --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
    • UDCA(组织级)

      为组织级 UDCA 组件配置 Workload Identity。

      UDCA 同时在组织级层和环境级层范围内实现。因此,UDCA 有两个单独的 Kubernetes 服务账号,每个范围一个。您可以通过账号名称将它们区分开来。环境范围账号在服务账号名称中包含环境名称。例如:

      • 组织级层:apigee-udca-my-project-id-123abcd-sa,其中 my-project-id 是名称项目 ID。
      • 环境级层:apigee-udca-my-project-id-my-env-234bcde-sa,其中 my-env 是环境的名称。

      非生产

      1. 定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-udca-service-account-name-sa"
        例如: apigee-udca-hybrid-example-project-123abcd-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 \
            --project $PROJECT_ID
      3. 为服务账号添加注解:
          kubectl annotate serviceaccount \
            --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      生产

      1. 定义 KSA_NAMEGSA_NAME 环境变量:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-service-account-name-sa"
        例如: apigee-udca-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
    • Apigee Watcher

      为 Apigee Watcher 组件配置 Workload Identity。

      非生产

      1. 定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-watcher-service-account-name-sa"
        例如:apigee-watcher-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      生产

      1. 定义 KSA_NAMEGSA_NAME 环境变量:

        GSA_NAME="apigee-watcher"
        KSA_NAME="apigee-watcher-service-account-name-sa"
        例如: apigee-watcher-hybrid-example-project-123abcd-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
    • 运行时

      为 Apigee 运行时组件配置 Workload Identity。

      非生产

      1. 定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-runtime-env-level-service-account-name-sa"
        例如:apigee-runtime-hybrid-example-project-example-env-234bcde-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      生产

      1. 定义 KSA_NAMEGSA_NAME 环境变量:

        GSA_NAME="apigee-runtime"
        KSA_NAME="apigee-runtime-env-level-service-account-name-sa"
        例如:apigee-runtime-hybrid-example-project-example-env-234bcde-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
    • 同步器

      为 Synchronizer 组件配置 Workload Identity。

      非生产

      1. 定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-synchronizer-env-level-service-account-name-sa"
        例如:apigee-synchronizer-hybrid-example-project-example-env-234bcde-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      生产

      1. 定义 KSA_NAMEGSA_NAME 环境变量:

        GSA_NAME="apigee-synchronizer"
        KSA_NAME="apigee-synchronizer-env-level-service-account-name-sa"
        例如:apigee-synchronizer-hybrid-example-project-example-env-234bcde-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
    • UDCA(环境级层)

      为环境级 UDCA 组件配置 Workload Identity。

      非生产

      1. 定义 KSA_NAME 环境变量:

        KSA_NAME="apigee-udca-env-level-service-account-name-sa"
        例如:apigee-udca-hybrid-example-project-example-env-234bcde-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME

      生产

      1. 定义 KSA_NAMEGSA_NAME 环境变量:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-env-level-service-account-name-sa"
        例如:apigee-udca-hybrid-example-project-example-env-234bcde-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 \
          --project $PROJECT_ID
      3. 为服务账号添加注解:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      4. 验证注解:
        kubectl describe serviceaccount \
          --namespace $NAMESPACE $KSA_NAME
  2. 可选:删除任何下载的服务账号密钥文件。

    如果您使用 create-service-account 工具创建了 Google 服务账号,则它可能已创建了服务账号密钥并下载了 .json 密钥文件。在 GKE 上使用 Workload Identity 时,不需要这些密钥文件。

    您可以使用以下命令删除密钥文件:

    rm $HYBRID_FILES/service-accounts/*.json

验证 Workload Identity

  1. (可选)您可以在 Google Cloud 控制台的 Kubernetes:工作负载概览页面中查看 Kubernetes 服务账号的状态。

    进入“工作负载”

  2. 如需使用 apigeectl check-ready 再次检查部署的状态,请运行以下命令:
    ${APIGEECTL_HOME}/apigeectl check-ready -f ${HYBRID_FILES}/overrides/overrides.yaml
(下一步)第 1 步:公开 Apigee 入站流量 2