使用 Workload Identity Federation for GKE

了解如何使用 Workload Identity Federation for GKE 对 Knative serving 服务进行身份验证,以访问 Google Cloud API,例如计算 API、存储和数据库 API 或机器学习 API。

如需对 Knative serving 服务进行身份验证,您必须执行以下操作:

  1. 在集群中启用 Workload Identity Federation for GKE
  2. 配置权限
  3. 将您的 Kubernetes 服务账号 (KSA) 绑定到 Google 服务账号 (GSA)

按照这些步骤操作后,您可以部署使用您创建的身份的新 Knative serving 服务。

在集群上启用 Workload Identity Federation for GKE

如需使用 Knative serving 设置 Workload Identity Federation for GKE,您可以设置舰队工作负载身份联合,而不是使用 Google Cloud 服务账号 JSON 文件。

配置权限以启用所有指标

如需启用指标(例如向 Google Cloud Observability 报告请求数或请求延迟时间),您需要为 Cloud Monitoring 授予写入权限。例如,您可以向与 Knative serving 关联的 Google 服务账号授予 Monitoring Metric Writer 角色 (roles/monitoring.metricWriter),因为它提供写入监控数据所需的权限。如需详细了解如何创建 Google 服务账号,请参阅使用服务账号

绑定服务账号

您需要为 Kubernetes 服务账号 (KSA) 设置关系以充当 Google 服务账号 (GSA)。作为您绑定的 KSA 运行的任何工作负载在访问 Google Cloud API 时,都会自动以 GSA 进行身份验证。您绑定的 KSA 必须存在于要对其使用 Workload Identity Federation for GKE 的 Knative serving 服务的集群和命名空间中。GSA 可以属于与集群所在的 Google Cloud 项目不同的 Google Cloud 项目。

  1. 如果 GSA 不存在,请创建一个;否则,请跳到下一步。您可以在组织中的任何 Google Cloud 项目内创建用于 Knative serving 的 GSA,然后从运行 Knative serving 服务的 Google Cloud 项目中使用该 GSA。

    如需创建新的 GSA,请运行以下命令:

    gcloud iam service-accounts create GSA_NAME

    GSA_NAME 替换为新的 Google 服务账号的名称。

    如需详细了解如何将 Google 服务账号与 Knative serving 服务搭配使用,请参阅使用服务账号

  2. 确保您的 GSA 具有所需的 IAM 角色。您可以使用以下命令授予其他角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role "ROLE_NAME"

    您需要进行如下替换:

    • PROJECT_ID 替换为您的 Google 服务账号所在的 Google Cloud 项目的 ID。
    • GSA_NAME 替换为您的 Google 服务账号的名称。
    • ROLE_NAME 替换为要分配给您的 GSA 的 IAM 角色,例如 roles/monitoring.metricWriter
  3. 如果 Kubernetes 服务账号不存在,请在 Knative serving 服务所在的 Kubernetes 命名空间中创建一个;否则,请跳至下一步:

    kubectl create serviceaccount --namespace K8S_NAMESPACE KSA_NAME
  4. 绑定 Kubernetes 服务账号和 Google 服务账号以创建身份,然后将其部署到集群:

    1. 在这两者之间创建 IAM 政策绑定,以允许 KSA 模拟 GSA。

      gcloud iam service-accounts add-iam-policy-binding \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[K8S_NAMESPACE/KSA_NAME]" \
      GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com

      您需要进行如下替换:

      • PROJECT_ID 替换为 Kubernetes 服务账号和 Knative serving 服务所在集群的 Google Cloud 项目的 ID。
      • K8S_NAMESPACE/KSA_NAME 替换为您的 Kubernetes 服务账号的命名空间和名称。
      • GSA_NAME@GSA_PROJECT_ID 替换为您的 Google 服务账号的名称和 Google Cloud 项目的 ID。您可以在您的组织中使用任何 Google 服务账号。如需查看您的 Google 服务账号,请参阅列出服务账号
    2. 使用 GSA 的电子邮件地址,向 KSA 添加 iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT_ID 注释。

      kubectl annotate serviceaccount \
      --namespace K8S_NAMESPACE KSA_NAME \
       iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com

      您需要进行如下替换:

      • K8S_NAMESPACE/KSA_NAME 替换为您要为其创建绑定的 Kubernetes 服务账号的命名空间和名称。
      • GSA_NAME@GSA_PROJECT_ID 替换为您要为其创建绑定的 Google 服务账号的名称和 Google Cloud 项目的 ID。

部署新服务以使用 Workload Identity Federation for GKE

部署使用您创建的 Workload Identity Federation for GKE 的新 Knative serving 服务。

控制台

  1. 在 Google Cloud 控制台中前往 Knative serving:

    前往 Knative serving

  2. 如果您是要配置一个新服务来作为部署目标,请点击创建服务。如果您要配置现有服务,请点击该服务,然后点击修改和部署新的修订版本

  3. 在“高级设置”下,点击容器

  4. 点击服务账号下拉列表,然后选择所需的服务账号。

  5. 点击下一步以转到下一部分。

  6. 配置此服务的触发方式部分,选择您想使用哪个连接来调用服务。

  7. 点击创建以将映像部署到 Knative serving,然后等待部署完成。

命令行

  • 对于现有服务,请运行带有以下参数的 gcloud run services update 命令来设置 Kubernetes 服务账号:

    gcloud run services update SERVICE --service-account KSA_NAME

    您需要进行如下替换:

    • SERVICE 替换为您的 Knative serving 服务的名称。
    • KSA_NAME 替换为您用于创建工作负载身份的 Kubernetes 服务账号。
  • 对于新服务,请运行带有 --service-account 参数的 gcloud run deploy 命令来设置 Kubernetes 服务账号:

    gcloud run deploy --image IMAGE_URL --service-account KSA_NAME

    您需要进行如下替换:

    • IMAGE_URL 替换为对容器映像的引用,例如 gcr.io/cloudrun/hello
    • KSA_NAME 替换为您用于创建工作负载身份的 Kubernetes 服务账号。

YAML

您可以使用 gcloud run services describe 命令和 --format=export 标志将现有服务的配置下载到的 YAML 文件中。然后,您可以使用 gcloud run services replace 命令修改该 YAML 文件并部署这些更改。您必须确保仅修改指定的属性。

  1. 将服务配置下载到本地工作区上名为 service.yaml 的文件中:

    gcloud run services describe SERVICE --format export > service.yaml

    SERVICE 替换为您的 Knative serving 服务的名称。

  2. 在本地文件中,更新 serviceAccountName: 属性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: KSA_NAME

    您需要进行如下替换

    • SERVICE 替换为您的 Knative serving 服务的名称。
    • KSA_NAME 替换为您用于创建工作负载身份的 Kubernetes 服务账号。
  3. 运行以下命令,将配置部署到 Knative serving 服务:

    gcloud run services replace service.yaml

迁移现有服务以使用 Workload Identity Federation for GKE

如果您在现有集群上启用了 Workload Identity Federation for GKE,则必须迁移集群上要使用 Workload Identity Federation for GKE 的每项服务。了解如何迁移现有服务

后续步骤

了解如何管理访问权限(对服务的访问权限)。