【问题标题】:Why does kubernetes HorizontalPodAutoscaler scale down the youngest pod?为什么 kubernetes Horizo​​ntalPodAutoscaler 会缩小最年轻的 Pod?
【发布时间】:2021-02-03 05:37:24
【问题描述】:

通过搜索和观察我们集群的行为,似乎如果我们有一个 Horizo​​ntalPodAutoscaler,当它缩小时,它会选择最年轻的 pod,或者至少最年轻的豆荚之一。

有没有办法让它缩小最旧的?

缩小最新版本的基本原理是什么?我们最终会得到许多寿命很短的豆荚,还有一些寿命很长的豆荚。 (那些寿命很长的 pod 最终会占用大量内存。)

或者我们可以让它随机挑选?

选择最年轻的 pod 导致的另一个问题是,我们对具有特征的节点具有亲和力,它会将旧的 pod 留在其他节点上,并且总是缩小我们想要它们的节点上的那些。

【问题讨论】:

  • 好吧,我想答案是“否”,确实如此。但是最后一个要点是,如果 2 个豆荚仅在年龄上有所不同,则会删除较年轻的豆荚。似乎它不应该有,或者应该反过来。移除较年轻的人会破坏优先亲和力,并与我认为的传统智慧背道而驰。
  • 它当然不能解释优先级计算的那部分的合理性,这是我的问题的一部分。
  • 无法配置删除哪些 pod。如 LauriKoskeka 链接所示,删除 pod 有一定的标准,但您可以强制执行您自己的规则。但是,如果您使用关联性,则应遵循规则在您想要的节点中运行 pod。这有什么问题?
  • 问题是为什么它选择最年轻的。有什么不清楚的地方?亲和力的问题是,当它增加一个新的 pod 扩展时,它会将其放在我们的首选节点池中,但是当它缩小时,它会删除那个,所以如果我们还没有大部分都在首选池中,我们永远不会大部分时间都在首选池上。这对我来说似乎也很清楚。我猜你的里程可能会有所不同。

标签: kubernetes autoscaling


【解决方案1】:

我认为这种行为与 HPA 无关,而是与控制器有关。

正如你所看到的here,你可以看到这条规则有不同的条件:

// 1.如果只有一个pod分配给一个node,那不是的pod // 赋值在 pod 之前。

// 2. 如果 pod 的阶段不同,则待处理的 pod 位于其阶段的 pod 之前 // 是未知的,相位未知的 pod 会在运行的 pod 之前。

// 3. 如果正好有一个pods准备好了,那么没有准备好的pod就来了 // 在准备好的 pod 之前。

// 4. 如果 pod 的 rank 不同,则 rank 大的 pod 排在前面 // 排名较低。

// 5. 如果两个 pod 都准备好了,但还没有准备好相同数量的 // 时间,已经准备好更短时间的 pod 来了 // 在已经准备好更长时间的 pod 之前。

// 6. 如果一个 pod 中的容器重启次数多于其中的任何容器 // 另一个 pod,容器重启次数较多的 pod 来了 // 在另一个 pod 之前。

// 7. 如果 Pod 的创建时间不同,则最近创建的 Pod // 出现在旧 pod 之前。

你可以看到相关的讨论here

另外,这个功能似乎正在按照herehere 的讨论来实现

【讨论】:

  • 我的意思是,您与“这里”链接的所有三个 github 问题都由于不活动而全部关闭。换句话说,因为它们是最旧的而被删除。对于 Kubernetes HPA 来说,这似乎是一个更好、更简单、更容易的策略。或者不管年龄删除一个随机的 pod 都可以。删除使用最多内存的 pod 也可以。对此有一些设置/选项也很好。当前的行为充其量只是很糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2019-07-21
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
相关资源
最近更新 更多