本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 中的 Pod 优先级和抢占

Kubernetes 因运行可伸缩的工作负载而闻名。它根据您的资源使用情况伸缩您的工作负载。当工作负载向上伸缩时,会创建更多应用程序实例。当应用程序对您的产品至关重要时,即使您的集群资源紧张,您也希望确保这些新实例能够被调度。解决此问题的一个显而易见的解决方案是超额配置您的集群资源,以备在伸缩时留出一些空闲资源。这种方法通常有效,但成本更高,因为您将不得不为大部分时间空闲的资源付费。

Pod 优先级和抢占是 Kubernetes 1.14 中普遍可用的调度器功能,它允许您在不超额配置集群的情况下,为关键工作负载实现高水平的调度置信度。它还提供了一种在不牺牲关键工作负载可靠性的情况下提高集群资源利用率的方法。

以受控成本实现有保障的调度

Kubernetes 集群自动伸缩器是生态系统中一个出色的工具,它会在您的应用程序需要时向集群添加更多节点。但是,集群自动伸缩器有一些限制,可能不适用于所有用户。

  • 它不适用于物理集群。
  • 向集群添加更多节点会增加成本。
  • 添加节点不是即时的,可能需要几分钟才能使这些节点可用于调度。

Pod 优先级和抢占是另一种选择。在这种方法中,您可以在一个集群中组合多个工作负载。例如,您可以在同一个集群中运行 CI/CD 流水线、ML 工作负载和关键服务。当多个工作负载在同一个集群中运行时,您的集群大小会大于您仅用于运行关键服务的集群。如果您将关键服务设置为最高优先级,而将 CI/CD 和 ML 工作负载设置为较低优先级,那么当您的服务需要更多计算资源时,调度器会抢占(驱逐)足够的较低优先级工作负载(例如,ML 工作负载)的 Pod,以允许所有较高优先级的 Pod 调度。

通过 Pod 优先级和抢占,您可以在自动伸缩器配置中设置集群的最大大小,以确保在不牺牲服务可用性的情况下控制成本。此外,抢占比向集群添加新节点快得多。您的优先级高的 Pod 会在几秒钟内被调度,这对于对延迟敏感的服务至关重要。

提高集群资源利用率

运行关键服务的集群运维人员会随着时间的推移,对集群中需要多少节点才能实现高服务可用性有一个粗略的估计。这个估计通常是保守的。这些估计会考虑流量高峰来确定所需的节点数量。集群自动伸缩器可以配置为永不将集群大小减小到此水平以下。唯一的问题是,这些估计通常是保守的,并且集群资源在大部分时间可能处于利用不足的状态。Pod 优先级和抢占允许您通过在集群中运行非关键工作负载来显著提高资源利用率。

非关键工作负载可能有很多超出集群容量的 Pod。如果您为非关键工作负载设置负优先级,则当非关键 Pod 处于待处理状态时,集群自动伸缩器不会向集群添加更多节点。因此,您不会产生更高的费用。当您的关键工作负载需要更多计算资源时,调度器会抢占非关键 Pod 并调度关键 Pod。

非关键 Pod 填补了集群资源中的“空白”,从而提高了资源利用率,而不会增加您的成本。

参与其中

如果您对此功能有任何反馈,或者有兴趣参与设计和开发,请加入调度特别兴趣小组