设置 Connect 网关

本指南适用于需要设置 Connect 网关供其项目用户和服务账号使用的平台管理员。此设置使用户可以:

  • 通过 Google Cloud 控制台使用 Google Cloud 身份登录 Google Cloud 外部的注册集群。

  • 使用 kubectl 通过 Connect 网关访问集群。

此设置只允许根据用户和服务的个体 ID(而不是 Google 群组的成员身份)进行身份验证。如需设置其他群组支持,请参阅使用 Connect 群组设置 Connect 网关

如果您不熟悉 Connect 网关,请参阅我们的概览,了解基本概念及其工作原理。

准备工作

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

    • 最新版本的 Google Cloud CLI,用于与 Google Cloud 交互的命令行工具。
    • kubectl,用于对 Kubernetes 集群运行命令。如果您需要安装 kubectl,请按照相关说明操作

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

  2. 初始化 gcloud CLI 以用于您的项目,或运行以下命令向 gcloud CLI 授权并将您的项目设置为默认项目:

    gcloud auth login
    gcloud config set project PROJECT_ID
    

设置所需的 IAM 角色

本指南假定您在项目中有 roles/owner 权限。如果您不是项目所有者,请让项目所有者为您授予对项目的其他权限,以便您可以执行以下任务:

  • 如需启用 API,您需要拥有 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 具备的 serviceusage.services.enable 权限。项目所有者可以创建启用了 serviceusage.services.enable 权限的自定义角色,也可以为您授予 roles/serviceusage.serviceUsageAdmin,如下所示:

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member user:USER_EMAIL_ADDRESS \
       --role='roles/serviceusage.serviceUsageAdmin'
    
  • 如需向用户和服务账号授予 IAM 权限以使用 Connect 网关,您需要具有 Project IAM Admin 角色 (roles/resourcemanager.projectIamAdmin),项目所有者可以使用以下命令授予此角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member user:USER_EMAIL_ADDRESS \
       --role='roles/resourcemanager.projectIamAdmin'
    

启用 API

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

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

验证已注册的集群

只能通过 Connect 网关访问已向您的项目舰队注册的集群。在本地和其他公有云上创建 GKE 集群时,其会自动注册。但是,Google Cloud 上的 GKE 集群和另行关联的集群必须单独注册。如果您需要注册集群,请按照集群注册指南中的说明操作。请注意,GKE 集群必须注册到舰队才能使用网关。

如需验证集群是否已注册,请运行以下命令:

gcloud container fleet memberships list

您应该会看到所有已注册集群的列表,如以下示例输出所示:

NAME         EXTERNAL_ID
cluster-1    0192893d-ee0d-11e9-9c03-42010a8001c1
cluster-2    f0e2ea35-ee0c-11e9-be79-42010a8400c2

向用户授予 IAM 角色

对集群的访问权限由 Identity and Access Management (IAM) 控制。使用 kubectl 访问集群所需的 IAM 角色与访问 Google Cloud 控制台中的集群的角色略有不同,如以下部分所述。

通过 kubectl 授予角色访问权限

用户和服务账号至少需要以下 IAM 角色才能使用 kubectl 通过 Connect 网关与集群进行交互,除非用户在项目中具有 roles/owner

  • roles/gkehub.gatewayAdmin:此角色允许用户访问 Connect Gateway API 以使用 kubectl 来管理集群。

    • 如果用户只需要对连接的集群的只读权限,您可以改为授予 roles/gkehub.gatewayReader

    • 如果用户需要所连接集群的读写权限,您可以授予 roles/gkehub.gatewayEditor

  • roles/gkehub.viewer:此角色可让用户检索集群 kubeconfigs

如需详细了解这些角色具备的权限,请参阅 IAM 文档中的 GKE Hub 角色

您可以使用以下命令授予这些角色:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=MEMBER \
    --role=GATEWAY_ROLE
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=MEMBER \
    --role=roles/gkehub.viewer

