使用 Google 群组设置 Connect 网关

本指南适用于需要设置 Connect 网关以供项目的用户账号使用并使用 Google 群组进行授权的平台管理员。在阅读本指南之前,您应该先熟悉我们的概览中的概念。如需向个人账号授权,请参阅默认设置

此设置允许用户使用 Google Cloud CLI、Connect 网关和 Google Cloud 控制台登录已配置的舰队集群。

此功能使用与 Google Workspace 或任何版本的 Cloud Identity 关联的 Google 群组。

支持的集群类型

如果您将 GKE 集群与 Connect 网关结合使用,则无需按照 GKE Identity Service 的整个设置操作即可使用 Google 群组进行授权。请改为按照为 RBAC 配置 Google 群组中的说明操作,这也允许用户使用 Google 群组从 Google Cloud 控制台登录 GKE 集群以进行访问权限控制。完成此操作后,请按照下文向 Google 群组授予 IAM 角色中的说明操作,以允许群组成员通过 Connect 网关访问集群。

您可以使用 Google 群组通过 Connect 网关为已注册的 GKE 集群、GKE on VMwareGoogle Distributed Cloud Virtual for Bare Metal(从 GKE Enterprise 1.13 开始)以及 GKE on AWSGKE on Azure(从 Kubernetes 1.25 版开始)设置访问权限控制。如果您需要升级本地集群以使用此功能,请参阅升级 GKE Enterprise Clusters for VMWare升级 GKE Enterprise Clusters on Bare Metal

如需在连接的集群或上述环境之外的其他 GKE 集群环境中使用此功能,请联系 Cloud Customer CareConnect Gateway 团队

运作方式

概览中所述,根据用户在 Google 群组(即在 Google Workspace 中创建的群组)中的成员资格授予用户对集群的访问权限是一种非常有用的方法。基于群组成员资格进行授权意味着您无需为每个账号设置单独的授权,这样可以使政策更易于管理且更易于审核。例如,您可以轻松与团队共享集群访问权限,而无需在单个用户加入或离开团队时从集群手动添加/移除他们。使用 GKE Identity Service 进行一些额外设置后,您可以配置 Connect 网关以获取登录集群的每一个用户的 Google 群组成员资格信息。然后,您可以在访问权限控制政策中使用这些群组信息。

下面显示了用户向启用了该服务的集群进行身份验证并对其运行命令的典型流程。为了成功执行此流程,集群上必须存在针对具有以下特点的群组的 RBAC 政策:

  1. 包含用户 alice@example.com 作为成员。

  2. gke-security-groups@example.com 的嵌套群组。

显示网关 Google 群组流程的示意图

  1. 用户 alice@example.com 使用其 Google 身份登录,如果该用户计划从命令行使用集群,则按使用 Connect 网关中的说明获取集群的网关 kubeconfig
  2. 用户运行 kubectl 命令或在 Google Cloud 控制台中打开 Google Kubernetes Engine 工作负载对象浏览器页面来发送请求。
  3. 该请求由使用 IAM 执行授权检查的服务进行接收。
  4. Connect 服务会将请求转发到集群上运行的 Connect Agent。请求中随附了用户的凭据信息,可在集群上进行身份验证和授权。
  5. Connect Agent 将请求转发到 Kubernetes API 服务器。
  6. Kubernetes API 服务器将请求转发给 GKE Identity Service,后者会验证请求。
  7. GKE Identity Service 将用户和群组信息返回到 Kubernetes API 服务器。然后,Kubernetes API 服务器可以根据集群中已配置的 RBAC 政策,使用这些信息对请求进行授权。

准备工作

  • 确保您已安装以下命令行工具:

    • 最新版本的 Google Cloud CLI,它是用于与 Google Cloud 交互的命令行工具。
    • Kubernetes 命令行工具 kubectl,用于与集群进行交互。

    如果您使用 Cloud Shell 作为与 Google Cloud 交互的 Shell 环境,则系统会为您安装这些工具。

  • 确保您已初始化用于您项目的 gcloud CLI。

  • 本指南假设您在项目中具有 roles/owner。如果您不是项目所有者,则可能还需要其他权限才能执行部分设置步骤。

  • 对于 Google Cloud 之外的集群,GKE Identity Service 需要从您的集群调用 Google Identity API。请检查您的网络政策是否要求出站流量通过代理。

设置用户和群组

确保您要与此功能搭配使用的群组按如下方式设置:

  1. 确保您的组织的 Google Workspace 中存在 gke-security-groups@YOUR-DOMAIN 格式的群组。如果您没有此类群组,请按照在您的组织中创建群组中的说明,使用 Google Workspace 管理控制台创建群组。
  2. 按照将某个群组添加到另一个群组中的说明,将您要用于访问权限控制的群组添加为 gke-security-groups 的嵌套群组。请勿将单个用户添加为 gke-security-groups 的成员。

