如何自己部署autoscaler实现节点的自动扩缩容(四):低负载自动缩容与重调度

原创 吴就业 118 0 2024-05-09

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/977cb3257cd741d0914c42dfa6bd488e

作者:吴就业
链接:https://wujiuye.com/article/977cb3257cd741d0914c42dfa6bd488e
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

根据README文档的介绍,autoscaler支持当节点的负载低于多少时,能够驱逐节点上的pod然后缩容。通过scale-down-utilization-threshold参数配置,默认值为0.5。

实验步骤:首先通过部署两个demo-web(自己写的demo服务)的pod,调用demo-web的接口模拟cpu利用率100%,然后将副本数增加到3,此时会触发扩容一个节点出来。然后调用demo-web的接口模拟cpu利用率降到10%。此时节点1的利用率为26%,节点2的利用率为5%(因为节点上有一些daemonset)。

截屏2024-05-09 18.30.35

正常来说,应该是能触发缩容。然而实验结果并没有缩容,通过debug发现,在SimulateNodeRemoval模拟移除节点缩容的逻辑中,由于两个节点上都部署有Pod,所以会有一个尝试将节点上的Pod移除,并将这些Pod调度到其它节点的逻辑,跟扩容时模拟扩容节点并调用TrySchedulePods尝试调度Pod的逻辑是一样的,然后也会拿过滤插件执行。

由于之前我们在验证支持自定义插件触发扩容节点的时候,添加了一个只要是非Mock节点的都拒绝的过滤器:

func (c *NoCheckerPlugin) Filter(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status {
    if strings.HasPrefix(nodeInfo.Node().Name, "template") { //Mock 节点
       return framework.NewStatus(framework.Success, "")
    }
    return framework.NewStatus(framework.Unschedulable, "No checker.")
}

因为这个过滤插件的原因,导致这次的实验失败,scale-down-utilization-threshold不生效。

为了继续完成验证,暂时先移除这个过滤插件。

img

移除自定义过滤插件后,从日志可以找到,模拟kkch节点移除时,pod可被驱逐到了另一个节点,kkch节点可被删除。之后节点也正常被回收。

默认scale-down-utilization-threshold的值为0.5太高,实际可以通过--scale-down-utilization-threshold=0.1配置启动参数来调低。

与我们想要的重调度效果一致吗?

低负载自动缩容节点的这个特性还是非常有必要的,能够避免资源的过渡浪费。因为随着时间的推移,集群中势必会出现非常多的弹性节点利用率很低的情况。尽管我们在自己实现的deployment controller上加了缩容逻辑,优先干掉部署在低负载的节点上的Pod,但这也只发生在Pod缩容和滚动更新的时候。

如果自定义调度器的过滤插件和autoscaler能表现一致,例如自定义调度器过滤插件限制负载最高75%,超过则扩容节点,如果autoscaler也实现相同逻辑的过滤插件,表现跟调度器一致,就可以利用scale-down-utilization-threshold来达到重调度的效果。

例如将scale-down-utilization-threshold配置为0.3,这样就可以将低负载的节点上的Pod驱逐到其它未超过75%负载的Pod,从而缩容这些低负载的Node。

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

在gcp平台上创建一个gke集群,怎么获取gke集群的证书

在gcp平台上,使用gke服务,创建一个k8s集群,若想在本地能够通过kubectl命令或者可视化工具访问到集群,需要通过gcloud命令获取访问集群的证书。

基于开源autoscaler二次开发的目的以及效果演示

基于开源的autoscaler二次开发,通过自部署autoscaler来替代GKE提供的节点自动扩缩容能力,获取更好的扩展性和更灵活的配置。主要增强以下特性:支持目标负载扩容、更快的缩容速度、支持低负载自动缩容-重调度。

autoscaler缩减低利用率的节点,修改为使用节点的实时指标而不是requests

但其实我们忽略了一点,autoscaler是根据部署在节点上的所有Pod声明的requests来计算资源使用率的,这个并不能反应真实情况。

如何自己部署autoscaler实现节点的自动扩缩容(三):验证修改缩容节点时长

autoscaler,想要缩短空闲节点被回收的时间,需要同时考虑三个启动参数的配置:scale-down-unneeded-time、unremovable-node-recheck-timeout、scale-down-delay-after-add。

如何自己部署autoscaler实现节点的自动扩缩容(二):支持自定义调度器触发的扩容

想要让autoscaler支持自定义调度器触发节点扩展,有两种方案。一是autoscaler支持自定义调度器的过滤器插件,二是autoscaler取消check逻辑。

如何自己部署autoscaler实现节点的自动扩缩容(一):本地debug运行autoscaler

在google cloud上使用gke集群,gke已经集成autoscaler,通过在控制台创建节点池点击开启自动扩缩容就可以,那么为什么还要自己部署呢?怎么本地让autoscaler成功跑起来呢?