【问题标题】:How does Kubernetes knows what pod to kill when downscaling?Kubernetes 在缩减规模时如何知道要杀死哪个 pod?
【发布时间】:2019-09-12 13:48:32
【问题描述】:

有没有办法告诉 Kubernetes 在缩减之前或之后要杀死哪些 pod?例如,假设我有 10 个副本,我想将它们缩减为 5 个,但我希望某些副本在缩减后仍然存在,而其他副本则被杀死。这可能吗?

【问题讨论】:

  • 您为什么要这样做?这可能是可能的,但这取决于您真正想要实现的目标,这可能会影响哪些解决方案对您来说是可行的。
  • @AmitKumarGupta 有一个应用程序可以根据一些指标来扩展 Pod,并且 Pod 会消耗一个队列。我想要的是仅在队列为空时杀死空闲的 Pod。
  • 是否所有的 pod 都从同一个队列中读取?您是否担心 k8s 会杀死当前正在执行任务的 pod,并且在飞行途中这样做会使其处于不一致的状态?如果是这样,您可能正在尝试解决错误的问题。真正的问题是您没有优雅地处理任务失败。
  • @GrantDavidBachman 在这种情况下,在我的解决方案中,任务会转到队列的末尾,由另一个 pod 再次处理。问题是当我有一些大任务时。在这种情况下,当队列为空时,控制器将缩减 pod,不加选择地杀死空闲和工作的 pod,并让另一个 pod 处理该任务,即使它已完成 99%。

标签: kubernetes


【解决方案1】:

虽然无法选择性地选择杀死哪个 pod,但您可以防止您真正关心的事情,即杀死正在处理任务中的 pod。这需要你做两件事:

  1. 您的应用程序应该能够侦听和处理 SIGTERM 事件,Kubernetes 在杀死它们之前将其发送到 Pod。在您的情况下,您的应用将通过完成任何正在进行的任务然后退出来处理 SIGTERM。
  2. 您将 pod 上的 terminationGracePeriodSeconds 设置为大于处理最长任务所需的最长时间。设置此属性会延长 k8s 发送 SIGTERM(要求您的应用程序完成)和 SIGKILL(强制终止)之间的时间段。

【讨论】:

    【解决方案2】:

    根据@Matt link 和@Robert Bailey 的回答,目前基于resources 的K8s resources 不支持缩放功能,从副本池中删除了一些特定的Pod。您可以找到相关的#45509 问题并跟进#75763 PR。

    【讨论】:

      【解决方案3】:

      您可以使用有状态集而不是副本集: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ 它们将按顺序创建 (my-app0,my-app1,myapp2),当您缩小时,它们将以相反的顺序从 {N-1..0} 终止。

      【讨论】:

        猜你喜欢
        • 2012-04-29
        • 2015-07-10
        • 2020-04-19
        • 2017-09-10
        • 2018-05-05
        • 2020-04-16
        • 1970-01-01
        • 1970-01-01
        • 2018-06-25
        相关资源
        最近更新 更多