使用外部身份向 GKE on Azure 进行身份验证

员工身份联合可向非 Google 身份授予对 Google Cloud 服务的访问权限。在 GKE on Azure 环境中,这意味着您可以使用现有的外部身份来创建或访问 GKE 集群,而无需依赖 Google 凭据。

使用员工身份联合的优势如下:

  • 您无需在不同的平台或提供方之间反复输入账号。
  • 您只需设置一次权限,而无需在多个平台上进行配置。
  • 简化用户访问流程,因为需要的登录次数和密码更少。

准备工作

如需允许外部用户或群组访问 GKE 集群,您需要执行以下步骤:

  1. 为了保证外部用户或群组可以使用 GKE on Azure API,请配置员工身份联合:

  2. 为外部用户或群组分配 gkemulticloud.viewer 角色,以便他们可以访问集群。分配 container.clusterViewer 角色以便在 Google Cloud 控制台中查看集群。

    请注意,角色是权限的集合。为实体(用户、群组或服务账号)分配角色时,您将为该实体授予该角色包含的所有权限。

    用户

    对于单个用户,您需要分配 gkemulticloud.viewer 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role="roles/gkemulticloud.viewer" \
      --member="principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE"
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • WORKFORCE_POOL_ID:唯一标识 Google Cloud 中的员工身份池的 ID。设置 ID 格式时,请确保遵循 IAM 文档中查询参数下提供的推荐准则。
    • SUBJECT_VALUE:唯一标识外部用户的 ID。例如,ID 可以是电子邮件地址(如 alex@cymbalgroup.com)。

    群组

    对于群组,您需要分配 gkemulticloud.viewer 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role="roles/gkemulticloud.viewer" \
      --member="principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID"
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • WORKFORCE_POOL_ID:唯一标识 Google Cloud 中的员工身份池的 ID。设置 ID 格式时,请确保遵循 IAM 文档中查询参数下提供的推荐准则。
    • GROUP_ID:唯一标识外部群组的 ID。
  3. 可选:为外部用户或群组分配适当的 Identity and Access Management (IAM) 角色。仅当您要向用户或群组授予创建或更新集群的权限时,才需要执行此步骤;仅访问集群时不需要

    用户

    对于单个用户,您需要分配 gkemulticloud.admin 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role="roles/gkemulticloud.admin" \
      --member="principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE"
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • WORKFORCE_POOL_ID:唯一标识 Google Cloud 中的员工身份池的 ID。设置 ID 格式时,请确保遵循 IAM 文档中查询参数下提供的推荐准则。
    • SUBJECT_VALUE:唯一标识外部用户的 ID。例如,ID 可以是电子邮件地址(如 alex@cymbalgroup.com)。

    群组

    对于群组,您需要分配 gkemulticloud.admin 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --role="roles/gkemulticloud.admin" \
      --member="principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID"
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • WORKFORCE_POOL_ID:唯一标识 Google Cloud 中的员工身份池的 ID。设置 ID 格式时,请确保遵循 IAM 文档中查询参数下提供的推荐准则。
    • GROUP_ID:唯一标识外部群组的 ID。

如需详细了解 GKE on Azure 所需的 API 角色和权限,请参阅 API 角色和权限

授予对 GKE 集群的外部访问权限

您可以通过以下两种方法设置员工身份联合,以便外部用户或群组可以访问您的 GKE 集群。

方法 1 要求您定义 RBAC 文件并将其应用于集群。此方法可以精细控制权限,例如只允许用户对资源进行只读访问,而不授予他们更广泛的访问权限。

方法 2 要求您在创建或更新集群时指定外部身份的访问权限。此方法会向指定用户或群组授予完整的管理员权限。

选择最适合您所需的访问权限控制级别的方法:方法 1 适合用于授予更精细的权限,方法 2 则适合用于授予完整的集群管理员权限。

方法 1:使用 RBAC 文件

第一种用来授予对 GKE 集群的外部访问权限的方法涉及使用 RBAC 文件。请按照以下步骤操作:

  1. 定义 RBAC YAML 文件,其中包含主体(用户或群组)以及您要在 GKE 集群中为这些主体授予的权限。以下是单个用户以及群组的 RBAC YAML 配置示例:

    用户

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: gateway-cluster-admin-user
    subjects:
    - kind: User
      name: principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    

    替换以下内容:

    • WORKFORCE_POOL_ID:唯一标识 Google Cloud 中的员工身份池的 ID。设置 ID 格式时,请确保遵循 IAM 文档中查询参数下提供的推荐准则。
    • SUBJECT_VALUE:唯一标识外部用户的 ID。例如,ID 可以是电子邮件地址(如 alex@cymbalgroup.com)。

    群组

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: gateway-cluster-admin-group
    subjects:
    - kind: Group
      name: principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    

    替换以下内容:

    • WORKFORCE_POOL_ID:唯一标识 Google Cloud 中的员工身份池的 ID。设置 ID 格式时,请确保遵循 IAM 文档中查询参数下提供的推荐准则。
    • GROUP_ID:唯一标识外部群组的 ID。
  2. 使用以下命令指定要配置的 GKE 集群,并将其设置为活跃上下文:

      kubectl config use-context CLUSTER_CONTEXT
    

    CLUSTER_CONTEXT 替换为集群的相应上下文名称。

  3. 将所需的 GKE 集群设置为活跃上下文后,使用以下命令将 RBAC 配置应用于该集群:

    kubectl apply -f RBAC_PATH
    

    RBAC_PATH 替换为您创建或修改的 RBAC 文件的路径。

    运行此命令后,RBAC 配置中的指定用户或群组将具有访问和管理目标 GKE 集群的权限(具体权限遵循定义的 RBAC 规则)。

  4. 如果您需要对权限进行后续更改,可修改 RBAC 文件,然后重复上述步骤将其重新应用于集群。

方法 2:在创建或更新集群期间向外部身份授予访问权限

方法 2 会在集群创建或更新期间向外部身份授予访问权限。

如需创建集群,请按照创建集群中的步骤操作。如需更新集群,请按照更新集群中的步骤操作。

运行 gcloud 命令创建或更新集群时,指定 admin-users 和/或 admin-groups 参数,如下所示:

gcloud container azure clusters [create|update] CLUSTER_NAME \
    --location=LOCATION
    --admin-users=principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject SUBJECT_VALUE \
    --admin-groups=principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID

替换以下内容:

  • CLUSTER_NAME:您的集群的名称。
  • LOCATION:托管集群的 Google Cloud 区域。
  • WORKFORCE_POOL_ID:唯一标识 Google Cloud 中的员工身份池的 ID。设置 ID 格式时,请确保遵循 IAM 文档中查询参数下提供的推荐准则。
  • SUBJECT_VALUE:唯一标识外部用户的 ID。例如,ID 可以是电子邮件地址(如 alex@cymbalgroup.com)。
  • GROUP_ID:唯一标识外部群组的 ID。

向外部 ID 授予对 GKE 集群的访问权限的摘要

执行方法 1 或方法 2 后,指定的外部用户或群组可以使用 Google Cloud 控制台连接集群及查看集群详细信息。他们还可以通过 gcloud CLI 将 kubectl 与身份搭配使用来管理、操作集群以及与集群通信。

如需对 GKE 集群执行 kubectl 命令,请参阅如何生成 kubeconfig 条目