如何使用 Vcluster 实现 Kubernetes 中的多租户
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 二进制文件:
要确认 Vcluster CLI 已成功安装,通过以下方式测试:
要在其他服务器上安装,可以参考以下链接。安装 Vcluster 命令行。
(2)部署 Vcluster
创建一个 Vclustermy-first-Vcluster
(3)连接到 Vcluster
输入以下命令连接 Vcluster:
使用 kubectl 命令获取连接的 Vcluster 中的名称空间。
五、将应用程序部署到 Vcluster
现在,在 Vcluster 中部署一个示例 Nginx 部署。创建一个部署:
这将把应用程序隔离在 Vcluster 中的一个命名空间 demo-nginx 中。
可以检查此演示部署是否会在 Vcluster 中创建 pod:
六、检查主机集群部署
既然已经确认了 Vcluster 中的部署,现在尝试检查主机集群中的部署。
断开与 Vcluster 的连接。
这将把 kube 场景移回主机集群。现在检查主机集群中是否有可用的部署。
在 Vcluster-my-Vcluster 命名空间中找不到任何资源。这是因为部署被隔离在其他集群无法访问的 Vcluster 中。
现在使用以下命令检查所有名称空间中是否有 pod 正在运行。
现在可以看到 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 有一些缺点,但对于许多组织来说,其带来的好处显然超过所增加的复杂性。
版权声明: 本文为 InfoQ 作者【互联网工科生】的原创文章。
原文链接:【http://xie.infoq.cn/article/c3341344fd7a1323299acc51a】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论