1 什么是多租户方案
多租户方案是指由多个客户或租户共同使用应用的解决方案。 租户不同于用户,来自单个组织、公司或组的多个用户形成一个租户。
采用多租户方案的应用可能包括以下:
企业对企业 (B2B) 解决方案,如会计软件、工作跟踪和其他软件即服务 (SaaS) 产品。
企业对消费者 (B2C) 解决方案,如音乐流式处理、照片共享和社交网络服务。
企业范围的平台解决方案,如组织内多个业务部门使用的共享平台服务。
2 多租户方案需要考虑的因素
多租户的方案需要考虑多种因素,大概包括以下:
1. 隔离:多租户间共用应用程序和基础设施,需要考虑租户间的隔离,比如某个租户可能会抢占系统资源,从而对其他租户造成不利影响,降低其他租户的使用体验。
2. 成本:多租户方案最简单的实现方式是针对每个租户独立部署一套应用,带来的后果是资源扩张和成本增高,因此需要设计多租户架构以尽可能地降低整体的资源使用量和成本支出。
3. 共享:相对于每个租户独立部署,多租户应用会有部分资源的共享。
4. 扩展性:对于新加入的租户,需要可以快速扩展应用程序以接入该租户;对于已有租户,当该租户的用户扩张使用量增大时,应用也需要相应的扩展。
5. 计费和分账:多租户应用的提供者需要从云供应商购买资源,运营自己的应用,并从它的终端客户处收费,因此需要将所使用的云资源账单以精细化的合理的方式分摊在各个终端客户上。
6. 租户上限:多租户应用提供商的业务将会扩大,因此需要考虑该方案所能承载的租户上限。
3 本节内容
本节内容做为多租户系列方案的第一篇,会介绍如何采用腾讯云的TKE容器集群和云原生Kong网关实现多租户的应用架构。关于多租户方案的其他部分会在后续章节中介绍。
4 容器多租户方案
目前应用容器化的比率不断提高,因此越来越多的多租户应用设计者考虑如何基于容器实现多租户。
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
采用腾讯云TKE通常有以下三种多租户隔离方案:
4.1 基于容器节点池的隔离
该方案中,在同一套TKE容器集群中为每个租户分配一个单独的节点池,用于部署该租户的应用,如下图所示:
节点池之间支持:
独立的配置(机型、系统盘、数据盘、带宽)用于不同租户的资源需求;
独立的计费模式(包年包月/按量计费/竞价实例)用于不同租户的费用模式;
独立的节点数量和扩缩容策略用于不同租户的应用规模;
独立的Label和taints用于隔离租户应用。
不同租户之间可以采用腾讯云的分账标签或者TKE成本大师实现分账。
4.2 基于容器命名空间的隔离
该方案中,在同一套TKE容器集群中为每个租户分配一个单独的命名空间,用于部署该租户的应用,如下图所示:
相比于节点池,命名空间属于虚拟隔离,即多个命名空间的pod可能部署在同一个节点上。延用K8S里的功能,在命名空间之间可以分配独立的资源request和limit,从而保证不同租户之间的资源需求量不受干扰;同样在命名空间之间可以设置network policy,保证租户间的资源隔离。命名空间和节点池并不是互斥的方案,可以联合使用,即特定的命名空间采用特定的节点池。
可采用TKE的成本大师,进行命名空间级别的分账。
4.3 基于容器标签的隔离
该方式中,在同一套TKE容器集群中为每个租户设置一个标签,为该租户所部属的所有资源,包括Pod/Deployment等都打上该标签,如下图所示:
该方案相比于之前的方案,资源使用率更高,但是租户之间的隔离性有所降低,实现的复杂度也略有增加。
同样可以采用TKE成本大师为多租户之间进行分账。
4.4 方案对比
对比上述三种方案如下表:
5 Kong网关多租户方案
Kong网关是一款基于OpenResty(Nginx Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。由于其云原生、高效、可扩展、分布式的良好特性,以及更易于与微服务及容器集成,目前使用广泛。
云原生Kong网关是腾讯云基于开源API网关推出的一款高性能高可用的云原生 API 网关产品,减少用户自建网关的开发及运维成本。云原生API网关作为云上微服务架构的流量入口,集成请求分发、API 管理、流量监控、访问限制等功能,是微服务架构中的重要组件。
因此,我们在接入层首先考虑基于Kong网关设计的多租户方案,并有两种方案分别与上述的两种容器多租户方案相适配。
5.1 基于服务的网关多租户方案
云原生Kong网关中的网关服务可以直接关联后端TKE集群上的服务,并配置路由策略,配置后从Kong网关的管理台可以看到后端TKE容器集群上的服务列表,如下图:
该方案适用于上一章节中基于容器命名空间的隔离。在该方案中,在网关中设置多网关服务,每个服务对应后端TKE集群上不同命名空间下每个租户的服务,并设置路由,从而实现网关的多租户隔离。方案如下图所示:
目前网关服务的数量无上限,因此可以认为租户数量无上限。
5.2 基于服务分组的网关多租户方案
云原生Kong网关的每个网关服务中,可以包含多个服务分组,分组主要应用在路由配置中的标签路由功能,关联后端TKE容器集群上带有不同标签的服务,可以针对服务分组配置路由规则。配置服务分组后在Kong网关的管理台可看到分组信息,如下图:
该方案适用于上一节中基于容器标签的隔离,网关服务的每个分组关联容器上带有特定标签(label: tenant)的服务,同时对应一个租户;该服务启用TSE-ROUTE插件,采用该插件为每个服务分组(即每个租户)设置路由。示意图如下:
目前网关服务的数量无上限,因此可以认为租户数量无上限。
5.3 基于JWT的云原生网关多租户方案
有的多租户应用提供商对租户采用JWT的认证鉴权方式,每个租户带有不同的token,应用针对token认证授权后,再基于该token进行多租户路由。云原生Kong网关也采用该方式的多租户路由。该方式可以配合前两节的基于服务或服务分组的租户隔离方式。这里以服务 JWT的方案为例说明,示意图如下:
配置的流程如下:
1. 在云原生Kong网关中创建一组网关服务,分别关联后端TKE容器集群上不同租户的服务。与之前章节中相同。
2. 在云原生Kong网关中启用“JWT“插件,可以在Global、服务或者路由级别。此处我们在服务级别启用:
3. 在Kong网关中创建多个consumers,每个consumer代表一个租户。如下图,其中Alice和Bob是两个consumers,对应两个租户,admin是Kong的管理员,不是租户。
4. 为每个consumer创建JWT credential,如下图:
5. 用户通过该JWT credential生成JWT token,并采用JWT token向Kong网关发送请求时,Kong网关的JWT插件会验证该token,验证通过后会将该租户的名字写入“x-consumer-username”的http header中,并传入后端应用。因此需要在Kong网关中配置路由,将带有不同username的请求发往后端的不同服务。在Kong网关的路由中进行配置,对应每个租户的名字路由至不同租户的服务,如下图:
6. 配置完成后测试。客户发送请求时带上自己的JWT token,就会被路由至对应自己应用。
6 小结
在本章节中,我们介绍基于腾讯云TKE容器集群和云原生Kong网关实现的多租户架构方案,适用于云原生的微服务容器化的多租户应用。后续我们会持续介绍更多的多租户方案。