在 GKE 上启用 Workload Identity

本主题介绍如何在 GKE 上为 Apigee Hybrid 启用 Workload Identity。

如果您使用的是 Apigee Hybrid AKSEKS,请按照在 AKS 和 EKS 上启用工作负载身份联合中的说明操作。

概览

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 配置服务账号

当您首次为这些组件安装 Helm 图表时,Apigee 会为每种类型的组件创建并使用一个 Kubernetes 服务账号。启用 Workload Identity 后,Hybrid 组件可与 Kubernetes 服务账号交互。

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

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

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • ORG_NAME:您的 Apigee 组织的名称。
  • ENV_NAME:Apigee 环境的名称。
  • NAMESPACE:您的 Apigee 命名空间(通常为 apigee)。
  • CLUSTER_LOCATION:Kubernetes 集群的区域或可用区,例如 us-west1
  • CLUSTER_NAME:您的集群的名称。

验证环境变量:

echo $PROJECT_ID
echo $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $CLUSTER_NAME

初始化您需要的任何变量:

export PROJECT_ID=my-project-id
export ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_LOCATION=my-cluster-location
export CLUSTER_NAME=my-cluster-name

Workload Identity 和服务账号密钥文件

在 GKE 上运行 Apigee Hybrid 时,标准做法是为每个服务账号创建和下载私钥(.json 文件)。使用 Workload Identity 时,您无需下载服务账号私钥并将其添加到 GKE 集群。

如果您已在 Apigee Hybrid 安装过程中下载服务账号密钥文件,则可以在启用 Workload Identity 后删除它们。在大多数安装中,它们位于每个组件图表的目录中。

为 Apigee Hybrid 启用 Workload Identity

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

准备配置 Workload Identity

  1. 验证替换文件中是否已启用 Workload Identity。您应在替换文件中启用它,并且您应该具有以下配置属性的值:
  2. 使用以下命令检查 gcloud 配置设置为您的 Google Cloud 项目 ID:
    gcloud config get project
  3. 如果需要,请设置当前 gcloud 配置:

    gcloud config set project $PROJECT_ID
  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
      

配置 Workload Identity

请按照以下过程为以下 Hybrid 组件启用 Workload Identity:

  • apigee-datastore
  • apigee-telemetry
  • apigee-org
  • apigee-env

当您为 apigee-datastoreapigee-envapigee-orgapigee-telemetry 图表运行 helm upgrade 并使用 --dry-run--dry-run=server 标志时,输出会包含您使用正确的 GSA 和 KSA 名称配置 Workload Identity 所需的命令。

例如:

helm upgrade datastore apigee-datastore/ \
  --namespace $NAMESPACE \
  -f overrides.yaml \
  --dry-run=server
NAME: datastore
...
For Cassandra backup GKE Workload Identity, please make sure to add the below membership to the IAM policy binding using the respective kubernetes SA (KSA).
gcloud iam service-accounts add-iam-policy-binding my-gsa@my-project-id.iam.gserviceaccount.com \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:my-project-id.svc.id.goog[apigee/apigee-cassandra-default]" \
      --project my-project-id

kubectl annotate serviceaccount apigee-cassandra-default \
      iam.gke.io/gcp-service-account=my-gsa@my-project-id.iam.gserviceaccount.com \
      --namespace apigee
  1. 获取为 apigee-datastore 设置 Workload Identity 的命令,并在输出中的 NOTES: 下运行该命令。
    helm upgrade datastore apigee-datastore/ \
      --namespace $NAMESPACE \
      -f overrides.yaml \
      --dry-run=server
  2. 获取为 apigee-telemetry 设置 Workload Identity 的命令,并在输出中的 NOTES: 下运行该命令。
    helm upgrade telemetry apigee-telemetry/ \
      --namespace $NAMESPACE \
      -f overrides.yaml \
      --dry-run=server
  3. 获取为 apigee-org 设置 Workload Identity 的命令,并在输出中的 NOTES: 下运行该命令。
    helm upgrade $ORG_NAME apigee-org/ \
      --namespace $NAMESPACE \
      -f overrides.yaml \
      --dry-run=server
  4. 获取为 apigee-env 设置 Workload Identity 的命令,并在输出中的 NOTES: 下运行该命令。
    helm upgrade $ENV_NAME apigee-env/ \
      --namespace $NAMESPACE \
      --set env=$ENV_NAME \
      -f overrides.yaml \
      --dry-run=server

    对安装中的每个环境重复此步骤。

验证 Workload Identity

  1. 验证相关步骤是否奏效:
    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
  2. 如果要从先前的安装升级,请清理包含服务账号私钥的 Secret:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  3. 检查日志:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer
    
  4. (可选)您可以在 Google Cloud 控制台的 Kubernetes:工作负载概览页面中查看 Kubernetes 服务账号的状态。

    进入“工作负载”