在 Kubernetes 环境中,多租户是指在开发和测试等环境中,多个团队、应用程序或用户之间共享一个大型集群,主要是为了降低管理多个集群的成本和运营开销。多租户正在成为平台团队部署 Kubernetes 基础设施的基本要求。
使用 Kubernetes 命名空间实现多租户
到目前为止,实现多租户的最流行的方法是使用 Kubernetes 命名空间。Kubernetes 命名空间提供了一种简单的方法来划分一组资源,例如 Pod、服务和部署,这些资源只能在该命名空间内访问。
平台团队通常管理和操作集群,并具有完全集群级别的权限。它们通过创建一个或多个特定于每个团队、应用程序、用户的命名空间,并限制作为开发人员、DevOps 工程师和应用程序所有者的最终用户对这些命名空间的访问来实现多租户。最终用户只能执行特定于他们拥有所有权的命名空间的操作。这适用于绝大多数多租户用例。在这里,vcluster 框架可能很有用。
使用 Vcluster 开源框架的多租户
在某些极端情况下,限制最终用户仅访问命名空间不太合理,因为最终用户需要访问集群范围对象(如 CRD、入口控制器、集群 API 服务器等),来进行日常开发工作。通常,参与开发自定义资源和自定义控制器以扩展 Kubernetes API、准入控制器以实现变异和验证 Webhook ,以及其他可能需要自定义 Kubernetes 配置服务的用户需要集群级访问权限。虚拟集群(vcluster)是一个开源框架,旨在解决这个问题。vcluster 本质上是一个可以在物理集群中创建的虚拟集群。
默认情况下,Vcluster 在每个虚拟集群实例的主机集群命名空间中安装 K3s 集群(可选为 k0s、k8s 和 EKS),并安装 API 服务器、控制器管理器、存储后端和(可选)调度程序等核心 Kubernetes 组件。最终用户与虚拟群集 API 服务器交互并获得对虚拟群集的完全访问权限,但是仍保持资源隔离和安全性,因为他们仅限于主机命名空间,并且无权访问主机群集 API 服务器。平台团队在主机群集中创建命名空间,为主机命名空间配置资源配额和策略,创建虚拟群集实例,并将虚拟群集移交给最终用户。
部署 Vcluster 之前要回答的关键问题
虽然为一小组最终用户部署 vcluster 相当简单,但在进行大规模 vcluster 部署之前,平台团队必须要清晰的了解以下问题,并围绕 vcluster 实施其他解决方案,才能满足其组织的自动化、安全性、治理和合规性要求:
1、如何为每个命名空间创建主机级命名空间和资源配额,并将其映射到内部用户、团队?
平台团队仍然需要命名空间级多租户的解决方案,因为必须先创建主机命名空间才能部署 vcluster 实例。
2、如何自动执行 vcluster 的生命周期管理以应对大规模使用?
平台团队需要解决诸如创建、修改、删除虚拟集群实例、向最终用户公开虚拟集群 API 服务器(使用入口或负载均衡器)、将虚拟集群 Kubeconfig 文件安全地分发给最终用户以及升级虚拟集群实例 (K3), 以应对软件更新和安全漏洞等问题。
3、如何确保每个虚拟集群中仅运行已批准和授权的群集范围服务?是否在每个虚拟集群中部署它们?如何保证没有漂移?
这些服务通常包括安全插件、日志记录、监控、服务网格、入口控制器、存储插件等。
4、如何在命名空间级别为主机命名空间创建网络策略?
由于物理群集可能在多个 BU 和应用程序团队之间共享,因此仍然需要此级别的网络隔离,这需要在主机命名空间之间进行网络隔离。
5、如何在每个虚拟集群中实施 OPA 等安全策略?是否需要在每个虚拟群集中部署这些策略?
大多数平台团队会根据其安全团队的建议标准化一组安全策略,并将其部署到每个集群中,来保持安全状况。
6、如何检索每个虚拟集群的 Kubectl 审核日志?
对于某些组织来说,Kubectl 审计是一项关键要求,无论在什么样的环境中都是如此。
7、如何处理成本分配?
由于资源由不同的开发团队共享,因此它们可能属于不同的成本中心,平台团队需要实施适当的按存储容量使用计费策略,来进行成本分配。
8、如何让其他开发人员工具(如ArgoCD)与vcluster一起工作?
像ArgoCD这样的GitOps工具需要集群访问才能部署应用程序,必须在ArgoCD中配置每个vcluster实例,以便最终用户利用ArgoCD GitOps部署。这可能适用于其他常用工具,例如可观测性、日志记录和监视工具。
9、每个 vcluster 实例会产生哪些额外的资源和运营开销?
每个虚拟集群本质上都是一个 K3s/K8s 集群,其中包含所有附加组件,例如安全插件、日志记录插件、监控插件、入口控制器等。当部署更多虚拟集群实例时,每个 vcluster Kubernetes 资源和加载项可能会产生大量开销。同样,由于每个虚拟集群本质上都是一个 Kubernetes 集群,因此平台团队可能会产生额外的开销来管理这些集群,来进行 Kubernetes 版本更新、补丁管理和附加组件管理。
10、vcluster 是否与实际生产环境相匹配?
对于某些组织,开发环境必须与生产环境紧密匹配。vcluster 支持其他发行版,例如 K8s 和 EKS,但平台团队必须检查它是否等效于为接近生产环境的用例运行独立集群。例如,EKS 支持许多高级功能,包括第三方 CNI、各种存储类、自动扩展、IRSA 和附加组件,这些功能在虚拟 EKS 集群中可能不可用。
结论
对于大多数平台团队来说,基于命名空间的多租户以及围绕命名空间生命周期管理、安全性和成本控制的额外自动化,可以解决其多租户用例。vcluster 解决了 Kubernetes 命名空间多租户中的一个特定差距,没有集群级别权限的最终用户可以访问其虚拟集群中的集群范围对象。平台团队必须在内部验证其最终用户是否存在此类要求,根据其安全性、合规性和治理要求,进行彻底的成本效益分析,并围绕它实施额外的自动化操作,以确保它的成功部署。