了解如何使用 Workload Identity Federation for GKE 对 Knative serving 服务进行身份验证,以访问 Google Cloud API,例如计算 API、存储和数据库 API 或机器学习 API。
如需对 Knative serving 服务进行身份验证,您必须执行以下操作:
- 在集群中启用 Workload Identity Federation for GKE
- 创建 Kubernetes 服务账号并向其授予所需的 IAM 角色
按照这些步骤操作后,您可以部署使用您创建的身份的新 Knative serving 服务。
在集群上启用 Workload Identity Federation for GKE
如需使用 Knative serving 设置 Workload Identity Federation for GKE,您可以设置舰队工作负载身份联合,而不是使用 Google Cloud 服务账号 JSON 文件。
配置权限以启用所有指标
如需启用指标(例如向 Google Cloud Observability 报告请求数或请求延迟时间),您需要为 Cloud Monitoring 授予写入权限。例如,您可以向与 Knative serving 关联的 Kubernetes 服务账号授予 Monitoring Metric Writer 角色 (roles/monitoring.metricWriter),因为它提供写入监控数据所需的权限。
向 Kubernetes 服务账号授予 IAM 角色
任何以您配置的 Kubernetes 服务账号运行的 Knative serving 服务在访问 Google Cloud API 时,都会自动使用其联合身份进行身份验证。Kubernetes 服务账号必须存在于要对其使用 Workload Identity Federation for GKE 的 Knative serving 服务的集群和命名空间中。
如果 Kubernetes 服务账号不存在,请在 Knative serving 服务所在的 Kubernetes 命名空间中创建一个;否则,请跳至下一步:
kubectl create serviceaccount --namespace K8S_NAMESPACE KUBERNETES_SERVICEACCOUNT
直接向 Kubernetes 服务账号授予所需的 IAM 角色:
gcloud projects add-iam-policy-binding RESOURCE_PROJECT_ID \ --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/K8S_NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \ --role "ROLE_NAME" \ --condition=None
将
- 将 RESOURCE_PROJECT_ID 替换为目标 Google Cloud 资源所在的 Google Cloud 项目 ID。
- 将 PROJECT_NUMBER 替换为 Kubernetes 服务账号和 Knative serving 服务所在集群的Google Cloud 项目的编号。
- 将 PROJECT_ID 替换为 Kubernetes 服务账号和 Knative serving 服务所在集群的 Google Cloud 项目的 ID。
- 将 K8S_NAMESPACE 和 KUBERNETES_SERVICEACCOUNT 替换为您的 Kubernetes 服务账号的命名空间和名称。
- 将 ROLE_NAME 替换为要分配给您的 Kubernetes 服务账号的 IAM 角色,例如
roles/monitoring.metricWriter。
部署新服务以使用 Workload Identity Federation for GKE
部署使用您创建的 Workload Identity Federation for GKE 的新 Knative serving 服务。
控制台
前往 Google Cloud 控制台中的 Knative serving:
如果您是要配置一个新服务来作为部署目标,请点击创建服务。如果您要配置现有服务,请点击该服务,然后点击修改和部署新的修订版本。
在“高级设置”下,点击容器。
点击服务账号下拉列表,然后选择所需的服务账号。
点击下一步以转到下一部分。
在配置此服务的触发方式部分,选择您想使用哪个连接来调用服务。
点击创建以将映像部署到 Knative serving,然后等待部署完成。
命令行
对于现有服务,请运行带有以下参数的
gcloud run services update命令来设置 Kubernetes 服务账号:gcloud run services update SERVICE --service-account KUBERNETES_SERVICEACCOUNT
您需要进行如下替换:
- 将 SERVICE 替换为您的 Knative serving 服务的名称。
- 将 KUBERNETES_SERVICEACCOUNT 替换为您用于创建工作负载身份的 Kubernetes 服务账号。
对于新服务,请运行带有
--service-account参数的gcloud run deploy命令来设置 Kubernetes 服务账号:gcloud run deploy --image IMAGE_URL --service-account KUBERNETES_SERVICEACCOUNT
您需要进行如下替换:
- 将 IMAGE_URL 替换为对容器映像的引用,例如
gcr.io/cloudrun/hello。 - 将 KUBERNETES_SERVICEACCOUNT 替换为您用于创建工作负载身份的 Kubernetes 服务账号。
- 将 IMAGE_URL 替换为对容器映像的引用,例如
YAML
您可以使用 gcloud run services describe 命令和 --format=export 标志将现有服务的配置下载到的 YAML 文件中。然后,您可以使用 gcloud run services replace 命令修改该 YAML 文件并部署这些更改。您必须确保仅修改指定的属性。
将服务配置下载到本地工作区上名为
service.yaml的文件中:gcloud run services describe SERVICE --format export > service.yaml
将 SERVICE 替换为您的 Knative serving 服务的名称。
在本地文件中,更新
serviceAccountName:属性:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: template: spec: serviceAccountName: KUBERNETES_SERVICEACCOUNT
您需要进行如下替换
- 将 SERVICE 替换为您的 Knative serving 服务的名称。
- 将 KUBERNETES_SERVICEACCOUNT 替换为您用于创建工作负载身份的 Kubernetes 服务账号。
运行以下命令,将配置部署到 Knative serving 服务:
gcloud run services replace service.yaml
迁移现有服务以使用 Workload Identity Federation for GKE
如果您在现有集群上启用了 Workload Identity Federation for GKE,则必须迁移集群上要使用 Workload Identity Federation for GKE 的每项服务。了解如何迁移现有服务。
后续步骤
了解如何管理访问权限(对服务的访问权限)。