多租户软件架构使多个用户能够共享软件应用程序的单个实例及其底层资源,是大多数 SaaS 产品的基础。

什么是多租户?

在多租户软件架构(也称为软件多租户)中,软件应用程序(及其底层数据库和硬件)的单个实例为多个租户(或用户帐户)提供服务。租户可以是单个用户,但更常见的是,它是一组用户(例如客户组织),在应用程序实例中共享公共访问权限和特权。每个租户的数据与共享应用程序实例的其他租户隔离且不可见,确保所有租户的数据安全和隐私。

软件多租户是交付软件即服务 (SaaS) 的架构。如果您的组织使用 华炎云Salesforce.com 或其他基于云的 SaaS 产品,您就是多租户产品中的租户。

多租户架构的好处

与单租户架构(每个租户获得自己的应用程序、数据库和支持硬件基础设施的实例)相比,多租户架构为软件提供商和租户客户提供了显着的好处,包括:

  • 更低的成本。

    因为软件提供商可以从单个应用程序实例和支持基础设施为多个租户提供服务(并且因为租户分担软件维护、基础设施和数据中心运营的负担),所以持续成本往往低于单一租户的成本。 SaaS 软件通常根据用户数量、使用级别或应用程序内管理的数据量以可预测的月度或年度订阅价格提供。

  • 可扩展性。

    租户可以按需扩展——新用户可以访问软件中的同一个实例,通常是为了增加订阅率。

  • 无需编码即可定制。

    SaaS 多租户产品具有高度可配置性,因此每个租户客户都可以根据其特定业务目的定制应用程序,而无需进行昂贵、耗时且有时具有风险的定制开发。

  • 持续、一致的更新和维护。

    多租户软件提供商负责更新和补丁。添加新功能和/或应用修复程序,客户无需付出任何努力,只需一次(与单租户架构相反,在单租户架构中,提供商必须更新软件的每个实例)。

  • 提高租户的生产力

    无需管理基础设施或软件意味着租户可以自由地专注于更重要的任务。

Kubernetes 多租户技术模型

在下面的架构中,中央管理控制台用于创建 Kubernetes 集群,这些集群在支持虚拟化和裸机服务器的 IaaS 层上运行。管理平面还提供了一个 UI 和 API 来创建租户用户,这些租户用户被分配了具有资源隔离和网络隔离策略的特定命名空间。每个租户工作负载都具有适当的隔离级别和资源可用性。在典型的场景中,每个租户(定义为一组多个用户)都被分配了一个单独的命名空间。因此,每个可隔离的实体都有自己独立的命名空间,这不仅允许租户隔离,还允许合理的资源效率。此模型还允许将多个命名空间添加到给定的租户集。这种模式的缺点是,从资源共享的角度来看,它仍然相对低效。但是,每个租户都非常安全,不会受到其他人的入侵。集群管理员负责执行资源配额、CNI 网络策略和 ​​Pod 安全策略,并通过 RBAC 将它们绑定。

华炎魔方的 Kubernetes 多租户模型的实施步骤

在充分调研客户需求后,华炎魔方使用独立数据库的模型,基于K8S云原生技术,每个华炎魔方租户均拥有一套独立的存储、数据库、代码和命名空间,实现了100%的租户数据隔离,并可以随时迁移到私有部署模式。

为每个租户分配独立命名空间

Kubernetes 中的命名空间构造提供了隔离跨团队和项目的资源的范围。 使用命名空间,多个团队可以通过资源配额在自己之间划分集群资源。 命名空间可以嵌套在其他命名空间中,但给定的 K8s 资源对象只能在一个命名空间中。 在命名空间内,标签可用于区分资源。 K8s 社区内部正在进行工作,以确保命名空间内的所有对象共享所有相同的访问控制策略。 当组织中的团队为开发、测试和生产用例共享 Kubernetes 集群时,命名空间也能很好地工作。

使用网络策略隔离命名空间

基本的 Kubernetes 部署策略允许命名空间之间的网络通信。 显然,这不适用于跨租户的命名空间需要相互隔离的多租户环境。 提供网络策略以强制执行分段并提供基本程度的网络隔离。 在生产中。 大多数集群将使用 Calico 或 Flannel 等项目作为集群下的网络层。 这些项目提供了比 vanilla Kubernetes 更丰富的策略功能集。 例如,Calico 网络策略提供策略排序/优先级、拒绝规则和更灵活的匹配规则。 Calico 网络策略不仅可以用于 pod,还可以用于 VM/主机接口,以及 Istio 等服务网格技术。 在最后一种情况下,它支持第 5 层到第 7 层匹配标准和加密身份。

这是一个示例网络策略文件,它将阻止来自外部命名空间的流量:

kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: block-external-namepsace-traffic spec: podSelector: matchLabels: ingress: - from: - podSelector: {}

强制执行资源配额

Kubernetes 资源配额确保租户可以公平地访问资源。 Resource Quota 允许您设置命名空间内所有 Pod 可以消耗多少 CPU、存储、内存和其他资源的配额。

可以使用以下资源配额文件:

apiVersion: v1 kind: ResourceQuota metadata: name: mem-cpu-demo spec: hard: requests.cpu: "1" limits.cpu: "2"

上述策略将给定命名空间内的所有容器限制为 1 个 CPU 请求和 2 个总 CPU。可以根据业务或容量要求为所有命名空间设置相同或不同的配额。例如,与开发/测试机器相比,生产工作负载需要更多资源。

利用 RBAC 加强控制 Kubernetes

使用基于角色的访问控制 (RBAC) 使用户能够控制对资源的访问。可以创建集群管理员、租户管理员和用户(例如开发人员)等角色,这些角色的操作范围如下所述。根据访问权限,用户可以创建、修改、删除资源或禁止访问它们。 集群管理员被允许对整个集群进行超级访问,使他们能够对任何资源执行全方位的 CRUD 操作,以及对命名空间执行用户管理。 租户管理员可以管理单个租户及其命名空间。他们还可以对租户内的命名空间执行用户管理。 开发人员等用户可以对其命名空间内的对象进行 CRUD 操作——例如 Pods。