Kuibernetes 如何根据不同业务场景调节 HPA 扩缩容灵敏度

这篇具有很好参考价值的文章主要介绍了Kuibernetes 如何根据不同业务场景调节 HPA 扩缩容灵敏度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景


在 K8s 1.18 之前,HPA 扩容是无法调整灵敏度的:

  1. 对于缩容,由 kube-controller-manager 的 --horizontal-pod-autoscaler-downscale-stabilization-window 参数控制缩容时间窗口,默认 5 分钟,即负载减小后至少需要等 5 分钟才会缩容。

  2. 对于扩容,由 hpa controller 固定的算法、硬编码的常量因子来控制扩容速度,无法自定义。

这样的设计逻辑导致用户无法自定义 HPA 的扩缩容灵敏度,而不同的业务场景对于扩容容灵敏度要求可能是不一样的,比如:

  1. 对于有流量突发的关键业务,在需要的时候应该快速扩容 (即便可能不需要,以防万一),但缩容要慢 (防止另一个流量高峰)。

  2. 对于一些需要处理大量数据的离线业务,在需要的时候应该尽快扩容以减少处理时间,不需要那么多资源的时候应该尽快缩容以节约成本。

  3. 处理常规数据/网络流量的业务,它们可能会以一般的方式扩大和缩小规模,以减少抖动。

HPA 在 K8s 1.18 迎来了一次更新,在之前 v2beta2 版本上新增了扩缩容灵敏度的控制,不过版本号依然保持 v2beta2 不变。

 

如何使用


这次更新实际就是在 HPA Spec 下新增了一个 behavior 字段,下面有 scaleUp 和 scaleDown 两个字段分别控制扩容和缩容的行为,具体可参考官方 API 文档: https://v1-18.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#horizontalpodautoscalerbehavior-v2beta2-autoscaling

下面给出一些使用场景的示例。

快速扩容

当你的应用需要快速扩容时,可以使用类似如下的 HPA 配置:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: web
spec:
  minReplicas: 1
  maxReplicas: 1000
  metrics:
  - pods:
      metric:
        name: k8s_pod_rate_cpu_core_used_limit
      target:
        averageValue: "80"
        type: AverageValue
    type: Pods
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  behavior: # 这里是重点
    scaleUp:
      policies:
      - type: percent
        value: 900%

上面的配置表示扩容时立即新增当前 9 倍数量的副本数,即立即扩容到当前 10 倍的 Pod 数量,当然也不能超过 maxReplicas 的限制。

假如一开始只有 1 个 Pod,如果遭遇流量突发,它将以飞快的速度进行扩容,扩容时 Pod 数量变化趋势如下:

1 -> 10 -> 100 -> 1000

没有配置缩容策略,将等待全局默认的缩容时间窗口(--horizontal-pod-autoscaler-downscale-stabilization-window,默认5分钟) 后开始缩容。

快速扩容,缓慢缩容

如果流量高峰过了,并发量骤降,如果用默认的缩容策略,等几分钟后 Pod 数量也会随之骤降,如果 Pod 缩容后突然又来一个流量高峰,虽然可以快速扩容,但扩容的过程毕竟还是需要一定时间的,如果流量高峰足够高,在这段时间内还是可能造成后端处理能力跟不上,导致部分请求失败。这时候我们可以为 HPA 加上缩容策略,HPA behavior 配置示例如下:

behavior:
  scaleUp:
    policies:
    - type: percent
      value: 900%
  scaleDown:
    policies:
    - type: pods
      value: 1
      periodSeconds: 600 # 每 10 分钟只缩掉 1 个 Pod

上面示例中增加了 scaleDown 的配置,指定缩容时每 10 分钟才缩掉 1 个 Pod,大大降低了缩容速度,缩容时的 Pod 数量变化趋势如下:

1000 -> … (10 min later) -> 999

这个可以让关键业务在可能有流量突发的情况下保持处理能力,避免流量高峰导致部分请求失败。

缓慢扩容

如果想要你的应用不太关键,希望扩容时不要太敏感,可以让它扩容平稳缓慢一点,为 HPA 加入下面的 behavior:

behavior:
  scaleUp:
    policies:
    - type: pods
      value: 1 # 每次扩容只新增 1 个 Pod

假如一开始只有 1 个 Pod,扩容时它的 Pod 数量变化趋势如下:

1 -> 2 -> 3 -> 4

禁止自动缩容

如果应用非常关键,希望扩容后不自动缩容,需要人工干预或其它自己开发的 controller 来判断缩容条件,可以使用类型如下的 behavior 配置来禁止自动缩容:

behavior:
  scaleDown:
    policies:
    - type: pods
      value: 0

延长缩容时间窗口

缩容默认时间窗口是 5 min (--horizontal-pod-autoscaler-downscale-stabilization-window),如果我们需要延长时间窗口以避免一些流量毛刺造成的异常,可以指定下缩容的时间窗口,behavior 配置示例如下:

behavior:
  scaleDown:
    stabilizationWindowSeconds: 600 # 等待 10 分钟再开始缩容
    policies:
    - type: pods
      value: 5 # 每次只缩掉 5 个 Pod

上面的示例表示当负载降下来时,会等待 600s (10 分钟) 再缩容,每次只缩容 5 个 Pod。

延长扩容时间窗口

