GKE clusters on Google Cloud 的前提条件

如果要在 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 的工作负载身份联合,请执行以下操作:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击集群的名称。

  3. 在集群详情页面的安全部分中,确认 Workload Identity 被列为已启用

如果 Workload Identity 已停用并且您希望启用此功能:

  1. 在集群详情页面中,点击 修改 Workload Identity
  2. 修改 Workload Identity 对话框中,选中启用 Workload Identity 复选框。
  3. 点击保存更改

授予将集群注册到其他项目的权限

将 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

控制台

  1. 选择集群的项目后,转到 Google Cloud 控制台中的 IAM 和管理页面。

    转到“IAM 和管理”页面

  2. 选中包括 Google 提供的角色授权复选框以查看完整的允许政策,包括服务代理。

如果舰队宿主项目服务账号 gcp-sa-gkehub 在集群的项目中具有所需的角色,则应在此列表中以 service-[FLEET_HOST-PROJECT-NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com 格式显示。

如果项目的 IAM 允许政策中未列出服务代理,请执行以下操作以更新必要的权限:

gcloud

  1. 如需向 gcp-sa-gkehub 授予 gkehub.serviceAgent 角色,请先确保此服务账号存在于舰队宿主项目中。如果您之前在此舰队项目中注册了集群,则此服务账号应该已存在。您可以通过查看机群宿主项目的 IAM 允许政策进行检查:

    gcloud projects get-iam-policy FLEET_HOST_PROJECT_ID | grep gcp-sa-gkehub
    
  2. 如果您需要创建 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
    
  3. 运行以下命令,向服务账号授予两个项目中的 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。了解如何查找此值
  4. 如需确认已授予角色绑定,请再次运行以下命令:

    gcloud projects get-iam-policy GKE_PROJECT_ID
    

    如果您看到服务账号名称以及 gkehub.serviceAgentgkehub.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

  1. 按如下方式创建服务账号:

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME --project=FLEET_HOST_PROJECT_ID
    
  2. 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 是您为 [服务账号] 选择的显示名。
  3. 下载服务账号的私钥 JSON 文件,如使用 gcloud 创建 Google Cloud 服务账号中所述。您需要借助此文件来使用 Terraform 创建和注册集群

为 Config Connector 配置服务账号

如果要使用 Config Connector 注册 GKE 集群,请执行以下操作:

gcloud

  1. 确保已安装 Config Connector 插件。您应该具有高于 1.47.0 的 Config Connector 版本。

  2. 按照 Config Connector 说明创建服务账号。

  3. 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 是您为 [服务账号] 选择的显示名。
  4. 按照 Config Connector 说明使用此服务账号配置 Config Connector。

后续步骤

按照说明注册集群