要与此功能搭配使用的用户账号应使用与其群组相同的域名。

启用 API

如需将网关添加到您的项目中,请启用 Connect 网关 API 及其必需的依赖项 API。如果您的用户只想使用 Google Cloud 控制台对集群进行身份验证,则无需启用 connectgateway.googleapis.com,但需要启用其余的 API。

PROJECT_ID=example_project
gcloud services enable --project=${PROJECT_ID}  \
connectgateway.googleapis.com \
anthos.googleapis.com \
gkeconnect.googleapis.com \
gkehub.googleapis.com \
cloudresourcemanager.googleapis.com

设置 GKE Identity Service

Connect 网关的 Google 群组功能使用 GKE Identity Service 从 Google 获取群组成员资格信息。您可以在 GKE Identity Service 简介中详细了解 GKE Identity Service。

如果您将 GKE 集群与网关结合使用,则不需要设置 GKE Identity Service 即可使用 Google 群组访问权限控制。请改为按照为 RBAC 配置 Google 群组中的说明操作,然后继续向 Google 群组授予 IAM 角色,以允许群组成员通过 Connect 网关访问集群。

确保已安装 GKE Identity Service

从 1.7 版开始,GKE 集群默认安装 GKE Identity Service(但 Google 群组功能需要 1.13 版或更高版本)。您可以通过运行以下命令来确认其是否已正确安装到您的集群上:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get all -n anthos-identity-service

其中

USER_CLUSTER_KUBECONFIG 是集群的 kubeconfig 文件的路径。

配置 Google 群组支持

如果您使用的是 GKE on AWS 或 GKE on Azure,您的集群会自动配置为支持 Google 群组,您可以跳至向 Google 群组授予 IAM 角色

如果您使用的是 GKE on Bare Metal 或 GKE on VMware,则设置 GKE Identity Service 的方式决定了您需要如何配置 Google 群组功能。

如果您是首次使用 GKE Identity Service,则可以选择在舰队级别配置 Google 群组(推荐)或按集群设置。

如果您不是 GKE Identity Service 的新用户,请注意以下事项:

  • 如果您已在舰队级别为其他身份提供方设置 GKE Identity Service,则默认情况下 Google 群组功能处于启用状态。如需了解详情以及您可能需要进行的任何其他设置,请参阅下面的舰队部分。
  • 如果您已按集群为其他身份提供方设置 GKE Identity Service,请参阅下面的按集群部分,了解如何更新 Google 群组功能的配置。

舰队

您可以使用 Google Cloud 控制台或命令行在舰队级层配置对 Google 群组的访问权限。

如果您已使用其他身份提供方(如 Microsoft AD FS 或 Okta)在舰队级别配置 GKE Identity Service,则系统已默认在已配置集群上为您配置 Connect 网关 Google 群组功能,前提是无需使用代理即可访问 Google 身份提供方。

控制台

如果您之前没有为舰队设置 GKE Identity Service,请按照为 GKE Identity Service 配置集群中的说明操作。

选择集群并更新配置

  1. 在 Google Cloud 控制台中,打开 GKE Enterprise 功能页面。

    打开 GKE Enterprise 功能

  2. 功能表中,点击 Identity Service 行中的详细信息。此时将显示您项目的集群详细信息。

  3. 点击更新 Identity Service以打开设置窗格。

  4. 选择要配置的集群。您可以选择单个集群,也可以指定所有集群都使用相同的身份配置。

  5. 配置身份提供商部分中,您可以选择保留、添加、更新或移除身份提供商。

  6. 点击继续以进行下一个配置步骤。如果您为此设置选择了至少一个符合条件的集群,则系统会显示 Google 身份验证部分。

  7. 选择启用,为所选集群启用 Google 身份验证。如果您需要通过代理访问 Google 身份提供方,请输入代理详细信息。

  8. 点击更新配置。这会将身份配置应用于所选集群。

gcloud

如果您之前没有为舰队设置 GKE Identity Service,请按照为 GKE Identity Service 配置集群中的说明操作。在您的 auth-config.yaml 文件中仅指定以下配置:

spec:
  authentication:
  - name: google-authentication-method
    google:
      disable: false

使用代理配置 Google 群组访问权限

如果您需要通过代理访问 Google 身份提供方,请在 auth-config.yaml 文件中使用 proxy 字段。例如,如果您的集群位于专用网络中并且需要连接到公共身份提供方,则可能需要设置此字段。 即使您已为其他提供方配置了 GKE Identity Service,也必须添加此配置。

如需配置 proxy,以下是更新现有配置文件 auth-config.yamlauthentication 部分的方法。

  spec:
    authentication:
    - name: google-authentication-method
      google:
        disable: false
      proxy: PROXY_URL

其中

  • disable(可选)表示选择启用或停用集群的 Google 群组功能。默认情况下,此值设置为 false。如果您想停用此功能,可以将其设置为 true。

  • PROXY_URL(可选)是连接到 Google 身份的代理服务器地址。例如 http://user:password@10.10.10.10:8888

