如何在Kubernetes中对大量非活动Pod有效地使用CPU?

我有很多服务。一天中,少数服务忙了大约十个小时,而其他大部分服务都处于空闲状态或使用少量cpu。

以前我把所有的服务都放在一个有两个cpu的虚拟机里,按cpu的使用情况进行缩放,最忙的时候有两个虚拟机,但大多数时候只有一个。

服务 实例 一天中的忙碌时间 忙碌时的CPU
(核心/服务)
空闲时的 CPU
(核心/服务)
繁忙的服务 2 8~12小时 0.5~1 0.1~0.5
繁忙的服务 2 8~12小时 0.3~0.8 0.1~0.3
非活动服务 30 0~1小时 0.1~0.3 < 0.1

回答

我把所有的服务放在一个有两个cpu的虚拟机里,按cpu的使用情况进行缩放,最忙的时候有两个虚拟机,但大多数时候只有一个。

首先,如果您有任何可用性要求,我建议您始终至少拥有两个节点。如果您只有一个节点并且发生了一次崩溃(例如硬件故障或内核崩溃),则需要几分钟时间才能检测到这一点,而在新节点启动之前需要几分钟时间。

inactive service requests cpu设置为100m,因为忙的时候小于100m就不好用了。

我觉得问题是这些服务虽然需要100m的cpu才能正常工作,但大多是闲置的。

CPU请求是有保证的预留资源量。在这里,您为几乎空闲的服务预留了太多资源。将 CPU 请求设置得更低,可能低至20m甚至更低5m?但是由于这些服务在繁忙时期会需要更多资源,所以设置一个更高的限制,以便容器可以“爆裂”,并为此使用Horizo​​ntal Pod Autoscaler。使用 Horizo​​ntal Pod Autoscaler 时,将创建更多副本,并且流量将在所有副本之间进行负载平衡。另请参阅管理容器资源。

这对于你的“繁忙的服务”也是如此,保留更少的 CPU 资源,更积极地使用 Horizo​​ntal Pod Autoscaling,以便在高负载时将流量分散到更多节点,但在流量低时可以缩减并节省成本。

我真的希望所有的服务都可以自动伸缩,我认为这是 kubernetes 的好处,它可以帮助我更灵活地分配 pod。我的想法错了吗?

是的,我同意你的看法。

我不应该为非活动服务设置请求 CPU 吗?

总是为requestlimit设置一些值是一个很好的做法,至少对于生产环境是这样。如果没有资源请求,调度和自动缩放将无法正常工作。

如果我有更多的活跃服务,即使在非高峰时间,请求cpu也会超过2000m。有什么解决办法吗?

一般来说,尽量使用较低的资源请求,并更积极地使用 Horizo​​ntal Pod Autoscaling。这对于您的“繁忙服务”和“非活动服务”都是如此。

我发现 kubernetes 经常有两个以上的节点。

是的,这有两个方面。

如果您只使用两个节点,您的环境可能很小,Kubernetes 控制平面可能包含更多节点,并且是成本的主要部分。对于非常小的环境,Kubernetes 可能很昂贵,并且使用诸如Google Cloud Run 之类的无服务器替代方案会更具吸引力

其次,对于可用性。在突然崩溃(例如硬件故障或内核崩溃)的情况下,最好至少有两个节点,这样您的“服务”仍然可用,同时节点自动缩放器会扩展一个新节点。对于 a的副本数量也是如此Deployment,如果可用性很重要,请至少使用两个副本。例如,当您排空节点以进行维护或节点升级时,pod 将被逐出 - 但不会首先在不同的节点上创建。控制平面将检测到Deployment(技术上是 ReplicaSet)的副本数量少于所需数量并创建一个新的 pod。但是当在新节点上创建新的 Pod 时,容器镜像会在 Pod 运行之前先被拉取。为了避免这些事件中的停机时间,使用至少两个副本为您Deployment和机架拓扑传播限制,以确保这两个副本的不同节点上运行。


注意:当 Pod 通常需要较低的 CPU 但会定期扩展时,您可能会遇到与如何使用 K8S HPA 和自动缩放器相同的问题,这应该通过即将推出的 Kubernetes 功能来缓解:KEP - Trimaran :Real Load Aware Scheduling

  • If only every question and answer in SO were this good.

以上是如何在Kubernetes中对大量非活动Pod有效地使用CPU?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>