这个问题最终让 Grafana 放弃了当前方案。他们一直在监控集群的内存和 CPU 综合利用率,效果发现 AWS 集群的体现远不如在其他云提供商上的集群。这意味着他们一直在烧钱,有些集群的空闲率甚至超过了 40%!
此外,Grafana 还遇到了 Amazon EKS 的 Pod 数量上限问题。对于那些需要放在一起但不需要大量资源的工作负载,当到达答应的最大 Pod 数量时,其节点容量才刚利用了一半左右。甚至有一次,CA 因为以为节点未被充分利用,主动缩减了一个节点组,而此时一些 Pod 却因为没有足够的 IP 无法调度到其他地方,导致它们一直处于待定状态。
于是,Grafana 开始寻找其他解决方案。
评估新的Autoscaling方案
Grafana 团队研究了 CA 的配置选项,想知道是否是团队没有正确利用这个工具。不过,现有的设置和选项并不敷以解决他们面临的问题。看起来,这个工具并不能满足 Grafana 的需求。
Grafana 团队开始猜疑是否他们的需求真的和其他人如此不同,并思量开始自己定制一款调度器。但花了一些时间研究这个想法之后,很快意识到这个项目标规模着实太大,成本也会非常高,而且这肯定无法实现标准化。假如有更好的替代方案,他们不想选择这种做法。
Karpenter:它真的能像听起来那么好吗?
仅此一项就意味着相应的成本低落;更好的资源利用率意味着不必为过多的闲置容量付费。此外,Karpenter 最强大的卖点之一是其整合(Consolidation)能力。
Karpenter 会不断计算集群工作负载的整体需求以及当前运行这些工作负载的基础设施。假如它确定有更便宜的节点配置可用,而且满足其提供者的约束条件以及工作负载的需求,它将逐步撤销并更换节点,直到整个集群的成本得到优化。
给 Karpenter 提供的选项越多(实例类型、系列、巨细等),它就越能根据 AWS 的及时可用性来优化你的成本。由于 Karpenter 为你完成了繁重的计算,你不必花太多精力去决定哪种实例类型最适合你的集群;它可以自行处理。在本例中,它最终偏向于一个被忽视了几个月的特定实例类型。
与 CA 不同,Karpenter 可以或许进行复杂的计算,并请求满足你确切需求的实例类型组合,因为它与 EC2 API 持续交互,可以或许按需及时提供节点,而且不受限制于严格界说的实例池。
请注意,整合仅实用于按需实例。Karpenter 对于 Spot 实例接纳了略有不同的方法。
Grafana 最大的集群工作负载的利用率和分布情况如下:
酿成这个状态:
该可视化图表展示了内存和 CPU 的利用率比。团队积极将两者尽可能接近 1(右上角),这意味着完全利用。然而,由于 CPU 是 Grafana 主要的成本驱动因素,因此利用点的巨细来直观地表示这些节点的核心数量。点的颜色则表示代价——绿色代表较便宜的节点,而赤色则表示较昂贵的节点。
如前所述,CPU 是主要的成本驱动因素,这意味着节点的巨细在某种程度上与代价相关:点越大,通常情况下代价越高。这意味着团队最关心的是最大的、最红的点,而且更关注将它们移动到图表的右侧(最大化 CPU 利用率),而不是移动到顶部(最大化内存利用率)。
在这里可以看到,最相关的节点从顶部中心移动到了顶部右侧,而且它们聚集得更加精密。意味着这次实验乐成了!
进步可靠性
假如某项变更可以节省你的成本,每每意味着你需要在可靠性上付出代价。然而,在本例中,情况恰好相反。
Karpenter 自己支持指定容量类型,并优先利用 Spot 实例。假如没有可用的 Spot 实例,它会自动回退到按需实例。
此外,它解决了Grafana 团队在利用 CA 时面临的一个主要问题:Karpenter 在决定是否可以删除节点时会思量最大可用 pod 数量,确保不仅有足够的资源,还有可用的 IP 地点供被驱逐的 pod 利用。
通过简单地用一个工具更换另一个工具,它解决了 Grafana 面临的两个最严重的可靠性问题。
如何处理节省计划?