这篇文章已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已失效。
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 填充了集群资源中的“空隙”,从而提高了资源利用率,同时不增加成本。
参与其中
如果你对这个特性有反馈,或者有兴趣参与设计和开发,请加入 Scheduling 特别兴趣小组 (SIG)。