突破100倍集群规模,Karmada大规模测试报告发布
摘要
随着云原生技术在越来越多的企业和组织中的大规模落地,如何高效、可靠地管理大规模资源池以应对不断增长的业务挑战成为了当下云原生技术的关键挑战。 在过去的很长一段时间内,不同厂商尝试通过定制Kubernetes原生组件的方式扩展单集群的规模,这在扩大规模的同时也引入了复杂的单集群运维、不清晰的集群升级路径等问题。 而多集群技术能在不侵入修改Kubernetes单集群的基础上横向扩展资源池的规模,在扩展资源池的同时降低了企业的运维管理等成本。
在Karmada的大规模落地进程中,Karmada的可扩展性和大规模逐渐成为社区用户的新关注点。 因此,我们对Karmada开展了大规模环境下的测试工作,以获取Karmada管理多个Kubernetes集群的性能基线指标。 对于以Karmada为代表的多集群系统而言,单集群的规模不是制 约它的资源池规模的限制因素。 因此,我们参考了Kubernetes的大规模集群的标准配置和用户的生产落地实践,测试了Karmada同时管理100个5k节点和2wPod的Kubernetes集群的用户场景。 受限于测试环境和测试工具,本次测试并未追求测试到Karmada多集群系统的上限,而是希望能覆盖到在生产中大规模使用多集群技术的典型场景。 根据测试结果分析,以Karmada为核心的集群联邦可以稳定支持100个大规模集群,管理超过50万个节点和200万个Pod,可以满足用户在大规模生产落地的需要。
在本文中,我们将介绍用于测试的相关指标,如何进行大规模测试,以及我们如何实现大规模的集群接入。
背景
随着云原生技术的不断发展和使用场景的不断丰富,多云、分布式云逐渐成为引领云计算发展的趋势。著名分析公司Flexera在2021的调查报告显示,超过93%的企业正同时使用多个云厂商的服务,一方面受限于Kubernetes单集群的业务承载能力和故障恢复能力,单一的集群无法适应现有的企业业务,另一方面,在全球化的当下,企业出于避免被单家厂商垄断的目的,或是出于成本等因素考虑,更倾向于选择混合云或者多公有云的架构。 与此同时,Karmada社区的用户在落地的进程中也提出了多集群下大规模节点和应用管理的诉求。
Karmada介绍
Karmada(Kubernetes Armada)是一个Kubernetes管理系统,它能够使你在无需修改应用的情况下跨集群和跨云运行你 的云原生应用。通过使用Kubernetes原生API并在其上提供高级调度功能,Karmada实现了真正开放的多云Kubernetes。
Karmada旨在为多云和混合云场景中的多集群应用管理提供完全的自动化。它具备集中式多云管理、高可用性、故障恢复和流量调度等关键特性。

