设计资源之间的访问边界

本文档介绍了使用组织、项目和 Kubernetes 集群在 Google Distributed Cloud (GDC) 网闸隔离配置中设计工作负载层次结构和隔离的最佳实践。本指南在高效资源使用、工作负载隔离和易于操作之间取得了平衡。

设计组织,以便在客户之间实现物理和逻辑隔离

Organization 资源是单个客户拥有的所有资源的根。您可以通过角色绑定和网络政策,在组织内的工作负载之间定义精细的访问权限控制。如需了解详情,请参阅身份和访问权限管理。

GDC 区域内的每个组织都为计算基础设施提供物理隔离,并为网络、存储和其他服务提供逻辑隔离。一个组织中的用户无权访问另一个组织中的资源,除非明确授予了访问权限。默认情况下,不允许从一个组织到另一个组织的网络连接,除非明确配置为允许从一个组织传出数据以及传入到另一个组织。

定义可共享组织的工作负载范围

在公司环境中,组织的范围可能会因公司如何定义信任边界而异。有些公司可能更愿意为公司中的不同实体创建多个组织资源。例如,如果各部门要求其工作负载在物理和管理上完全分离,则每个公司部门都可能是 GDC 的独立客户,拥有独立的组织。

一般来说,我们建议您根据以下信号将多个工作负载分组到单个组织中:

  • 工作负载可以共享依赖项。例如,这可能是共享数据源、工作负载之间的连接或共享监控工具。
  • 工作负载可以共享管理信任根。可以信任同一管理员对组织中的所有工作负载拥有特权访问权限。
  • 只要有足够的逻辑隔离,工作负载就可以与同一组织中的其他工作负载共享底层物理基础设施。
  • 同一预算负责人负责工作负载预算总额。 如需详细了解如何查看组织的汇总费用或每个工作负载的精细分析,请参阅结算页面。
  • 工作负载可用性要求必须遵循多可用区距离的高可用性要求。

设计项目,以在工作负载之间实现逻辑隔离

在组织内,我们建议预配多个项目,以便在资源之间创建逻辑分隔。同一组织中的项目可能会共享底层物理基础设施,但项目用于根据 Identity and Access Management (IAM) 政策和网络政策,通过逻辑边界分隔工作负载。

在设计项目边界时,请考虑资源可以共享的最大功能集,例如角色绑定、网络政策或可观测性要求。将可以共享此功能的资源分组到一个项目中,并将无法共享此功能的资源移至另一个项目。

在 Kubernetes 术语中,项目是一个 Kubernetes 命名空间,在组织中的所有集群中预留。虽然命名空间在多个集群中预留,但这并不意味着 Pod 会自动在所有集群中调度。调度到特定集群的 Pod 仍会调度到该特定集群。

下图展示了如何将角色绑定应用于跨多个集群的项目。

GDC RBAC 政策

角色绑定在项目级设置,用于定义谁可以对哪种资源类型执行哪些操作。虚拟机或 Pod 等工作负载会部署到项目中,对这些工作负载的访问权限由角色绑定控制。角色绑定会一致地应用于基于虚拟机的工作负载和基于容器的工作负载,无论它们部署到哪个集群。

下图展示了网络政策如何管理项目之间的访问权限。 Backend Project、Frontend Project 和 Database Project 之间的跨项目通信已停用。不过,每个项目中的资源可以相互通信。

网络政策在项目级层设置,用于选择性地允许资源之间的网络访问。默认情况下,一个项目中的所有资源都可以在内部网络上相互通信,而一个项目中的资源无法与另一个项目中的资源通信。无论资源是否部署到同一集群,网络政策的这种行为都适用。

您还可以定义 ProjectNetworkPolicy 自定义资源,以启用项目间通信。此政策是为每个项目定义的,用于允许来自其他项目的入站流量。下图展示了为 Backend Project 定义的 ProjectNetworkPolicy 自定义资源,用于启用从 Frontend Project 和 Database Project 的数据传输。

GDC 项目级政策

此外,监控堆栈会收集整个组织的指标,但您可以在资源层次结构的各个级别进行过滤和查询。您可以使用集群或命名空间等实体查询指标。

为每个软件开发环境创建项目

对于每个工作负载,我们建议为每个软件开发环境创建单独的项目。软件开发环境是 GDC 领域内的一个区域,用于执行与指定生命周期阶段对应的所有操作。例如,您可能拥有用于测试、开发和生产的软件开发环境。通过分离软件开发环境,您可以精细地定义角色绑定和网络政策,从而使在用于非生产环境的项目中所做的更改不会影响生产环境。

在项目中授予资源级角色绑定

根据您的团队结构和要求,您可以允许开发者修改其管理的项目中的任何资源,也可以要求更精细的访问权限控制。在项目中,您可以授予精细的角色绑定,让个别开发者可以访问项目中的部分(而非全部)资源。例如,团队可能有一位数据库管理员,该管理员必须管理数据库,但不能修改其他资源,而团队中的软件开发者不得拥有修改数据库的权限。

设计集群以实现 Kubernetes 操作的逻辑隔离

Kubernetes 集群不是硬性租户边界,因为角色绑定和网络政策适用于项目,而不适用于 Kubernetes 集群。Kubernetes 集群和项目之间存在多对多关系。您可能在单个项目中拥有多个 Kubernetes 集群,也可能拥有跨多个项目的单个 Kubernetes 集群。