本文发布时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
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 填充集群资源中的“空洞”,从而提高资源利用率,而不会增加您的成本。
参与其中
如果您对此功能有反馈,或有兴趣参与设计和开发,请加入调度特别兴趣小组。