使用 Workload Identity

了解如何使用 Workload Identity 对 Knative 服务服务进行身份验证,以访问 Google Cloud API,例如 Compute API、Storage 和 Database API 或 Machine Learning API。

如需对 Knative 服务服务进行身份验证,您必须:

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

完成上述步骤后,您可以部署使用您创建的身份的新 Knative 服务服务。

在集群上启用 Workload Identity

如需设置 Workload Identity 以使用 Knative 服务,您可以设置舰队 Workload Identity 联合,而不是使用 Google Cloud 服务帐号 JSON 文件。

配置权限以启用所有指标

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

绑定服务账号

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

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

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

    gcloud iam service-accounts create GSA_NAME

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

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

  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 服务服务所在的 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 服务服务所在集群的 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

部署新的 Knative 服务服务,该服务使用您创建的 Workload Identity。

控制台

  1. 前往 Google Cloud 控制台中的 Knative 服务:

    前往 Knative 服务

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

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

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

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

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

  7. 点击 Create 将映像部署到 Knative 服务,然后等待部署完成。

命令行

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

    gcloud run services update SERVICE --service-account KSA_NAME
    

    您需要在其中:

    • SERVICE 替换为您的 Knative 服务服务的名称。
    • 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 服务服务的名称。

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

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

    替换

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

    gcloud run services replace service.yaml

迁移现有服务以使用 Workload Identity

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

后续步骤

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