【问题标题】:Why does scaling down a deployment seem to always remove the newest pods?为什么缩减部署似乎总是删除最新的 Pod?
【发布时间】:2018-07-23 11:54:09
【问题描述】:

(在开始之前,我在 Windows 10 上使用 minikube v27。)

我使用 nginx 'hello world' 容器创建了一个部署,期望计数为 2:

我实际上进入了 '2 小时' 旧 pod 并将欢迎消息中的 index.html 文件编辑为“损坏” - 我想使用 k8s 看看如果一个 pod 出现“故障”会是什么样子.

如果我将此部署扩展到更多实例,然后再次缩减,我几乎预计 k8s 会删除最旧的 pod,但它始终会删除最新的:

如何让它首先删除最旧的 pod?

(理想情况下,如果可能的话,我只想说“将所有内容重新部署为滚动部署中完全相同的版本/映像/所需数量”)

【问题讨论】:

  • 我在这个问题上看到的大多数大问题的答案都涉及在 pod 规范中添加一些会改变的东西——使用带有版本标签的图像,而不是“最新的”,Helm 生成的哈希值ConfigMap 内容作为注释。这仍然是一个好问题。
  • @DavidMaze 即使我可以“欺骗”它认为 pod 已更改,如果没有简单的方法可以做到这一点,我会感到惊讶。保持最古老的豆荚的规模化活动感觉就像餐厅用新鲜的米饭填满他们的米饭锅,但把旧的留在底部。当然,旋转有意义吗?特别是如果豆荚是相同的...
  • 吊舱是相同的。你为什么在乎?从纯粹的性能角度来看,较新的 Pod 可能不太热身(缓存中的数据较少等),因此首先删除它们是有意义的。如果您的 pod 随着时间的推移而退化,那么缩小规模并不能解决该问题。
  • @NeilTrodden 它如何“有意义”?如果 Pod 正在运行 Redis 或 Memcached 等内存缓存,并且在运行过去几个小时后,该缓存已完全填充了值,如果您向上和向下扩展部署,您真的希望 k8s 完全删除您的 -填充缓存并将其替换为仅使用了几分钟的缓存?您永远不应该通过 SSH 连接到您的 pod 并直接编辑其中的任何数据,如果您需要在 pod 重新启动或更改之间保留数据,请使用已安装的卷。
  • @NeilTrodden 如果您希望 k8s 自动清除以某种方式损坏的 pod,然后实施应用程序级别的健康检查,更多信息在这里:kubernetes.io/docs/tutorials/k8s201/…

标签: kubernetes


【解决方案1】:

Pod 删除偏好基于一系列有序的检查,在此处的代码中定义:

https://github.com/kubernetes/kubernetes/blob/release-1.11/pkg/controller/controller_utils.go#L737

总结-优先删除pod:

  • 未分配给节点,与分配给节点
  • 处于挂起或未运行状态,与正在运行
  • 未准备好与准备好
  • 处于就绪状态的时间较短
  • 重启次数较多
  • 创建时间新旧

这些检查不能直接配置。

根据规则,如果您可以使旧 pod 未准备好,或导致旧 pod 重新启动,则将在缩减时间将其删除,然后再准备好但尚未重新启动的新 pod。

关于控制删除优先级的能力的用例进行了讨论,其中主要涉及工作和服务混合的工作负载,这里:

https://github.com/kubernetes/kubernetes/issues/45509

【讨论】:

  • 感谢您回答我的问题。我可能还没有做 k8s,但我必须知道这是经过深思熟虑的逻辑。
  • 除了最后一个之外,这些项目符号似乎是正确的。特别是,它会破坏您在 pod 上可能拥有的任何优先亲和力。而且它违背了这样一个事实,即在 VM 和 Kubernetes 上运行具有重启旧事物的优势,这往往会导致更多的故障和更差的性能。
  • 直接链接到来自该讨论的功能:kubernetes.io/docs/concepts/workloads/controllers/replicaset/…
猜你喜欢
  • 2011-08-27
  • 2019-02-05
  • 2015-08-23
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
相关资源
最近更新 更多