Pod优先级和抢占提高Kubernetes集群资源利用率

Kubernetes以运行可扩展工作负载而闻名。它根据资源使用情况调整工作负载。扩展工作负载时,会创建更多应用程序实例。当应用程序对你的产品至关重要时,你希望确保即使在你的群集受资源压力下也会安排这些新实例。解决此问题的一个显而易见的解决方案是过度配置群集资源,以便为扩展情况提供一些闲置资源。这种方法通常有效,但成本更高,因为你必须为大多数时间闲置的资源付费。

Pod优先级和抢占是Kubernetes 1.14里一般可用的调度程序功能,它允许你在不过度配置群集的情况下为关键工作负载实现高水平的调度可信度。它还提供了一种方法来提高群集中的资源利用率,而不会牺牲基本工作负载的可靠性。

保证调度,控制成本

Kubernetes Cluster Autoscaler是K8s生态系统中的一款出色工具,可在你的应用程序需要时为你的群集添加更多节点。但是,群集自动缩放器有一些限制,可能不适用于所有用户:

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

另一种选择是Pod优先级(Priority)和抢占(Preemption)。在此方法中,你将多个工作负载组合在一个群集中。例如,你可以在同一群集中运行CI/CD管道,ML工作负载和关键服务。当多个工作负载在同一群集中运行时,群集的大小大于用于仅运行关键服务的群集。如果你为关键服务提供最高优先级,并且CI/CD和ML工作负载的优先级较低,则当你的服务需要更多计算资源时,调度程序会抢占(驱逐)较低优先级工作负载的足够容量,例如ML工作负载,以允许所有你要安排的优先级较高的pod。

使用pod优先级和抢占,你可以在Autoscaler配置中为群集设置最大大小,以确保在不牺牲服务可用性的情况下控制成本。此外,抢占比向群集添加新节点要快得多。在几秒钟内就可以安排高优先级的pod,这对延迟敏感的服务至关重要。

提高集群资源利用率

运行关键服务的集群运营商会随着时间,粗略估计他们在集群中需要的节点数量,以实现高服务可用性。估计通常是保守的。此类估计会考虑流量突发以查找所需节点的数量。可以配置群集自动缩放器永远不会将群集的大小减小到此级别以下。唯一的问题是这种估计通常是保守的,而且大多数时候集群资源可能仍未得到充分利用。Pod优先级和抢占允许你通过在群集中运行非关键工作负载来显着提高资源利用率。

非关键工作负载可能具有多于群集可以运行的pod数量。如果对非关键工作负载给予负数优先级,则当非关键容器挂起时,Cluster Autoscaler不会向群集添加更多节点。因此,你不会产生更高的费用。当你的关键工作负载需要更多计算资源时,调度程序会抢占非关键容器并安排关键容器。

非关键pod填充了群集资源中的“空隙”,可在不增加成本的情况下提高资源利用率。

参与其中

如果你对此功能有反馈意见或有兴趣参与设计和开发,请加入Scheduling特别兴趣小组。

https://github.com/kubernetes/community/tree/master/sig-scheduling

来源:CNCF官微

K8S中文社区微信公众号

评论 抢沙发

登录后评论

立即登录