Karmada控制面包括以下组件:
- Karmada API Server
- Karmada Controller Manager
- Karmada Scheduler
ETCD存储了Karmada的API对象, karmada-apiserver提供了与所有其他组件通信的REST端口, 之后由karmada-controller-manager对你向karmada-apiserver提交的API对象进行对应的调和操作。
karmada-controller-manager运行着各种控制器,这些控制器watch着Karmada的对象,然后发送请求至成员集群的apiserver来创建常规的Kubernetes资源。
多集群系统资源池规模的维度和阈值
一个多集群系统的资源池规模不单指集群数量,即Scalability!=#Num of Clusters, 实际上多集群资源池规模包含很多维度的测量,在不考虑其他维度的情况下只考虑集群数量是毫无意义的。
我们将一个多集群的资源池规模按优先级描述为以下所示的三个维度:
- Num of Clusters: 集群数量是衡量一个多集群系统资源池规模和承载能力最直接且最重要的维度,在其余维度不变的情况下系统能接入的集群数量越多,说明系统的资源池规模越大,承载能力越强。
- Num of Resources(API Objects): 对于一个多集群系统的控制面来说,存储并不是无限制的,而在控制面创建的资源对象的数量和总体大小受限于系统控制面的存储,也是制约多集群系统资源池规模的重要维度。这里的资源对象不仅指下发到成员集群的资源模板,而且还包括集群的调度策略、多集群服务等资源。
- Cluster Size: 集群规模是衡量一个多集群系统资源池规模不可忽视的维度。一方面,集群数量相等的情况下,单个集群的规模越大,整个多集群系统的资源池越大。另一方面,多集群系统的上层能力依赖系统对集群的资源画像,例如在多集群应用的调度过程中,集群资源是不可或缺的一个因素。 综上所述,单集群的规模与整个多集群系统息息相关,但单集群的规模同样不是制约多集群系统的限制因素。用户可以通过优化原生的Kubernetes组件的方式来提升单集群的集群规模,达到扩大整个多集群系统的资源池的目的,但这不是衡量多集群系统性能的关注点。
本次测试中,社区参考了kubernetes的大规模集群的标准配置以及测试工具的性能,制定了测试集群的规模,以贴切实际生产环境中的单集群配置。在集群的标准配置中,Node与Pod毫无疑问是其中最重要的两个资源,Node是计算、存储等资源的最小载体,而Pod数量则代表着一个集群的应用承载能力。
事实上,单集群的资源对象也包括像service,configmap,secret这样的常见资源。这些变量的引入会使得测试过程变得更复杂,所以这次测试不会过多关注这些变量。
- Num of Nodes
- Num of Pods
对于多集群系统而言想 要无限制地扩展各个维度而且又满足SLIs/SLOs各项指标显然是不可能实现的。 各个维度不是完全独立的,某个维度被拉伸相应的其他维度就要被压缩,可以根据使用场景进行调整。 以Clusters和Nodes两个维度举例,在100集群下将单集群的5k 节点拉伸到10k node的场景或者在单集群规格不变的同时扩展集群数量到200集群,其他维度的规格势必会受到影响。 如果各种场景都进行测试分析工作量是非常巨大的,在本次测试中,我们会重点选取典型场景配置进行测试分析。在满足SLIs/SLOs的基础上,实现单集群支持5k节点,20k pod规模的100数量的集群接入和管理。
SLIs/SLOs
可扩展性和性能是多集群联邦的重要特性。作为多集群联邦的用户,我们期望在以上两方面有服务质量的保证。在进行大规模性能测试之前,我们需要定义测量指标。 在参考了Kubernetes社区的SLI(Service Level Indicator)/SLO(Service Level Objectives)和多集群的典型应用,Karmada社区定义了以下SLI/SLO来衡量多集群联邦的服务质量。
- API Call Latency
| Status | SLI | SLO |
|---|---|---|
| Official | 最近5min对单个资源对象Mutating API调用(包括POST、PUT、DELETE、PATCH)的P99时延 | P99 <= 1s |
| Official | 最近5min的non-streaming的只读API调用(包括GET和LIST)的P99时延 | (a)Scope=resource, P99 <= 1s, (b)Scope=namespace or Scope=cluster, P99 <= 30s |
- Resource Distribution Latency
| Status | SLI | SLO |
|---|---|---|
| Official | 用户在联邦控制面提交资源模板和下发策略后到资源在成员集群上被创建的P99时延,不考虑控制面与成员集群之间的网络波动 | P99 <= 2s |
- Cluster Registration Latency
| Status | SLI | SLO |
|---|---|---|
| WIP | 集群从接入联邦控制面到状态能被控制面正常收集的P99时延,不考虑控制面与成员集群之间的网络波动 | TBD |
- Resource usage
| Status | SLI | SLO |
|---|---|---|
| WIP | 在接入一定数量的集群后集群联邦维持其正常工作所必需的资源使用量 | TBD |
Note:
- 上述指标不考虑控制面和成员集群的网络波动。同时,单集群内的SLO不会考虑在内。
- 资源使用量是一个对于多集群系统非常重要的指标,但是不同多集群系统提供的上层服务不同,所以对各个系统来说资源的要求也会不同。我们不对这个指标进行强制的限制。
- 集群注册时延是从集群注册到控制面到集群在联邦侧可用的时延。它在某种程度上取决于控制面如何收集成员集群的状态。
测试工具
ClusterLoader2
ClusterLoader2是一款开源Kubernetes集群负载测试工具,该工具能够针对Kubernetes 定义的SLIs/SLOs 指标进行测试,检验集群是否符合各项服务 质量标准。此外ClusterLoader2为集群问题定位和集群性能优化提供可视化数据。ClusterLoader2 最终会输出一份Kubernetes集群性能报告,展示一系列性能指标测试结果。 然而,在Karmada性能测试的过程中,由于ClusterLoader2是一个为Kubernetes单集群定制的测试工具,且在多集群场景下它不能获取到所有集群的资源, 因此我们只用ClusterLoader2来分发被Karmada管理的资源。
Prometheus
Prometheus是一个开源的用于监控和告警的工具, 它包含数据收集、数据报告、数据可视化等功能。在分析了Clusterloader2对各种监控指标的处理后,我们使用Prometheus根据具体的查询语句对控制面的指标进行监控。
Kind
Kind是一个是用容器来运行Kubernetes本地集群的工具。为了测试Karmada的应用分发能力,我们需要一个真实的单集群控制面来管理被联邦控制面分发的应用。Kind能够在节约资源的同时模拟一个真实的集群。
Fake-kubelet
Fake-kubelet是一个能模拟节点且能维护虚拟节点上的Pod的工具。与Kubemark相比,fake-kubelet只做维护节点和Pod的必要工作。它非常适合模拟大规模的节点和Pod来测试控制面的在大规模环境下的性能。