有些应用经常会有数据毛刺导致频繁扩容,而扩容出来的 Pod 其实没太大必要,反而浪费资源。比如数据处理管道的场景,扩容指标是队列中的事件数量, 当队列中堆积了大量事件时,我们希望可以快速扩容,但又不希望太灵敏,因为可能只是短时间内的事件堆积,即使不扩容也可以很快处理掉。

默认的扩容算法会在较短的时间内扩容,针对这种场景我们可以给扩容增加一个时间窗口以避免毛刺导致扩容带来的资源浪费,behavior 配置示例如下:

behavior:
  scaleUp:
    stabilizationWindowSeconds: 300 # 扩容前等待 5 分钟的时间窗口
    policies:
    - type: pods
      value: 20 # 每次扩容新增 20 个 Pod

上面的示例表示扩容时,需要先等待 5 分钟的时间窗口,如果在这段时间内负载降下来了就不再扩容,如果负载持续超过扩容阀值才扩容,每次扩容新增 20 个 Pod。

 

 

小结


本文介绍了如何利用 K8s 1.18 的 HPA 新特性来控制扩缩容的灵敏度,以更好的满足各种不同场景对扩容速度的需求。文章来源地址https://www.toymoban.com/news/detail-629953.html

到了这里,关于Kuibernetes 如何根据不同业务场景调节 HPA 扩缩容灵敏度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SQL开发实战技巧】系列(三十五):数仓报表场景☞根据条件返回不同列的数据以及Left /Full Join注意事项

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月12日
    浏览(46)
  • 云计算的服务模型:如何满足不同业务需求

    云计算是一种基于互联网的计算资源分配和共享方式,它可以让用户在需要时轻松获取计算资源,并根据需求支付相应的费用。云计算的服务模型是云计算的核心组成部分,它定义了不同类型的云计算服务,以及如何为用户提供这些服务。在这篇文章中,我们将深入探讨云计

    2024年04月09日
    浏览(39)
  • Flutter的Platform介绍-跨平台开发,如何根据不同平台创建不同UI和行为

    Flutter 平台(Platform)是一个概念,用于描述 Flutter 框架在不同操作系统(如Android、iOS、Web、macOS、Windows等)上运行时的适应性和支持。Flutter 旨在实现跨平台开发,使开发人员能够使用单一代码库构建应用程序,然后在多个平台上运行,而无需编写平台特定的代码。以下是有

    2024年02月08日
    浏览(38)
  • 【uniapp小程序】如何根据开发和发行,自动替换不同环境的baseUrl

    小程序调试时使用Hbuilder的运行功能,在测试环境调试;到了发行正式版时使用发行功能,baseurl需要替换到生产环境;有没有办法让代码能够识别当前使用的时运行还是发行,自动切换baseur而不是手动切换??? uni-app提供了一个全局变量process.env.NODE_ENV,当我们使用Hbuilder时

    2024年01月19日
    浏览(35)
  • Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景

    当在 Spring Boot 应用程序中使用Spring Data JPA 进行数据库操作时,配置Schema名称是一种常见的做法。然而,在某些情况下,模式名称需要是动态的,可能会在应用程序运行时发生变化。比如:需要做数据隔离的SaaS应用。 所以,这篇博文将帮助您解决了在 Spring Boot 应用程序中如

    2024年04月26日
    浏览(31)
  • win10笔记本显示器根据页面显示亮度自动调节亮度的问题

    系统是win10企业版,针对这个问题查了很多种方法,比如: 1、控制面板-硬件和声音-电源选项-点击当前电源计划的更改计划设置-更改高级电源设置-显示-启用自适应亮度 但是我发现我的电源计划只有平衡这一种,而且显示选项下也没有启动自适应亮度的选项!!! 可能是因

    2024年02月14日
    浏览(44)
  • SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?

    值为null 未传递此属性 所以此时如何区分null 时传递进来的的null,还是属性的默认值null? 引入过滤器,中间截获 requestBodyData 并保存到 HttpServletRequest ,业务层从 HttpServletRequest 获取到 requestBodyData 辅助判断此属性为 未传递 还是 值为null 自定义过滤器截获 requestBodyData 并保存到

    2024年01月18日
    浏览(24)
  • 【MySQL】根据MVCC和Read View分析事务的四种隔离级别在读写场景分别是如何体现其隔离性的

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、数据库并发的三种场景 二、读写场景的MVCC  1、3个(4个)记录隐藏列字段 2、undo log(撤销日志) 3、模拟MVCC场景

    2024年02月12日
    浏览(32)
  • 如何利用 Kubernetes 的 HPA 进行自动缩容

    在前面的文章中,我们了解了 Kubernetes 的弹性伸缩机制,以及如何使用 Deployment、StatefulSet、 DaemonSet 等控制器来实现容器的自动扩缩容。其中,Horizontal Pod Autoscaler(HPA)是一种基于 CPU 使用率的自动缩容方案,可以自动调整 Pod 的数量,以保证系统的资源利用率和稳定性。 一

    2024年02月06日
    浏览(74)
  • 【python】python根据传入参数不同,调用不同的方法

    大家好,我是木头左。 今天介绍三种不同方法实现根据传入参数不同,调用不同的方法。 使用条件语句 在Python中,可以使用条件语句(如if-elif-else语句)来根据传入的参数调用不同的方法。以下是一个示例: 在上述示例中,我们定义了三个不同的方法(method1,method2和met

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包