设置 Connect 网关
本指南适用于需要设置 Connect 网关供其项目用户和服务帐号使用的平台管理员。在阅读本指南之前,您应该先熟悉我们的概览中的概念。
如从 Cloud Console 登录到集群中所述,此设置让用户既可以直接使用 Connect 网关,又可以使用 Cloud Console 中的 Google Cloud 身份连接到 Google Cloud 之外的已注册集群。
此设置只允许根据用户和服务的个体 ID(而不是 Google 群组的成员身份)进行授权。如需设置其他群组支持,请参阅使用 Connect 群组设置 Connect 网关。
准备工作
确保您已安装以下命令行工具:
- 最新版本的 Google Cloud CLI,用于与 Google Cloud 交互的命令行工具。
kubectl
,用于对 Kubernetes 集群运行命令。如果您需要安装kubectl
,请按照这些说明操作
如果您使用 Cloud Shell 作为与 Google Cloud 交互的 Shell 环境,则系统会为您安装这些工具。
确保您已初始化用于您项目的 gcloud CLI。
本指南假设您在项目中具有
roles/owner
。如果您不是项目所有者,则可能还需要其他权限才能执行部分设置步骤。
启用 API
如需将网关添加到您的项目中,请启用 Connect 网关 API 及其必需的依赖项 API。如果您的用户只想使用 Cloud Console 对集群进行身份验证,则无需启用 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
验证已注册的集群
只能通过 Connect 网关访问已向您的项目队列注册的集群。在本地和其他公有云上创建 Anthos 集群时,其会自动注册。但是,Google Cloud 上的 GKE 集群和另行关联的集群必须单独注册。如果您需要注册集群,请按照集群注册指南中的说明操作。请注意,GKE 集群必须向 Connect Agent 注册才能使用网关。
如需验证集群是否已注册,请运行以下命令:
gcloud container fleet memberships list
您应该会看到所有已注册集群的列表,如以下示例输出所示:
NAME EXTERNAL_ID
cluster-1 0192893d-ee0d-11e9-9c03-42010a8001c1
cluster-2 f0e2ea35-ee0c-11e9-be79-42010a8400c2
向用户授予 IAM 角色
用户和服务帐号需要以下附加 Google Cloud 角色才能通过网关与连接的集群交互,除非用户或帐号在项目中具有 roles/owner
:
roles/gkehub.gatewayAdmin
。此角色允许用户访问 Connect 网关 API。- 如果用户只需要对连接的集群的只读权限,则可以改用
roles/gkehub.gatewayReader
。
- 如果用户只需要对连接的集群的只读权限,则可以改用
roles/gkehub.viewer
。此角色允许用户检索集群凭据。
您可以使用 gcloud projects add-iam-policy-binding
命令授予这些角色,如下所示:
# [PROJECT_ID] is the project's unique identifier.
# [ACCOUNT_ADDRESS] is an email address, which can belong to either a user account or a service account
PROJECT_ID=example_project
# MEMBER should be of the form `user|serviceAccount:$ACCOUNT_ADDRESS`, for example:
# MEMBER=user:foo@example.com
# MEMBER=serviceAccount:test@example-project.iam.gserviceaccount.com
MEMBER=user:foo@example.com
# GATEWAY_ROLE should be `roles/gkehub.gatewayAdmin` or `roles/gkehub.gatewayReader`.
GATEWAY_ROLE=roles/gkehub.gatewayAdmin
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
如需详细了解如何授予 IAM 权限和角色,请参阅授予、更改和撤消对资源的访问权限。
授予通过 Cloud Console 进行访问的角色
对于只想使用 Cloud Console 与连接的集群进行交互的用户,需要以下角色:
roles/gkehub.viewer
。此角色允许用户在 GKE 控制台页面中查看集群。roles/container.viewer
。此角色允许用户在 Cloud Console 中查看容器资源。
配置基于角色的访问权限控制 (RBAC) 政策
最后,每个集群的 Kubernetes API 服务器必须能够对来自指定用户和服务帐号且通过网关的 kubectl
命令授权。为此,您需要在要设为可通过网关访问的每个集群上更新 RBAC 政策。您需要更新或添加两个政策:
- 模拟政策,用于授权 Connect 代理代表用户向 Kubernetes API 服务器发送请求。
- 权限政策:用于指定用户对集群拥有哪些权限。这可以是集群级角色(如
clusterrole/cluster-admin
),也可以是命名空间级角色(如role/default/pod-reader
)。
下文介绍了如何创建和应用此类政策。最简单的方法是使用 gcloud CLI 来生成和应用相应的政策。或者,您也可以创建 RBAC 政策文件,并使用 kubectl
进行应用。
gcloud
如需使用 gcloud CLI 生成政策并将其应用于所选集群,请运行以下命令:
gcloud alpha container hub memberships generate-gateway-rbac \
--membership=MEMBERSHIP_NAME \
--role=ROLE \
--users=USERS \
--project=PROJECT_ID \
--kubeconfig=KUBECONFIG_PATH \
--context=KUBECONFIG_CONTEXT \
--apply
替换以下内容:
- MEMBERSHIP_NAME:用于在集群的舰队中唯一表示该集群的名称。您可以参阅查看已注册集群,了解如何查看集群的成员资格名称。
- ROLE:您要为集群上的用户授予的权限角色,例如
clusterrole/cluster-admin
。此角色必须事先存在,您才能运行该命令。 - 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
从命令行获取此值。
如需详细了解 generate-gateway-rbac
命令,请参阅参考指南。
如果您在运行此命令时看到 ERROR: (gcloud.alpha.container.hub.memberships) Invalid choice: 'generate-gateway-rbac'
之类的错误,请按照更新指南更新您的 Google Cloud CLI,注意务必更新 alpha
组件。
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 与该网关结合使用以提高数据安全性。
后续步骤
- 了解如何使用 Connect 网关通过命令行连接到集群。
- 如需了解如何将 Connect 网关用作 DevOps 自动化的一部分的示例,请参阅与 Cloud Build 集成教程。