应用配置

如需将配置应用于集群,请运行以下命令:

gcloud container fleet identity-service apply \
--membership=CLUSTER_NAME \
--config=/path/to/auth-config.yaml

其中

CLUSTER_NAME 是集群在舰队内的唯一成员资格名称。

应用此配置后,其将由 GKE Identity Service 控制器管理。对 GKE Identity Service 客户端配置所做的任何本地更改都会由控制器协调回此设置中指定的配置。

按集群

如需将集群配置为使用 GKE Identity Service 和 Google 群组功能,您需要更新集群的 GKE Identity Service ClientConfig。这是用于集群配置的 Kubernetes 自定义资源类型 (CRD)。每个 GKE Enterprise 集群在 kube-public 命名空间中都有一个名为 defaultClientConfig 资源,您可以使用配置详细信息更新该资源。

如需修改配置,请使用以下命令。

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n kube-public edit clientconfig default

其中,USER_CLUSTER_KUBECONFIG 是集群的 kubeconfig 文件的路径。

如果 kubeconfig 中有多个上下文,则会使用当前上下文。 运行该命令之前,您可能需要将当前上下文重置为正确的集群。

以下示例演示了如何使用配置类型为 google 的新身份验证方法更新 ClientConfig 以启用 Google 群组功能。如果 internalServer 字段为空,请确保将其设置为 https://kubernetes.default.svc,如下所示。

spec:
  authentication:
  - google:
      audiences:
      - "CLUSTER_IDENTIFIER"
    name: google-authentication-method
    proxy: PROXY_URL
  internalServer: https://kubernetes.default.svc

其中

CLUSTER_IDENTIFIER(必需)表示集群的成员资格详细信息。您可以使用以下命令检索集群的成员资格详细信息:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get memberships membership -o yaml

其中

USER_CLUSTER_KUBECONFIG 是集群的 kubeconfig 文件的路径。在响应中,请查看 spec.owner.id 字段以检索集群的成员资格详细信息。

以下示例响应显示了集群的成员资格详细信息:

id: //gkehub.googleapis.com/projects/123456789/locations/global/memberships/xy-ab12cd34ef

对应于以下格式://gkehub.googleapis.com/projects/PROJECT_NUMBER/locations/global/memberships/MEMBERSHIP

向 Google 群组授予 IAM 角色

群组需要以下额外的 Google Cloud 角色才能通过网关与连接的集群进行交互:

  • roles/gkehub.gatewayAdmin。此角色允许群组成员访问 Connect 网关 API。
    • 如果群组成员只需要对连接的集群的只读权限,则可以改用 roles/gkehub.gatewayReader
    • 如果群组成员需要对连接的集群的读写权限,则可以改用 roles/gkehub.gatewayEditor
  • roles/gkehub.viewer。此角色允许群组成员查看已注册的集群成员资格。

您可以使用 gcloud projects add-iam-policy-binding 命令授予这些角色,如下所示:

gcloud projects add-iam-policy-binding --member=group:GROUP_NAME@DOMAIN --role=GATEWAY_ROLE PROJECT_ID
gcloud projects add-iam-policy-binding --member=group:GROUP_NAME@DOMAIN --role=roles/gkehub.viewer PROJECT_ID

其中

  • GROUP_NAME 是您要授予相应角色的 Google 群组
  • DOMAIN 是您的 Google Workspace 网域
  • GROUP_NAME@DOMAINgke-security-groups@DOMAIN 下的嵌套群组
  • GATEWAY_ROLEroles/gkehub.gatewayAdminroles/gkehub.gatewayReadergkehub.gatewayEditor 中的一个。
  • PROJECT_ID 是您的项目

如需详细了解如何授予 IAM 权限和角色,请参阅授予、更改和撤消对资源的访问权限

配置基于角色的访问权限控制 (RBAC) 政策

最后,每个集群的 Kubernetes API 服务器必须能够对来自指定群组且通过网关的 kubectl 命令授权。对于每个集群,您需要添加 RBAC 权限政策,用于指定群组对集群拥有哪些权限。

在以下示例中,您将了解如何向 cluster-admin-team 群组成员授予集群的 cluster-admin 权限,将政策文件保存为 /tmp/admin-permission.yaml,并将其应用于与当前上下文关联的集群。请务必在 gke-security-groups 群组下添加 cluster-admin-team 群组。

cat <<EOF > /tmp/admin-permission.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gateway-cluster-admin-group
subjects:
- kind: Group
  name: cluster-admin-team@example.com
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
EOF
# Apply permission policy to the cluster.
kubectl apply --kubeconfig=KUBECONFIG_PATH -f /tmp/admin-permission.yaml

如需详细了解如何指定 RBAC 权限,请参阅使用 RBAC 授权

后续步骤