如果要在 Google Cloud 上注册 GKE 集群,则可能需要在注册集群之前执行以下一项或多项操作,具体取决于您选择的注册选项。本指南假定您已具备集群注册的一般前提条件。
启用 Workload Identity Federation for GKE
我们建议在启用舰队工作负载身份联合的情况下注册 GKE 集群,这可为集群上的应用提供向 Google Cloud API 和服务进行身份验证的一致方法。如需详细了解启用舰队工作负载身份联合的优势,请参阅使用舰队工作负载身份联合。
如需使用此功能,您必须确保在注册之前已在集群上启用适用于 GKE 的工作负载身份联合。如果向舰队工作负载身份联合注册某个 GKE 集群,但没有在该集群上启用适用于 GKE 的工作负载身份联合,则可能会导致该集群中的工作负载声明身份的方式不一致,并且配置不受支持。默认情况下,Autopilot 集群会启用适用于 GKE 的工作负载身份联合。
gcloud
如需检查您的集群是否已启用适用于 GKE 的工作负载身份联合,请运行以下命令以列出集群的工作负载身份池。如果您尚未指定 gcloud
的默认可用区或区域,则需要在运行此命令时指定 --region
或 --zone
标志。
gcloud container clusters describe CLUSTER_NAME --format="value(workloadIdentityConfig.workloadPool)"
替换以下内容:
- CLUSTER_NAME:GKE 集群的
name
。
如果您看到类似如下所示的结果,则表示您的集群已启用适用于 GKE 的工作负载身份联合:
GKE_PROJECT_ID.svc.id.goog
如果没有结果,则表示未启用适用于 GKE 的工作负载身份联合。按照启用适用于 GKE 的工作负载身份联合中的说明操作。
控制台
如需检查您的集群是否已启用适用于 GKE 的工作负载身份联合,请执行以下操作:
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
在集群列表中,点击集群的名称。
在集群详情页面的安全部分中,确认 Workload Identity 被列为已启用。
如果 Workload Identity 已停用并且您希望启用此功能:
- 在集群详情页面中,点击 修改 Workload Identity。
- 在修改 Workload Identity 对话框中,选中启用 Workload Identity 复选框。
- 点击保存更改。
授予将集群注册到其他项目的权限
将 GKE 集群注册到其自己项目中的舰队时,除授予访问权限中所述的权限外,无需任何特殊权限。不过,如果要将 GKE 集群从其自己的项目 (GKE_PROJECT) 注册到其他项目 (FLEET_HOST_PROJECT) 中的舰队,FLEET_HOST_PROJECT 服务代理账号 gcp-sa-gkehub
必须具有 GKE_PROJECT 项目的 gkehub.serviceAgent
角色。此角色可授予服务账号管理该项目中的集群资源的权限。
您可以使用 gcloud CLI 或 Google Cloud 控制台检查舰队宿主项目 gcp-sa-gkehub
服务账号在集群的项目中是否具有所需的角色,如下所示。
gcloud
运行以下命令:
gcloud projects get-iam-policy GKE_PROJECT_ID | grep gcp-sa-gkehub
其中,GKE_PROJECT_ID 是集群的项目 ID。
如果舰队宿主项目 gcp-sa-gkehub
在集群的项目中具有所需的角色,则应以 service-[FLEET_HOST-PROJECT-NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com
格式显示在输出中。例如:
- members:
- serviceAccount:service-1234567890@gcp-sa-gkehub.iam.gserviceaccount.com
role: roles/gkehub.serviceAgent
控制台
选择集群的项目后,转到 Google Cloud 控制台中的 IAM 和管理页面。
选中包括 Google 提供的角色授权复选框以查看完整的允许政策,包括服务代理。
如果舰队宿主项目服务账号 gcp-sa-gkehub
在集群的项目中具有所需的角色,则应在此列表中以 service-[FLEET_HOST-PROJECT-NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com
格式显示。
如果项目的 IAM 允许政策中未列出服务代理,请执行以下操作以更新必要的权限:
gcloud
如需向
gcp-sa-gkehub
授予gkehub.serviceAgent
角色,请先确保此服务账号存在于舰队宿主项目中。如果您之前在此舰队项目中注册了集群,则此服务账号应该已存在。您可以通过查看机群宿主项目的 IAM 允许政策进行检查:gcloud projects get-iam-policy FLEET_HOST_PROJECT_ID | grep gcp-sa-gkehub
如果您需要创建
gcp-sa-gkehub
服务账号,请运行以下命令:gcloud beta services identity create --service=gkehub.googleapis.com --project=FLEET_HOST_PROJECT_ID
此命令应输出以下内容:
Service identity created: service-[FLEET_HOST_PROJECT_NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com
运行以下命令,向服务账号授予两个项目中的
roles/gkehub.serviceAgent
角色以及集群项目中的roles/gkehub.crossProjectServiceAgent
:GKE_PROJECT_ID=GKE_PROJECT_ID FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID FLEET_HOST_PROJECT_NUMBER=$(gcloud projects describe "${FLEET_HOST_PROJECT_ID}" --format "value(projectNumber)") gcloud projects add-iam-policy-binding "${FLEET_HOST_PROJECT_ID}" \ --member "serviceAccount:service-${FLEET_HOST_PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \ --role roles/gkehub.serviceAgent gcloud projects add-iam-policy-binding "${GKE_PROJECT_ID}" \ --member "serviceAccount:service-${FLEET_HOST_PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \ --role roles/gkehub.serviceAgent gcloud projects add-iam-policy-binding "${GKE_PROJECT_ID}" \ --member "serviceAccount:service-${FLEET_HOST_PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \ --role roles/gkehub.crossProjectServiceAgent
其中:
- GKE_PROJECT_ID 是 GKE 集群的 Google Cloud 项目 ID。
- FLEET_HOST_PROJECT_ID 是您要在其中注册集群的 Google Cloud 项目 ID。了解如何查找此值。
如需确认已授予角色绑定,请再次运行以下命令:
gcloud projects get-iam-policy GKE_PROJECT_ID
如果您看到服务账号名称以及
gkehub.serviceAgent
和gkehub.crossProjectServiceAgent
角色,则已授予角色绑定。例如:- members: - serviceAccount:service-[FLEET_HOST_PROJECT_NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com role: roles/gkehub.serviceAgent - members: - serviceAccount:service-[FLEET_HOST_PROJECT_NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com role: roles/gkehub.crossProjectServiceAgent
为 Terraform 配置服务账号
如果您想使用 Terraform 来注册 Google Kubernetes Engine 集群,则需要创建一个服务账号,供 Terraform 用于访问 Fleet API 以创建成员资格。
gcloud
按如下方式创建服务账号:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME --project=FLEET_HOST_PROJECT_ID
将
gkehub.admin
IAM 角色绑定到服务账号,以便 Terraform 可以将它与 Fleet API 一起使用:FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/gkehub.admin"
如果要使用 Terraform 创建新集群,然后注册该集群,则还需要将
roles/container.admin
角色绑定到该服务账号,以便 Terraform 可以使用该服务账号访问 GKE API,从而创建集群。FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/container.admin"
替换以下内容:
- FLEET_HOST_PROJECT_ID 是您要在其中注册集群的 Google Cloud 项目 ID。了解如何查找此值。
- SERVICE_ACCOUNT_NAME 是您为 [服务账号] 选择的显示名。
下载服务账号的私钥 JSON 文件,如使用
gcloud
创建 Google Cloud 服务账号中所述。您需要借助此文件来使用 Terraform 创建和注册集群。
为 Config Connector 配置服务账号
如果要使用 Config Connector 注册 GKE 集群,请执行以下操作:
gcloud
确保已安装 Config Connector 插件。您应该具有高于 1.47.0 的 Config Connector 版本。
按照 Config Connector 说明创建服务账号。
将
gkehub.admin
IAM 角色绑定到此服务账号,以便 Config Connector 可以使用此服务账号访问 Fleet API:FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/gkehub.admin"
如果您要使用 Config Connector 创建新集群,然后注册该集群,则还需要将
roles/container.admin
角色绑定到服务账号,以便 Config Connector 控制器可以使用此服务账号访问 GKE API 以创建集群。FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/container.admin"
替换以下内容:
- FLEET_HOST_PROJECT_ID 是您要在其中注册集群的 Google Cloud 项目 ID。了解如何查找此值。
- SERVICE_ACCOUNT_NAME 是您为 [服务账号] 选择的显示名。
按照 Config Connector 说明使用此服务账号配置 Config Connector。
后续步骤
按照说明注册集群。