其中:

  • MEMBER 是用户或服务账号,格式为 user|serviceAccount:emailID,例如:

    • user:alice@example.com
    • serviceAccount:test_sa@example-project.iam.gserviceaccount.com
  • GATEWAY_ROLEroles/gkehub.gatewayAdminroles/gkehub.gatewayReaderroles/gkehub.gatewayEditor

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

授予通过 Google Cloud 控制台进行访问的角色

希望使用 Google Cloud 控制台与 Google Cloud 外部的集群进行交互的用户至少需要拥有以下 IAM 角色才能查看集群:

  • roles/container.viewer。此角色允许用户在 Google Cloud 控制台中查看 GKE 集群页面和其他容器资源。如需详细了解此角色具备的权限,请参阅 IAM 文档中的 Kubernetes Engine 角色

  • roles/gkehub.viewer。此角色允许用户在 Google Cloud 控制台中查看 Google Cloud 外部的集群。请注意,这是访问 kubectl 所需的角色之一。如果您已向用户授予此角色,则无需再次授予。如需详细了解此角色具备的权限,请参阅 IAM 文档中的 GKE Hub 角色

    在以下命令中,将 PROJECT_ID 替换为舰队宿主项目的 ID。另外,将 MEMBER 替换为采用 user|serviceAccount:emailID 格式的用户电子邮件地址或服务账号,例如:

    • user:alice@example.com
    • serviceAccount:test_sa@example-project.iam.gserviceaccount.com
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=MEMBER \
        --role=roles/container.viewer
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=MEMBER \
        --role=roles/gkehub.viewer
    

如需详细了解如何授予 IAM 角色,请参阅 IAM 文档中的管理对项目、文件夹和组织的访问权限

配置 RBAC 授权

每个集群的 Kubernetes API 服务器必须能够对来自 Google Cloud 控制台或来自 kubectl 命令(来自指定用户和服务账号并通过 Connect 网关)的请求授权。为此,您需要在要设为可通过网关访问的每个集群上更新基于角色的访问权限控制 (RBAC) 政策。您需要添加或更新以下政策:

  • 模拟政策,用于授权 Connect 代理代表用户向 Kubernetes API 服务器发送请求。
  • 权限政策:用于指定用户对集群拥有哪些权限。这可以是集群级角色(如 clusterrole/cluster-adminclusterrole/cloud-console-reader),也可以是命名空间级角色(如 role/default/pod-reader)。

(可选)创建 cloud-console-reader 角色

想要在 Google Cloud 控制台中访问集群资源并且经过身份验证的用户需要具备相关的 Kubernetes 权限。如果您不想向这些用户授予更广泛的权限(例如集群管理员的权限),则可以创建一个包含查看集群节点、永久性卷、pod 和存储类别的最低权限的自定义 RBAC 角色。您可以通过在集群中创建 ClusterRole RBAC 资源 cloud-console-reader 来定义这组权限。

cloud-console-reader 会向用户授予针对集群的节点、永久性卷、pod 和存储类别的 getlistwatch 权限,从而允许他们查看这些资源的详细信息。

kubectl

要创建 cloud-console-reader ClusterRole 并将其应用于集群,请运行以下命令:

cat <<EOF > cloud-console-reader.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cloud-console-reader
rules:
- apiGroups: [""]
  resources: ["nodes", "persistentvolumes", "pods"]
  verbs: ["get", "list", "watch"]
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get", "list", "watch"]
EOF
kubectl apply -f cloud-console-reader.yaml

然后,您可以在设置权限政策时向用户授予此角色,如下一部分所述。

创建和应用所需的 RBAC 政策

下面展示了如何创建和应用所需的 RBAC 政策。最简单的方法是使用 gcloud CLI 来生成和应用相应的政策。或者,您也可以根据自己的偏好,使用 kubectl 创建和应用 RBAC 政策文件。

gcloud

如需使用 gcloud CLI 生成政策并将其应用于所选集群,请运行以下命令:

gcloud container fleet memberships generate-gateway-rbac  \
    --membership=MEMBERSHIP_NAME \
    --role=ROLE \
    --users=USERS \
    --project=PROJECT_ID \
    --kubeconfig=KUBECONFIG_PATH \
    --context=KUBECONFIG_CONTEXT \
    --apply

替换以下内容:

  • MEMBERSHIP_NAME:用于在集群的舰队中唯一表示该集群的名称。您可以参阅获取舰队成员资格状态,了解如何检查集群的成员资格名称。
  • ROLE:您要为集群上的用户授予的 Kubernetes 角色,例如 clusterrole/cluster-adminclusterrole/cloud-console-readerrole/mynamespace/namespace-reader。此角色必须事先存在,您才能运行该命令。
  • USERS:要向其授予权限的用户(用户账号或服务账号)的电子邮件地址(以逗号分隔的列表)。例如:--users=foo@example.com,test-acct@test-project.iam.gserviceaccount.com
  • PROJECT_ID:在其中注册集群的项目的 ID。
  • KUBECONFIG_PATH:存储包含集群条目的 kubeconfig 的本地文件路径。在大多数情况下为 $HOME/.kube/config
  • KUBECONFIG_CONTEXT:kubeconfig 文件中显示的集群上下文。您可以通过运行 kubectl config current-context 从命令行获取当前上下文。无论您是否使用当前上下文,都请通过运行类似以下示例的简单命令来确保它可用于访问集群:

    kubectl get namespaces \
      --kubeconfig=KUBECONFIG_PATH \
      --context=KUBECONFIG_CONTEXT
    

运行 gcloud container fleet memberships generate-gateway-rbac 后,您会在输出末尾看到如下内容:

connectgateway_example-project-12345_global_example-membership-name

这是用于通过 Connect 网关访问集群的上下文。

如需详细了解 generate-gateway-rbac 命令,请参阅 gcloud CLI 参考指南

如果您在运行此命令时看到 ERROR: (gcloud.container.hub.memberships) Invalid choice: 'generate-gateway-rbac' 之类的错误,请按照更新指南更新您的 Google Cloud CLI。

kubectl

以下示例显示如何为用户 (foo@example.com) 和服务账号 (test@example-project.iam.gserviceaccount.com) 创建适当的政策,然后为他们授予集群的 cluster-admin 权限并将政策文件保存为 /tmp/gateway-rbac.yaml。随后,系统会将政策应用到与当前上下文关联的集群:

cat <<EOF > /tmp/gateway-rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: gateway-impersonate
rules:
- apiGroups:
  - ""
  resourceNames:
  - foo@example.com
  - test@example-project.iam.gserviceaccount.com
  resources:
  - users
  verbs:
  - impersonate
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gateway-impersonate
roleRef:
  kind: ClusterRole
  name: gateway-impersonate
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: connect-agent-sa
  namespace: gke-connect
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gateway-cluster-admin
subjects:
- kind: User
  name: foo@example.com
- kind: User
  name: test@example-project.iam.gserviceaccount.com
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
EOF
# Apply policies to the cluster.
kubectl apply --kubeconfig=KUBECONFIG_PATH  -f /tmp/gateway-rbac.yaml

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

VPC Service Controls 支持

VPC Service Controls 为 Google Cloud 服务提供一层额外的、独立于 Identity and Access Management (IAM) 的安全防御。IAM 实现了精细基于身份的访问权限控制,而 VPC Service Controls 可实现更广泛的基于上下文的边界安全性,包括控制跨边界数据出站流量。例如,您可以指定只有某些项目可以访问您的 BigQuery 数据。您可以参阅 VPC Service Controls 概览,详细了解 VPC Service Controls 如何保护您的数据。

在确保可以从指定的服务边界访问使用 Connect 网关所需的 API 后,您可以将 VPC Service Controls 与该网关结合使用以提高数据安全性。

后续步骤