Kubernetes水平Pod自动缩放的糟糕状态

在以前的生活中,我做了很多与系统控制的工作,监控和调整物理系统,而总是有非常满足约看到他们在行动的东西。在计算中,其使用大多局限于自动缩放系统,但即使有理论往往是在一个非常有限的方式误用或使用。即使在其中内置完全围绕调度工作负荷的系统,像Kubernetes,实施是非常有限的。在这篇文章中,我将看看Kubernetes吊舱自动配置器的默认实现的调度研究,并在一些替代品(也缺乏)。

pod水平自动扩展
Kubernetes附带了一个名为(HPA)的pod自动配置器。它将管理部署,StatefulSet或ReplicaSet,荚基于当前量荚多少资源使用和量必须由用户提供预定的目标。

默认情况下,资源监控可以通过对量相比它们具有请求-pod使用的CPU或RAM,以百分比表示。如果你安装了外部度量API,你甚至可以自动缩放像未完成的消息在消息队列或金额的请求的平均延迟任意指标的pod。每30秒(配置)的HPA将检查的实际使用情况是怎样与它应该是多少,然后它会根据需要添加或带排队两回删除尽可能多的pod。举个例子:假设你有10个pod用的80%的目标CPU利用率运行(有一些空间负荷尖峰)。如果pod使用90%的CPU中,HPA确定它需要(90/80*10)= 11.25pod以使利用回至80%。这在实践中导致2个pods添加。如果HPA措施实际CPU利用率仅为40%,它可以去除一半的pod带来的平均利用率回升至80%。添加或移除荚后,通常存在一个冷却期,在此期间没有多余的pod将被添加或移除。

这种方法有一些问题。首先,要被添加或基于测量一个相当短的窗口移除pod的量。这意味着,如果你有较少利用的短时间内,HPA会高兴地扔掉你的大多数pod一气呵成。当负载挑选备份,你会非常underprovisioned。有关于使这个更configrable回购的一些问题。自2017年该链接的问题一直是开放的,但没有锁定已经取得了呢。它也不可能指定多远或扩大跌幅限制,在HPA总是试图pod的理想的量一个跳跃。这可能导致问题,如果pod使用显著更多的资源在启动时比正常运行期间。

在$ WORK一个特定情况下,我们遇到了,从这个特别受到一个用例:自动缩放运行的后台工作pod。在这种情况下,只要队列中有项目的所有工作人员将努力工作,因为他们可以和HPA。鉴于CPU使用率较高,将增加更多的豆荚,直到队列为空一次。然后,当最后足够的工人已被添加到空出队列,还有工人的大量过剩和HPA将消除他们中的很多。我们在那里荚80+%的一个动作被删除观察到的情况。这一行动之后,会有太少荚与负载跟上,并开始新的循环。这导致在使用荚数量大的“锯齿”尖峰其中豆荚的数量将不断上升,直到队列是空的,在这之后最荚再次得到了删除。

其他解决方案
作为默认HPA的缺点的结果,几个人都写替代版本。然而,所有我见过的那些至今遭受这些缺陷中的至少一个:

运行外部到Kubernetes,因此所述度量,重新启动时,缩放等由Kubernetes提供错过。
无状态的,即它们不跟踪先前的使用模式随着时间的推移。
如果不是无状态:当容器被终止或改期失去状态。
用途比例控制而已,顶多会用的测量,而不是推行适当的PID控制器滚动窗口。
只会增加或每循环删除单荚或直接跳转到舱体的目标数,没有中间地带允许的。
采用定标超时VS正确地选择采样时间的:这是一个从控制理论,运行控制回路需要的频率,以匹配您的过程中固有的时间常数一个众所周知的结果。超时只能接近这个。
没有自动化测试(所有)。
如果我能有我想要的任何系统的话,大概至少有以下特点:

运行作为内部Kubernetes本身就是一个吊舱。
能否生存下去,而不会影响被暂时不可用功能外被重新安排。
采用了比基于单个测量只是比例控制更复杂的控制算法。
高度可配置的。
很好的测试。
到目前为止,还没有我见过的替代品打所有的这些。也许我将有一个刺自己,虽然有当然的XKCD标准的情况,注意,我不知道还没有对如何处理这个问题。

结论
对于复杂的吊舱自动缩放的好处似乎是主要原因为采用容器调度系统,如Kubernetes之一,但它并没有真正实现。这似乎是与很多更“高级”调度Kubernetes部分的一种趋势,它通常不会在你所期望的行为方式。很多人发现较晚,如果ConfigMap更新部署引用ConfigMap不会卷本身(普罗蒂普:使用configmap发电机从kustomize帮助了很多在这里)。同样地,当容器被安排在第一次荚只分配给节点。当你添加了一些新的节点(这将保持为空),然后删除旧的太快,这可能会导致一些惊喜。这是非常有可能违反pod破坏预算的方式。您还可以得到一些很片面节点的使用模式时,一些节点留下空的,有些是非常充分。有些人甚至增加了一个自动的过程,以杀死希望,这将导致pod的节点间更好地分配随机pod。这些东西大部分都记录不完整,你只当它打破发现它们。

不要误会我的意思,Kubernetes得到了很多正确的事情,虽然这是一个复杂的东西,它通常是在隐藏了复杂性的成功。我只是想让更多的逃生舱口对于那些不可避免的时刻,当你遇到一个情况是,开发者没有预料到的。需要对来自全国各地的互联网哈克脚本来执行基本功能正常,使所有Kubernetes外观缺乏吸引力,这将是更优选地将有正式的工具有这些令人吃惊的陷阱少。
https://wjwh.eu/posts/2020-01-04-kubernetes-autoscaling.html