Kubernetes在节点上保留空间以允许内存峰值



我在k8s上运行一个pod,它的基准内存使用量约为1GB。有时,根据用户的行为,pod可以在几分钟内消耗更多的内存(10-12GB),然后下降到基线水平。

我想在k8配置,是记忆请求会很低(1 gb),但pod将运行一个节点具有更高的内存容量。这样,当需要的时候,豆荚就会生长和收缩。我不配置请求的原因更高的是,我有这个pod的多个副本,理想情况下,我希望所有这些副本都托管在1-2个节点上,并在需要时让每个节点达到峰值,而不花费太多。

发现内存限制是违反直觉的配置不影响节点选择,这意味着如果我将限制配置为12GB,我仍然可以获得4GB的节点。

有没有办法配置我的pod来共享一些大节点,这样它们就可以扩展它们的内存使用而不会崩溃?

资源请求与限制

内存限制不影响节点选择,但内存请求影响。这是因为resource requestresource limit的概念服务于不同的目的。

  1. 资源请求确保您的pod至少有任何时候请求的资源量。
  2. 资源限制确保您的pod不超过任何时候的资源限制量。E-g没有正确设置内存限制会导致OOM(内存不足)杀死pod,这种情况经常发生。

资源请求是调度器用来决定如何在某些节点上调度您的pod的参数。限制不用于此目的,由应用程序设计人员正确设置pod限制。

那么你能做什么

你可以设置你的pod请求相同的方式,你正在做的。比如,1.5 gb的内存。然后,根据您的经验,您可以检查您的pod是否可以消耗多达12gb的内存。你正在运行这个应用程序的两个pod。因此,如果您希望在单个节点上调度这两个pod并且没有任何问题,则必须确保您的节点具有:

total_memory = 2 * pod_limit + overhead (system) OR
total_memory ~= 2 * pod_limit

开销是空闲节点的内存开销,它可以解释某些操作系统组件和群集系统组件(如kubeletkubeproxy二进制文件)的使用情况。但这通常是一个非常小的值。

这将允许您为您的pod选择正确的节点。

总结你必须确保你的pod有更多的内存来处理这个峰值(但不要太多,所以你将设置一个限制)。你可以在这里阅读更多。

注意:严格来说,pod没有shrink and grow,它们有一个固定的资源配置文件,这是由定义中的resource requestsresource limits决定的。还要注意的是,pod总是"占用"的。请求的资源数量,即使它没有使用它们。

控制调度的其他元素

此外,您还可以使用node-affinities添加一个"优先"调度程序来安排你的豆荚。我说preference是因为节点亲缘关系不是明确的规则,而是指导方针。您还可以使用anti-affinities确保某些豆荚不要安排在相同的节点上。请记住,如果pod处于未被调度的危险中,则调度程序可能会忽略affinityanti-affinity规则。

最后一个选项是,您可以在pod上使用nodeSelector,以确保它落在指定选择器条件的节点上。如果没有节点匹配此选择器,则您的pod将停留在Pending状态,这意味着它无法在任何地方调度。你可以在这里阅读。

因此,在您决定要将pod调度到哪些节点之后,您可以标记它们,并使用选择器来确保将pod调度到匹配的节点上。

还可以为您的pod提供指定的nodeName,以强制它在特定节点上调度。这是一个很少使用的选项。原因很简单,因为节点可以在集群中添加/删除,这将要求每次发生这种情况时更改pod定义。使用nodeSelector更好,因为您可以指定像label这样的一般属性,您可以将其附加到添加到集群的新节点上,并且pod调度不会受到影响,pod定义也不会受到影响。

希望对你有帮助。

最新更新