在生产中运行Kubernetes的人经常抱怨多租户有多么困难。企业主要使用两种模型来与多个租户共享Kubernetes集群:基于命名空间的多租户和基于集群的多租户。第一种常见的多租户模型是基于命名空间隔离的,单个租户(例如开发微服务的团队)只能使用集群中的一个或几个命名空间。虽然此模型适用于某些团队,但它有其缺陷。首先,限制团队成员只能访问命名空间中的资源意味着他们无法管理集群中的全局对象,例如自定义资源定义(CRD)。对于直接或间接使用CRD(例如在Kubeflow或ArgoPipelines上构建)的团队来说,这是一个大问题。其次,一个更大的长期维护问题是需要不断地为命名空间隔离规则添加例外。例如,当使用网络策略锁定单个命名空间时,管理员可能会发现某些团队最终需要运行多个互连的微服务。集群管理员需要为这些情况添加例外情况、跟踪它们并管理所有这些特殊情况。而且,随着时间的推移,越来越多的团队开始使用Kubernetes,复杂性也随之增加。另一种在集群级别使用隔离的标准多租户模型问题更大。在这种情况下,每个团队都有自己的集群,甚至可能有多个集群(dev、test、UAT、staging等)。使用集群隔离的直接问题是您最终要管理许多集群,这可能很棘手。所有这些集群都需要昂贵的云计算资源,即使是在使用它们的非高峰时段,例如晚上或周末。正如HollyCummins在她的KubeCon2021主题演讲中指出的那样,这种集群扩散对环境的影响是危险的。不久前,集群管理员被迫在这两种不能令人满意的模型之间做出选择,选择更适合其用例和预算的模型。然而,Kubernetes中有一个相对较新的概念:虚拟集群,它更适合许多用例。虚拟集群简介虚拟集群是一个共享的Kubernetes集群,在租户看来就像一个专用集群。2020年,LoftLabs团队发布了虚拟Kubernetes集群的开源实现vcluster。借助vcluster,工程师可以在共享的Kubernetes集群上配置虚拟集群。这些虚拟集群在底层集群的常规命名空间内运行。因此,管理员可以启动虚拟集群并将它们分发给租户。如果一个组织已经在使用基于命名空间的多租户,但用户被限制在一个命名空间内,租户用户也可以在一个命名空间内自己启动这些虚拟集群。这结合了上述两种多租户方法的优点:租户被限制在一个命名空间中,并且不需要例外,因为他们在虚拟集群内部具有完全控制权,但在虚拟集群外部的访问非常有限。与集群管理员一样,用户对虚拟集群具有完全控制权。这允许他们在虚拟集群中执行任何操作,而不会影响底层共享主机集群上的其他租户。在幕后,vcluster通过运行KubernetesAPI服务器和主机集群上命名空间内的pod中的一些其他组件来实现这一点。用户将请求发送到命名空间内的虚拟集群API服务器,而不是底层集群的API服务器。虚拟集群的集群状态也完全独立于底层集群。在虚拟集群中创建的Deployment或Ingress等资源只存在于虚拟集群的数据存储中,不会持久化到底层集群的etcd中。与命名空间隔离模型和集群隔离模型相比,该架构具有显着优势:1.由于用户是虚拟集群中的管理员,他们可以管理整个集群的对象(如CRD),从而克服了命名空间隔离的一大限制.2.由于用户与自己的API服务器进行通信,因此其流量比普通共享集群更加隔离。这也提供了一种联合机制,有助于在高流量集群中扩展API请求。3.虚拟集群可以快速配置和拆除,因此用户可以从使用真正的临时环境中获益,并有可能在需要时启动许多临时环境。如何使用虚拟集群?虚拟集群有很多用例,下面是大多数vcluster用户采用的一些用例。?开发环境配置和管理开发环境是目前vcluster最流行的用例。如果开发人员编写在Kubernetes集群中运行的服务,他们需要在开发过程中在某个地方运行应用程序。虽然DockerCompose等工具可用于为开发环境编排容器,但针对Kubernetes集群编写代码的开发人员将获得更接近其服务在生产环境中运行方式的体验。本地开发的另一种选择是使用Minikube或DockerDesktop等工具来配置Kubernetes集群,但存在一些缺点。开发人员必须拥有并维护这个本地集群架构,这是非常重要且耗时的。此外,这些本地集群可能需要大量的计算能力,这在本地开发机器上很难做到。我们都知道我们的笔记本电脑在开发过程中会变得多热,添加Kubernetes可能不是一个好主意。在共享开发集群中运行虚拟集群作为开发环境可以解决这些问题。而且,如上所述,可以快速配置和删除vclusters。管理员可以通过使用单个kubectl命令删除底层主机命名空间或运行命令行界面工具提供的vclusterdelete命令来删除vcluster。开发工作流程中基础架构和工具的速度至关重要,因为缩短开发人员的周期时间可以提高他们的生产力和幸福感。?CI/CD管道持续集成/持续开发(CI/CD)是虚拟集群的另一个重要用例。管道通常配置被测系统(SUT),从而运行测试套件。团队通常希望这些是新系统,没有可能干扰测试的包袱。如果团队运行包含许多测试的长管道,则SUT可能会在测试运行期间被配置和销毁多次。如果您花费大量时间配置集群,您可能已经注意到启动Kubernetes集群通常很耗时。即使在最先进的公有云中,也可能需要20多分钟。使用vcluster快速轻松地配置虚拟集群。当您运行vclustercreate命令来配置新的虚拟集群时,您需要在幕后做的就是运行Helmchart并安装几个pod。此操作通常只需要几秒钟。任何运行过长时间测试套件的人都知道,缩短流程时间可以显着提高QA团队和工程师收到反馈的速度。此外,企业可以利用vCluster的速度来改进配置大量集群的任何其他过程,例如为研讨会或客户培训创建环境。?测试不同的Kubernetes版本如前所述,vcluster在底层主机命名空间中运行KubernetesAPI服务器。它默认使用K3s(轻量级Kubernetes)API服务器,但用户也可以使用k0s、AmazonElasticKubernetesService或常规的上游KubernetesAPI服务器。配置vcluster时,用户可以指定运行它的Kubernetes版本,这提供了许多可能性。用户可以:?在虚拟集群中运行较新的Kubernetes版本,以查看应用程序将如何针对较新的API服务器执行。?在开发或端到端测试期间,使用不同版本的Kubernetes运行多个虚拟集群,以跨一组不同的Kubernetes发行版和版本测试操作员。可能没有完美的解决方案来补充Kubernetes多租户,但虚拟集群解决了当前租户模型的许多问题。vcluster的速度和易用性使其成为许多场景的理想选择,如果用户想要使用共享集群,但又想为用户提供管理集群的灵活性。除了本文描述的用例之外,vcluster还支持许多用例。有关详细信息,请访问vcluster.com,或者如果您想深入了解代码,可以从GitHub存储库(https://github.com/loft-sh/vcluster)下载。原标题:VirtualKubernetesclusters:Anewmodelformultitenancy,作者:LukasGentele
