作者:Fei Guo和Lei Zhang,阿里巴巴
摘要
在这篇客座文章中,来自阿里巴巴的Kubernetes团队,将分享他们如何在社区里基于上游的Kubernetes通过利用一组名为“虚拟集群(Virtual Cluster)”的插件,构建硬性多租户以及扩展租户设计。该团队决定开源这些K8s插件,并在即将到来的KubeCon,为Kubernetes社区贡献这些插件。
介绍
在阿里巴巴,内部的Kubernetes团队正在使用一个网络规模的集群,为大量业务单位提供最终用户服务。在这种情况下,每个最终用户实际上都成为这个K8s集群的“租户”,这使得硬多租户成为一种强烈的需求。
然而,阿里巴巴团队并没有修改Kubernetes的APIServer和资源模型,而是试图在不更改Kuberentes代码的情况下构建一个“虚拟集群”多租户层。在此体系结构中,每个租户给分配专用K8s控制平面(kube-apiserver + kube-controller-manager)和一些“虚拟节点(Virtual Node)”(是Node API对象但没有相应的kubelet),所以不用担忧命名或节点相互矛盾,而租户工作负载仍混合运行在相同的底层“超级集群”,所以资源利用率得到保证。本设计在虚拟集群方案(virtual cluster proposal)中进行了详细阐述,得到了大量的反馈。
https://docs.google.com/document/d/1EELeVaduYZ65j4AXg9bp3Kyn38GKDU5fAJ5LFcxt2ZU/edit#heading=h.zgjbixz8dbin
虽然在本设计中引入了“租户主机(tenant master)”的新概念,但是虚拟集群只是K8s社区中现有基于命名空间的多租户的扩展,在本文的其余部分中称为“命名空间组(命名空间组)”。虚拟集群完全依赖于命名空间组提出的资源隔离机制,我们热切地期待并会推动相关的工作在Kubernetes多租户工作组(WG-multitenancy)进行,以解决这些问题。
如果你想知道更多关于虚拟集群设计的细节,请不要犹豫来阅读虚拟集群方案,而在本文中,我们将关注虚拟集群和背后的高层思想,阐述我们如何用“租户集群”视图扩展命名空间群,以及这个扩展对Kubernetes多租户的用例提供的价值。
背景
本节简要回顾命名空间组多租户建议的体系结构。
我们借用K8s多租户工作组深入了解( K8s Multi-tenancy WG Deep Dive)演讲材料的一个图表(如图1所示),解释使用命名空间组织租户资源的高层思想。
https://static.sched.com/hosted_files/kccnceu19/74/kubecon-eu-multitenancy-wg-deepdive.pdf
图1:命名空间组多租户体系结构
在命名空间组中,所有租户用户共享同一个K8s apiserver的访问点来使用租户资源。他们的帐户、分配的命名空间和资源隔离政策都在租户CRD对象中指定,这些对象由租户管理员管理。租户用户视图受每个租户命名空间限制。定义租户资源隔离政策是为了禁用租户之间的直接通信,并保护租户pod免受安全攻击。它们由原生Kubernetes资源隔离机制实现,包括RBAC、Pod安全政策、网络政策、准入控制和沙箱运行时。可以为不同级别的隔离需求配置和应用多个安全概要文件。此外,资源配额、退款和计费发生在租户级别。
虚拟集群如何扩展视图层
从概念上讲,虚拟集群在命名空间组解决方案之上提供了一个视图层扩展。它的技术细节可以在虚拟集群方案中找到。在虚拟集群中,租户管理员仍然需要使用命名空间组的相同租户的CRD,来指定租户资源提供者 - 即超级主机(super master) - 的租户用户帐户、命名空间和资源隔离政策。
图2:虚拟集群的视图层扩展
如图2所示,由于新的虚拟集群视图层,租户用户现在拥有不同的访问点和租户资源视图。租户用户不直接访问超级主机查看租户命名空间,而是与专用的租户主机交互以利用租户资源,并提供完整的K8s主机视图。所有租户请求都由sync-manager同步到超级主机,该管理器根据租户CRD中指定的资源隔离政策,代表超级主机的租户用户创建相应的自定义资源。也就是说,虚拟集群主要将租户用户视图从命名空间更改为APIserver。从超级主机的角度来看,租户控制器对租户CRD触发相同的工作流。
虚拟集群视图扩展的好处
在现有的命名空间视图之上为租户用户提供虚拟集群视图有很多好处:
限制
由于虚拟集群主要扩展了多租户视图选项,并防止了由于共享apiserver而导致的问题,所以它继承了命名空间组,在使到kubernetes节点组件租户感知方面,所面临的相同限制/挑战。需要加强的节点组件包括但不限于:
当然,虚拟集群需要额外的资源来为每个租户运行租户主机,这在某些情况下可能是负担不了的。
总结
虚拟集群提供用户友好的集群视图,扩展了命名空间组多租户解决方案。它利用了K8s的资源隔离机制和社区中现有的租户CRD和控制器,但提供了专用租户集群的使用体验。总的来说,我们相信虚拟集群和基于命名空间的多租户,可以为生产集群中的各种Kubernetes多租户用例,提供全面的解决方案,我们正在积极地贡献这个插件到上游社区。
希望在KubeCon见到你!