审校 | 重楼
Kubernetes彻底改变了组织部署和管理容器化应用程序的方式,使跨集群编排和扩展应用程序变得更加容易。然而,在共享的Kubernetes集群上运行多个异构工作负载会带来资源争用、安全风险、缺乏定制和复杂管理等挑战。
以下几种方法可以在Kubernetes中实现隔离和多租户:
- Kubernetes命名空间:命名空间通过在不同用户之间划分集群资源来实现一定的隔离。但是,命名空间共享相同的物理基础设施和内核资源。因此,隔离和定制是有限制的。
- Kubernetes发行版:流行的Kubernetes发行版(例如Red Hat OpenShift和Rancher)支持Vcluster。它们更有效地利用了Kubernetes的原生功能,例如命名空间、RBAC和网络策略。其他优点包括集中控制平台、预配置集群模板和易于使用的管理。
- 分层命名空间:在传统的Kubernetes集群中,每个命名空间都是独立的。这意味着一个名称空间中的用户和应用程序不能访问另一个名称空间中的资源,除非他们具有明确的权限。分层命名空间通过允许在命名空间之间定义父子关系来解决这个问题。这意味着在父命名空间中拥有权限的用户或应用程序将自动在所有子命名空间中拥有权限。这使得跨多个名称空间管理权限变得容易得多。
- Vcluster项目:Vcluster项目通过将物理Kubernetes集群划分为多个独立的软件定义集群来解决这些痛点。Vcluster允许组织为开发团队、应用程序和客户提供专用的Kubernetes环境,这些环境具有有保证的资源、安全策略和自定义配置。本文将深入探讨Vcluster、它的功能、不同的实现选项、用例和挑战,还将研究最大化利用率和简化Vcluster管理的最佳实践。
什么是Vcluster?
Vcluster是一个开源工具,允许用户创建和管理虚拟Kubernetes集群。虚拟Kubernetes集群是一个功能齐全的Kubernetes集群,它运行在另一个Kubernetes集群之上。Vcluster的工作原理是在底层Kubernetes集群的命名空间中创建一个Vcluster。Vcluster有自己的控制平台,但它共享底层集群的工作节点和网络。这使得Vcluster成为一个轻量级的解决方案,可以部署在任何Kubernetes集群上。
用户在创建Vcluster时,可以指定希望Vcluster拥有的工作节点的数量。然后,Vcluster命令行将创建Vcluster,并在工作节点上启动控制平台pod。然后可以使用kubectl CLI将工作负载部署到Vcluster。
用户可以在Vcluster网站上了解更多关于Vcluster的信息。
使用Vcluster的好处
(1)资源隔离
Vcluster允许用户将中央集群的一部分资源(例如CPU、内存和存储)分配给单个Vcluster。当多个团队共享相同的物理集群时,这可以防止“嘈杂邻居”问题。可以确保关键工作负载不受干扰地获得所需的资源。
(2)访问控制
使用Vcluster,可以在Vcluster级别实施访问策略,确保只有授权用户才能访问。例如,像金融应用程序这样的敏感工作负载可以在隔离的Vcluster中运行。与命名空间级策略相比,限制访问要简单得多。
(3)定制
Vcluster允许针对各个团队的需求进行广泛的定制,并且可以定制不同的Kubernetes版本、网络策略、进入规则和资源配额。开发人员可以在不影响其他人的情况下修改他们的Vcluster。
(4)多租户
组织必须经常向多个内部团队或外部客户提供Kubernetes访问。通过在同一物理集群中创建独立的隔离环境,Vcluster使多租户易于实现。
(5)容易扩展
额外的Vcluster可以快速启动或关闭,以处理动态工作负载和扩展需求。可以立即提供新的开发和测试环境,而无需扩展整个物理集群。
Vcluster之前的工作负载隔离方法
在Vcluster作为解决方案出现之前,组织已经利用了各种Kubernetes的本地特性来实现一些工作负载隔离:
- 命名空间:命名空间在不同的团队或应用程序之间隔离集群资源。它们通过资源配额和网络策略提供基本的隔离。但是,没有系统管理程序级别的隔离。
- 网络策略:细粒度的网络策略限制pod和命名空间之间的通信。这会在工作负载之间创建网络分段。但是,仍然可能发生资源争用。
- 污点和容忍度:对节点应用污点可以防止指定的pod在节点上进行调度。pod必须具有与污点相匹配的容忍度。这样可以将pod限制为特定节点。
- 云虚拟网络:在公共云上,使用多个虚拟网络有助于隔离Kubernetes集群流量。但是集群中的pod仍然可以通信。
- 第三方网络插件:像Calico、Weave和Cilium这样的CNI插件可以构建覆盖网络和细粒度的网络策略来隔离流量。
- 定制控制器:开发定制Kubernetes控制器允许以编程方式隔离资源。但这需要大量的编程专业知识。
Vcluster的演示
(1)安装Vcluster命令行
要求:
- kubectl(通过kubectl版本检查)
- helm v3(检查helm版本)
- 一个可以访问Kubernetes集群的工作kube-context(通过kubectl查询名称空间)。
使用以下命令下载基于arm64的Ubuntu机器的Vcluster CLI二进制文件:
curl -L -o vcluster
"https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-linux-arm64" && sudo install -c -m 0755 cluste /usr/local/bin && rm -f vcluster
bash
要确认Vcluster CLI已成功安装,通过以下方式测试:
vcluster --version
bash
要在其他服务器上安装,可以参考以下链接。安装Vcluster命令行。
(2)部署Vcluster
创建一个Vclustermy-first-Vcluster
vcluster create my-first-vcluster
bash
(3)连接到Vcluster
输入以下命令连接Vcluster:
vcluster connect my-first-vcluster
bash
使用kubectl命令获取连接的Vcluster中的名称空间。
kubectl get namespaces
bash
将应用程序部署到Vcluster
现在,在Vcluster中部署一个示例Nginx部署。创建一个部署:
kubectl create namespace demo-nginx
kubectl create deployment nginx-deployment -n demo-nginx --image=nginx
bash
这将把应用程序隔离在Vcluster中的一个命名空间demo-nginx中。
可以检查此演示部署是否会在Vcluster中创建pod:
kubectl get pods -n demo-nginx
bash
检查主机集群部署
既然已经确认了Vcluster中的部署,现在尝试检查主机集群中的部署。
断开与Vcluster的连接。
vcluster disconnect
bash
这将把kube场景移回主机集群。现在检查主机集群中是否有可用的部署。
kubectl get deployments -n vcluster-my-first-vcluster
bash
在Vcluster-my-Vcluster命名空间中找不到任何资源。这是因为部署被隔离在其他集群无法访问的Vcluster中。
现在使用以下命令检查所有名称空间中是否有pod正在运行。
kubectl get pods -n vcluster-my-first-vcluster
bash
现在可以看到Nginx容器在Vcluster命名空间中运行。
Vcluster用例
Vcluster通过在单个物理集群中提供隔离的和可定制的Kubernetes环境来支持几个重要的用例。以下更详细地探讨其中的一些:
(1)开发和测试环境
为开发团队分配专用的Vcluster允许他们完全控制配置,而不会影响生产工作负载或其他开发人员。开发团队可以使用所需的Kubernetes版本、网络策略、资源配额和访问控制来定制他们的Vcluster。开发团队可以快速启动和关闭Vcluster以测试不同的配置。由于Vcluster提供了有保证的计算和存储资源,开发人员不需要开展竞争,它们也不会影响在其他Vcluster中运行的应用程序的性能。
(2)生产应用程序隔离
企业应用程序(例如ERP、CRM和财务系统)需要可预测的性能、高可用性和严格的安全性。专用Vcluster允许这些生产工作负载不受其他应用程序的影响。可以为关键任务应用程序分配预留容量,以避免资源争用。定制网络策略保证隔离。集群还允许基于角色的粒度访问控制,以满足合规性需求。与过度配置大型集群以避免干扰不同,Vcluster以较低的成本提供有保证的资源。
(3)多租户
服务提供商和拥有多个业务单元的企业通常需要向不同的内部团队或外部客户安全地提供Kubernetes访问权限。通过为每个租户创建单独的自助服务环境并应用适当的资源限制和访问策略,Vcluster简化了多租户。提供商可以通过采用额外的Vcluster轻松地为新客户提供服务。这消除了“嘈杂邻居”问题,并通过根据实际使用情况(而不是峰值需求)打包Vcluster来实现高密度的工作负载。
(4)合规性
金融和医疗保健等受到严格监管的行业在数据隐私、地理位置和访问控制方面有严格的安全性和合规性要求。具有内部网络分段、基于角色的访问控制和资源隔离的专用Vcluster可以更轻松地与同一集群中的其他应用程序一起安全地托管兼容的工作负载。
(5)临时资源
Vcluster允许立即启动临时Kubernetes环境来处理以下用例:
- 测试集群升级:新的Kubernetes版本可以部署到较低的环境中,而不会停机或影响生产。
- 评估新的应用程序:应用程序可以部署到一次性的Vcluster中,而不是共享的开发集群,以防止冲突。
- 容量峰值:新的Vcluster为流量峰值提供突发容量,而不是过度配置整个集群。
- 特殊事件:可以为研讨会、会议和其他事件临时创建Vcluster。
一旦不再需要,就可以简单地删除这些Vcluster,而不会在集群上留下持久的足迹。
(6)工作负载整合
随着组织扩展Kubernetes的足迹,需要在不干扰现有应用程序的情况下将多个集群合并到共享的基础设施上。将应用程序迁移到Vcluster提供了逻辑隔离和定制,允许它们与其他工作负载一起无缝运行。这提高了利用率并减少了操作开销。Vcluster允许企业IT在保持隔离的同时在整个组织中提供一致的Kubernetes平台。总之,Vcluster是通过工作负载隔离、定制、安全性和密度来优化Kubernetes环境的重要工具。用例强调了它们如何使组织内从开发人员到运维人员再到业务部门的各种需求受益。
使用Vcluster的挑战
虽然带来了显著的好处,但也有一些缺点需要权衡:
(1)复杂性
与单个大型Kubernetes集群相比,管理多个Vcluster(尽管规模较小)会带来更多的操作开销。其他任务包括:
- 提供和配置多个控制平台。
- 在Vcluster之间一致地应用安全策略和访问控制。
- 在Vcluster之间进行监控和日志记录。
- 为每个Vcluster维护指定的资源和容量。
例如,集群管理员必须在20个Vcluster中而不是单个集群中配置和更新RBAC策略。与单个集群的集中管理相比,这需要付出更多的努力。Kubernetes上的静态IP地址和端口可能会导致冲突或错误。
(2)资源分配与管理
平衡Vcluster的资源消耗和性能可能很棘手,因为它们可能有不同的需求或期望。
例如,Vcluster可能需要根据工作负载扩展或缩减,或者与其他Vcluster或名称空间共享资源。应用程序峰值需求的Vcluster大小可能在非峰值期间有多余的未使用容量,这些容量处于闲置状态,无法被其他Vcluster利用。
(3)有限的定制
定制Vcluster的能力因实现而异。命名空间提供的灵活性最低,而集群API提供的灵活性最高。像OpenShift这样的工具通过简单性平衡了定制。例如,命名空间不能运行不同的Kubernetes版本或网络插件。Cluster API允许完全定制,但更复杂。
结论
Vcluster使Kubernetes用户能够在共享的物理集群中定制、隔离和扩展工作负载。通过分配专用的控制平台资源和访问策略,Vcluster提供了强大的技术隔离。对于多租户这样的用例,Vcluster提供了更简单、更安全的Kubernetes管理。
Vcluster还可以用于减少Kubernetes的成本开销,并可用于临时环境。像OpenShift、Rancher和Kubernetes Cluster API这样的工具使得部署和管理Vcluster变得更加容易。随着采用的增加,可以期待在Vcluster空间中有更多的创新,以进一步简化操作并最大化利用率。虽然Vcluster有一些缺点,但对于许多组织来说,其带来的好处显然超过所增加的复杂性。
原文Multi-Tenancy in Kubernetes Using Vcluster,作者:Pavan Shiraguppi