在 AKS 和 EKS 上启用工作负载身份联合

本主题介绍如何在 AKSAKS 平台上为 Apigee Hybrid 安装启用 Workload Identity。

概览

借助工作负载身份联合,在 Google Cloud 外部运行的应用可以使用来自外部身份提供方的凭据来模拟 Google Cloud Platform 服务账号。

通过使用工作负载身份联合,您可以让应用使用外部环境提供的身份验证机制并替换服务账号密钥,从而提高安全性。

如需了解概览,请参阅使用工作负载身份联合的最佳实践

设置工作负载身份联合

如需将工作负载身份联合与 Apigee Hybrid 搭配使用,请先配置集群,然后将该功能应用于 Apigee Hybrid 安装。

配置集群以使用工作负载身份联合。

按照 Google Cloud 说明为 Kubernetes 配置工作负载身份联合,并进行以下修改:

  • 使用以下命令列出您的 IAM 服务账号和 Kubernetes 服务账号:
    • IAM 服务账号:您很可能已在使用 create-service-account 工具进行 Apigee Hybrid 初始安装期间创建了 IAM 服务账号(也称为“Google 服务账号”)。如需查看 Apigee Hybrid 所需的 IAM 服务账号列表,请参阅服务账号简介

      您可以使用以下命令查看项目中的 IAM 服务账号列表:

      gcloud iam service-accounts list --project PROJECT_ID
    • Kubernetes 服务账号:当您运行 helm installhelm update 命令时,Apigee Hybrid 图表会为每个组件创建必要的 Kubernetes 服务账号。

      您可以使用 kubectl get sa 命令查看集群中的 Kubernetes 服务账号:

      kubectl get sa -n APIGEE_NAMESPACE
      kubectl get sa -n apigee-system
  • 配置工作负载身份联合步骤中,创建的工作负载身份池和提供方的默认受众群体如下所示。使用此默认值或设置自定义预期受众群体,并保存此值以供日后使用。
    https://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
  • 完成部署 Kubernetes 工作负载下的第 1 步后停止。每个 Google 服务账号都有一个凭据配置文件。保存每个凭据配置文件,并保存针对 --credential-source-file 参数输入的路径,例如:/var/run/service-account/token

将 Apigee Hybrid 配置为使用工作负载身份联合

  1. 将凭据源文件和输出文件 (credential-configuration.json) 复制到以下图表目录中。这些是您在部署 Kubernetes 工作负载下的第 1 步中提供的值。
    • apigee-datastore/
    • apigee-env
    • apigee-org/
    • apigee-telemetry/
  2. 对集群的替换文件进行以下全局更改:
    gcp:
      workloadIdentity:
        enabled: false # must be set to false to use Workload Identity Federation
      federatedWorkloadIdentity:
        enabled: true
        audience: "AUDIENCE"
        credentialSourceFile: "CREDENTIAL_SOURCE_FILE"
    

    其中:

    • AUDIENCE 是 Workload Identity 提供方允许的受众群体,即凭据配置 JSON 文件中 .audience 下的值(您在部署 Kubernetes 工作负载下的第 1 步中配置)。
    • CREDENTIAL_SOURCE_FILE 是供工作负载身份联合用来获取服务账号凭据的凭据源文件的文件名和路径。这是您在部署 Kubernetes 工作负载下的第 1 步中使用 create-cred-config 命令配置工作负载身份联合时为 credential-source-file 提供的值。例如:
    • 例如:

      gcp:
        workloadIdentity:
          enabled: false
        federatedWorkloadIdentity:
          enabled: true
          audience: "//iam.googleapis.com/projects/123456789012/locations/global/workloadIdentityPools/aws-pool/providers/aws-provider"
          credentialSourceFile: "/var/run/service-account/token"
      
  3. 使用工作负载身份联合为每个组件配置替换项。根据需要选择证书文件、Kubernetes Secret 或保险柜的说明。

    证书文件

    serviceAccountPath 的值替换为凭据源文件。此路径必须相对于图表目录。例如:

    udca:
      serviceAccountPath: fwi/credential-configuration.json
    

    K8s Secret

    1. 创建一个用于凭据来源文件的新 Kubernetes Secret。
      kubectl create secret -n apigee generic SECRET_NAME --from-file="client_secret.json=CREDENTIAL_CONFIGURATION_FILE"

      例如:

      kubectl create secret -n apigee generic udca-fwi-secret --from-file="client_secret.json=./fwi/credential-configuration.json"
    2. serviceAccountRef 的值替换为新 Secret。例如:
      udca:
        serviceAccountRef: udca-fwi-secret
      

    保险柜

    使用凭据源文件更新保险柜中的服务账号密钥 SAKEY。例如,对于 UDCA(该过程在所有组件中都类似):

    SAKEY=$(cat ./fwi/credential-configuration.json); kubectl -n apigee exec vault-0 -- vault kv patch secret/apigee/orgsakeys udca="$SAKEY"
  4. 使用 helm update 命令将更改应用于每个受影响的组件:

    如果您是首次在此集群中使用保险柜,请更新 apigee-operator 图表:

    helm upgrade operator apigee-operator/ \
      --namespace apigee-system \
      --atomic \
      -f overrides.yaml
    

    按以下顺序更新其余受影响的图表:

    helm upgrade datastore apigee-datastore/ \
      --namespace apigee \
      --atomic \
      -f overrides.yaml
    
    helm upgrade telemetry apigee-telemetry/ \
      --namespace apigee \
      --atomic \
      -f overrides.yaml
    
    helm upgrade $ORG_NAME apigee-org/ \
      --namespace apigee \
      --atomic \
      -f overrides.yaml
    

    更新每个环境的 apigee-env 图表,每次替换 ENV_NAME

    helm upgrade $ENV_NAME apigee-env/ \
      --namespace apigee \
      --atomic \
      --set env=$ENV_NAME \
      -f overrides.yaml
    

    如需查看组件及其对应图表的列表,请参阅 Apigee Hybrid Helm 参考文档

如需详细了解工作负载身份联合和最佳实践,请参阅使用工作负载身份联合的最佳实践