实施虚拟 Kubernetes 集群时的关键注意事项

在 Kube.NETes 环境中,多租户是指在开发和测试等环境中,多个团队、应用程序或用户之间共享一个大型集群,主要是为了降低管理多个集群的成本和运营开销 。多租户正在成为平台团队部署 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 服务器 。平台团队在主机群集中创建命名空间,为主机命名空间配置资源配额和策略,创建虚拟群集实例,并将虚拟群集移交给最终用户 。

实施虚拟 Kubernetes 集群时的关键注意事项

文章插图
部署 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部署 。这可能适用于其他常用工具,例如可观测性、日志记录和监视工具 。


推荐阅读