本文档介绍了在 Google Distributed Cloud (GDC) 气隙环境中,使用组织、项目和 Kubernetes 集群设计工作负载层次结构和分离的最佳实践。此指南旨在平衡资源使用效率、工作负载隔离和操作简易性。
设计组织以实现客户之间的物理隔离和逻辑隔离
Organization
资源是单个客户拥有的所有资源的根。通过角色绑定和网络政策,可以定义组织内工作负载之间的精细访问权限控制。如需了解详情,请参阅身份和访问权限管理。
GDC 区域内的每个组织都为计算基础架构提供物理隔离,并为网络、存储和其他服务提供逻辑隔离。除非获得明确授权,否则一个组织中的用户无法访问另一个组织中的资源。默认情况下,不允许从一个组织到另一个组织的网络连接,除非明确配置为允许从一个组织传出数据并传入另一个组织。
定义可共享组织的 workload 的范围
在公司环境中,组织的范围可能会因公司定义信任边界的方式而异。有些公司可能更倾向于为公司中的不同实体创建多个组织资源。例如,如果公司各部门需要完全在物理上和管理上分离其工作负载,则每个部门都可以是 GDC 的独立客户,拥有独立的组织。
一般来说,我们建议您根据以下信号将多个工作负载归入一个组织:
- 工作负载可以共享依赖项。例如,这可能是共享数据源、工作负载之间的连接或共享监控工具。
- 工作负载可以共享管理信任根。同一管理员可以获得组织中所有工作负载的特权访问权限。
- 工作负载可以与同一组织中的其他工作负载共享底层物理基础架构,前提是具有足够的逻辑隔离。
- 同一预算持有者负责汇总的工作负载预算。如需详细了解如何查看组织的汇总费用或按工作负载进行精细分析,请参阅结算页面。
- 工作负载可用性要求必须遵循多可用区距离的高可用性要求。
设计项目以实现工作负载之间的逻辑隔离
在组织内,我们建议预配多个项目,以在资源之间创建逻辑分离。同一组织中的项目可能会共用底层物理基础设施,但项目用于根据 Identity and Access Management (IAM) 政策和网络政策以逻辑边界分隔工作负载。
设计项目边界时,请考虑可由资源共享的最大功能集,例如角色绑定、网络政策或可观测性要求。将可以共享此功能的资源归入一个项目,并将无法共享此功能的资源移至另一个项目。
在 Kubernetes 中,项目是指在组织的所有集群中预留的 Kubernetes 命名空间。虽然命名空间可在多个集群中预留,但这并不意味着 Pod 会自动调度到所有集群中。调度到特定集群的 pod 会继续调度到该特定集群。
下图显示了如何将角色绑定应用于跨多个集群的项目。
角色绑定是在项目级层设置的,用于定义谁可以对哪种资源类型执行什么操作。虚拟机或 pod 等工作负载会部署到项目中,对这些工作负载的访问权限由角色绑定控制。无论基于虚拟机的工作负载和基于容器的工作负载部署到哪个集群,角色绑定都会始终如一地应用于这些工作负载。
下图展示了网络政策如何管理项目之间的访问权限。
已停用 Backend Project
、Frontend Project
和 Database Project
之间的跨项目通信。不过,每个项目中的资源可以相互通信。
网络政策在项目级层设置,用于有选择地允许资源之间的网络访问。默认情况下,一个项目中的所有资源都可以在内部网络上相互通信,而一个项目中的资源无法与另一个项目中的资源通信。无论资源是否部署到同一集群,网络政策的这种行为都适用。
您还可以定义 ProjectNetworkPolicy
自定义资源,以实现项目间通信。此政策是为每个项目定义的,用于允许来自其他项目的入站流量。下图展示了为 Backend Project
定义的 ProjectNetworkPolicy
自定义资源,用于从 Frontend Project
和 Database Project
启用数据传入。
此外,监控堆栈会收集整个组织的指标,但您可以在资源层次结构的各个层级进行过滤和查询。您可以查询包含集群或命名空间等实体的指标。
为每个部署环境创建项目
对于每个工作负载,我们建议您为生产、开发和所需的任何其他部署环境创建单独的项目。通过分离生产和开发部署环境,您可以精细地定义角色绑定和网络政策,从而确保在用于开发的项目中进行的更改不会影响生产环境。
在项目内授予资源级角色绑定
根据您的团队结构和要求,您可以允许开发者修改其所管理项目中的任何资源,也可以要求更精细的访问权限控制。在项目中,您可以授予精细的角色绑定,让个别开发者访问项目中的部分资源,而不是所有资源。例如,某个团队可能有一位数据库管理员,他必须管理数据库,但不能修改其他资源;而该团队的软件开发者则不得拥有修改数据库的权限。
设计集群以实现 Kubernetes 操作的逻辑隔离
Kubernetes 集群不是严格的租户边界,因为角色绑定和网络政策适用于项目,而不是 Kubernetes 集群。Kubernetes 集群和项目之间存在多对多关系。您可以在单个项目中拥有多个 Kubernetes 集群,也可以拥有跨多个项目的单个 Kubernetes 集群。