本主题介绍如何为 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 文件中的每个组件。例如:
- 证书文件:
watcher: serviceAccountPath: ./apigee-org/my-hybrid-project-apigee-watcher.json
请参阅:
- Kubernetes Secret:
watcher: serviceAccountRef: my-watcher-k8s-secret
请参阅:
这些步骤中使用的环境变量
这些过程使用以下环境变量。请在命令 shell 中设置这些变量,或在代码示例中将它们替换为实际值:
APIGEECTL_HOME
:apigeectl
的安装目录。CLUSTER_LOCATION
:集群的区域或可用区,例如us-west1
。ENV_NAME
:Apigee 环境的名称。NAMESPACE
:用于 Apigee Hybrid 的 Kubernetes 命名空间。通常为apigee
。HYBRID_FILES
:您的混合文件目录,例如hybrid-base-directory/hybrid-files
。ORG_NAME
:您的 Apigee 组织的名称。PROJECT_ID
:您的 Google Cloud 项目的 ID。
验证环境变量:
echo $PROJECT_IDecho $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $APIGEECTL_HOME
echo $HYBRID_FILES
初始化您需要的任何变量:
export PROJECT_ID=my-project-idexport ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
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。
然后,根据要执行的步骤,按照这些部分中的说明进行操作:- 为全新安装启用 Workload Identity。遵循新 Apigee Hybrid 安装的说明,或者如果您未在 Hybrid 安装时安装 ASM。
- 升级安装以使用 Workload Identity。按照这些说明在现有 Apigee Hybrid 安装上启用 Workload Identity。
准备启用 Workload Identity
在开始安装过程之前,请先按照本部分中的步骤操作。
- 将项目设置为您要修改的项目:
gcloud config set project $PROJECT_ID
-
使用以下命令获取您要启用 Workload Identity 的集群的
gcloud
凭据:gcloud container clusters get-credentials ${CLUSTER_NAME} \ --region ${CLUSTER_LOCATION} \ --project ${PROJECT_ID}
- 使用以下命令验证已为运行 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。
- 确保每个节点池上都启用了 Workload Identity。
- 使用以下命令列出您的节点池:
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
- 对每个节点池使用以下命令,确保为每个节点池启用 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 服务账号,并创建所需的任何账号。
- 使用以下命令检查项目的 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
命令为每个服务账号分配适当的角色。此方法要求您单独创建每个服务账号,但您可以避免下载密钥文件。
使用以下命令为每个组件创建一个 Google 服务账号:create-service-account
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
创建以下服务账号并为其分配角色。
- 服务账号:
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"
- 服务账号角色:
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"
- 服务账号角色:
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"
- 服务账号角色:
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"
- 服务账号 :
apigee-runtime
、角色:未分配任何角色。创建账户:
gcloud iam service-accounts create apigee-runtime \ --display-name="apigee-runtime" \ --project $PROJECT_ID
- 服务账号:
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"
- 服务账号角色:
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"
- 服务账号角色:
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 服务账号。
- 将以下粗体行添加到的
overrides.yaml
文件中的gcp
节下。这会为您的安装启用 Workload Identity,并在应用配置时触发apigeectl
以创建 Kubernetes 服务账号:gcp: projectID: "my-project-id" name: "my-project-id" region: "analytics-region" workloadIdentityEnabled: true
- 将以下粗体行添加到的
overrides.yaml
文件中的cassandra
节下。这会触发创建apigee-cassandra-backup
Kubernetes 服务账号:cassandra: ... backup: enabled: true
- 使用
apigeectl
和--restore
标志来应用更改:$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --restore
- 使用以下命令验证服务账号:
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 服务账号添加注释。
- 绑定角色并标注服务账号。
组织级组件
为组织级层组件进行 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
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-cassandra"
KSA_NAME="apigee-cassandra-backup
" - 绑定 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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
apigee-cassandra-restore
- 重新定义
KSA_NAME
环境变量:KSA_NAME="apigee-cassandra-restore"
- 绑定 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
- 为服务账号添加注解:
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
- 重新定义
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
- 为服务账号添加注解:
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
- 重新定义
KSA_NAME
环境变量:KSA_NAME="apigee-cassandra-schema-val-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
- 为服务账号添加注解:
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
- 重新定义
KSA_NAME
环境变量:KSA_NAME="apigee-cassandra-user-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
apigee-datastore-default-sa
- 重新定义
KSA_NAME
环境变量:KSA_NAME="apigee-datastore-default-sa"
- 绑定 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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非生产
apigee-cassandra-backup
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-non-prod"
KSA_NAME="apigee-connect-agent-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
apigee-cassandra-restore
- 重新定义
KSA_NAME
环境变量:KSA_NAME="apigee-cassandra-restore"
- 绑定 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
- 为服务账号添加注解:
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
- 重新定义
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
- 为服务账号添加注解:
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
- 重新定义
KSA_NAME
环境变量:KSA_NAME="apigee-cassandra-schema-val-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
- 为服务账号添加注解:
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
- 重新定义
KSA_NAME
环境变量:KSA_NAME="apigee-cassandra-user-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
- 为服务账号添加注解:
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
- 重新定义
KSA_NAME
环境变量:KSA_NAME="apigee-datastore-default-sa"
- 绑定 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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- Apigee Connect
Prod
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-mart"
KSA_NAME="apigee-connect-agent-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非生产
- 定义
KSA_NAME
环境变量:KSA_NAME="apigee-connect-agent-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 定义
- MART
Prod
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-mart"
KSA_NAME="apigee-mart-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非生产
- 定义
KSA_NAME
环境变量:KSA_NAME="apigee-mart-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 定义
- Apigee 指标
Prod
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-metrics"
KSA_NAME="apigee-metrics-sa"
- 绑定 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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非生产
- 定义
KSA_NAME
环境变量:KSA_NAME="apigee-metrics-sa"
- 绑定 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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 定义
- UDCA(组织级)
Prod
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-udca"
KSA_NAME="apigee-udca-org-level-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非生产
- 定义
KSA_NAME
环境变量:KSA_NAME="apigee-udca-org-level-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 定义
- Apigee Watcher
Prod
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-watcher"
KSA_NAME="apigee-watcher-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非生产
- 定义
KSA_NAME
环境变量:KSA_NAME="apigee-watcher-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 定义
对于每个环境:
- 运行时
Prod
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-runtime"
KSA_NAME="apigee-runtime-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非生产
- 定义
KSA_NAME
环境变量:KSA_NAME="apigee-runtime-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 定义
- 同步器
Prod
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-synchronizer"
KSA_NAME="apigee-synchronizer-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非生产
- 定义
KSA_NAME
环境变量:KSA_NAME="apigee-synchronizer-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 定义
- UDCA(环境级层)
Prod
- 定义
KSA_NAME
和GSA_NAME
环境变量:GSA_NAME="apigee-udca"
KSA_NAME="apigee-udca-env-level-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非生产
- 定义
KSA_NAME
环境变量:KSA_NAME="apigee-udca-env-level-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
- 为服务账号添加注解:
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 定义
- Cassandra
- 验证相关步骤是否奏效:
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
- 如果要从先前的安装升级,请清理包含服务账号私钥的 Secret:
kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
- 检查日志:
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
- 为每个服务账号添加 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
- 使用 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
- 验证相关步骤是否奏效:
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
- 如果要从先前的安装升级,请清理包含服务账号私钥的 Secret:
kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
- 检查日志:
kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer