随着云计算的蓬勃发展,Kubernetes(简称:K8s)已成为容器编排的事实标准。在企业内部落地的过程中,多租户问题始终是⼀个刚需问题。企业内不同部门、不同业务之间如何进行统一管理,成为容器云产品在B端落地首要解决的需求。例如:
1
资源隔离:如何在共享集群中有效隔离不同租户的资源?不同租户间的业务怎样能够互不影响?
2
配额管理:企业内部复杂的资源,如何进行不同租户之间的资源使⽤控制,避免滥用?
3
安全性:怎样保障租户数据不被泄露或滥用?
当前业界比较流行的多租户方案主要有以下三种:
集群作为租户
集群作为租户因落地简单、隔离性强,成为目前业界使用最广的⽅式。只需为每个租户单独创建⼀个K8s集群,通过独享的⽅式,完全规避复杂的租户隔离问题,并且实施难度低,不需要规划复杂的技术⽅案。
如果是传统的VMware环境或物理机,并且没有自动化能⼒,创建和维护集群的成本非常高。除了实施运维成本以外,独占集群对于资源的消耗也很大,每个高可用模式的K8s集群都需要消耗三台以上的管理节点。
而企业对资源管理的维度过于粗放,会导致很多集群的资源不能有效利用,在整个数据中心造成大量碎片化资源,形成⼤范围的资源闲置。
命名空间作为租户
能否在⼀个集群内进行租户管理呢?答案当然是可以的。
业界很多产品的做法是通过命名空间进行租户管理,借助K8s的原生隔离对象“命名空间”进行管理,为每个租户分配⼀个独立的命名空间。通过原生能力,做到资源配额的管理、数据权限的隔离,实现逻辑上的租户资源隔离。
由于命名空间作为租户是⼀种逻辑隔离的方案,实际上各个租户的容器仍旧运行在同⼀个集群中,甚至是同⼀台机器上。他们共享在同⼀个网络空间中,使用的可能是同⼀个宿主机磁盘,或同⼀个存储池。
这种物理共享的⽅式,由于计算资源争抢、网络彼此互通、共用同一个存储池等问题,租户之间的业务会产生较⼤的影响。
此外,基于命名空间的特点,命名空间下的用户权限无法查看全部资源,对于习惯将⼀个业务部署在多个命名空间的用户来说非常痛苦,难以⼀次看到所有容器。从集群作为租户的使⽤模式过来的⽤户,可能很难接受这⼀点。
总的来说,命名空间作为租户的方案虽然实施简单,但在安全性和隔离性上存在较大挑战。对安全要求较高的企业来说,这种方案难以满足其需求。
VirtualCluster
VirtualCluster是⼀种新兴的多租户解决⽅案,旨在解决传统命名空间⽅案的局限性。它通过在单个物理K8s集群上创建多个虚拟K8s集群来实现更强⼤的隔离和资源管理。每个虚拟集群都有自己的API服务器、控制平⾯组件和命名空间,为租户提供了⼀个看似独⽴的K8s环境。这种⽅法结合了集群级别隔离的优势和命名空间 级别资源共享的灵活性。
例如vCluster开源⽅案,就是在物理集群中,为每⼀个租户创建独⽴的虚拟控制⾯,虚拟控制⾯⼏乎包含了⼀个完整的K8s控制⾯,囊括了API、控制器、调度器等核⼼组件。如下图所示:
(以上图片来源)
https://www.vcluster.com/docs/vcluster/introduction/architecture
相比命名空间作为租户的方案来说,虚拟集群给到用户的感觉更加接近于⼀个完整的集群,对于习惯独占集群的用户来说可以无缝迁移。
但是VirtualCluster也带来了很多问题,例如增加了资源开销,提高了集群维护的复杂度,更加重要的是,这种方法本质上还是⼀种逻辑隔离,不同租户的业务存在于⼀个物理空间中,计算、存储、⽹络可能都是互通的,只是对于API访问的隔离更加安全。
综上来看,业界的三种主流租户方案各有优缺点,那么有没有⼀种⽅案既能做到物理隔离,⼜不需要创建很多物理集群,同时还能为用户提供⼀种类似虚拟集群的操作体验呢?
品高容器云自主研发
多租户解决方案
凭借多年服务政企客户和金融客户的经验,品高深知租户安全的重要性。接下来,我们将为您详细介绍品高容器云自主研发的多租户解决方案。
租户是落地企业的必选项之一,然而业界现有的原生及开源方案均无法满足我们对租户的高标准要求。因此,品高决定选择自主研发的技术路线,以满足更高要求的需求。
kube-nvc:Native VirtualCluster
对多租户来说,VirtualCluster是⼀个非常好的提法,我们给用户分配虚拟集群,在统⼀管理的前提下,给⽤户接近完整集群的体验。因此我们仍然希望做到让租户享受到接近集群的使用体验,但区别于开源的VirtualCluster方案,我们希望可以减少虚拟控制面的架构复杂度,通过对原⽣集群控制⾯进⾏改造,让K8s集群原生具备多租户能力,这就是我们开发的kube-nvc多租户⽅案。
通过自主研发的⽅式,我们对K8s的源代码进⾏增强开发,赋予控制面多租户的管控能力,使租户之间具备极强的隔离性:
数据隔离
不同租户调用api进行数据查询和操作时,kube-nvc会劫持api请求,进行准入和数据转换操作。
数据隔离的⼀个小细节,在命名空间作为租户的方案中,不同租户的命名空间全局是共享同⼀个数据域的,因此他们的命名空间名字会出现冲突。而虚拟集群的⽅案中,不同租户之间可以有重名的命名空间,kube-nvc会对所有资源对象的名称进行数据转换,保证在集群数据库中存储时不会冲突。
计算隔离
通过对计算资源进行池化管理,kube-nvc会对租户进行调度劫持,对于租户独占的资源池,可以完全禁⽌其他租户的业务部署,在物理层对容器进行隔离,不同的租户业务分布在不同的计算节点中。
存储隔离
存储类在开源方案中是⼀个全局可见的对象,kube-nvc通过对存储声明的调度劫持,增加租户对存储资源使用的准⼊控制,让存储池能够被租户独占。
网络隔离
区别于扁平化网络的开源方案,kube-nvc依靠品高容器云自研的kube-nvs网络插件,可以实现在集群内划分不同网段,网段之间强隔离,不同租户使⽤不同网段,不同业务之间无法互相访问。
除了以上几项主要隔离能力之外,由于集群是由多个租户共享的,我们还需要实现租户和管理员之间的隔离,以保护管理侧的安全,维护集群的稳定。例如对HostPath、NodePort等管理侧的能力要进行禁用,避免租户对集群稳定性产⽣破坏的安全隐患,同时由于这些是必备的功能,还需要在计算、网络、存储的能力侧提供替代的解决方案。
后续我们将展开讨论如何将管理和业务能力进行解耦和隔离,以提⾼集群的稳定性,敬请关注下期内容!
联系我们