弹性调度助力企业灵活应对业务变化,高效管理云上资源

作者:吴昆

什么是弹性调度

云计算时代,企业可以通过云平台获得大量计算资源,并根据业务发展和流量需求的实时变化,灵活调整使用的资源类型与资源量。阿里云提供了多种弹性资源,如云服务器 ECS 和弹性容器实例 ECI,并且提供不同的付费方式,如包年包月、按量付费和抢占实例等。不同类型和付费方式的实例,在给客户带来更高的灵活性的同时,也对客户的资源管理能力提出了更高的要求。

阿里云容器服务 ACK 通过节点池功能,简化了集群节点的管理与运维,支持自动弹性伸缩,根据业务负载和预设策略自动调整节点数量,可以弹出不同可用区、实例规格和付费方式的 ECS 实例,虚拟节点也可以按需创建 ECI 实例,以此满足多样化的需求场景并优化成本。然而,客户仍需面对如何高效利用和管理这些计算资源的挑战。

面临的挑战主要有以下几点:

1. 差异化控制业务资源使用量

在集群中,配置了包年包月实例和抢占实例,并在资源不足时将业务 Pod 运行在 ECI 实例上。为了确保高优先级的业务能够在稳定的包年包月实例上运行,我们需要限制不同业务在不同类型实例上的资源使用量。

2. 缩容时部分业务 Pod 未释放

默认的缩容策略难以保证优先缩容高峰期扩容出的业务 Pod,导致业务流量高峰过后,在自动伸缩节点池或 ECI 实例上,仍然存在部分业务 Pod 未释放,导致机器无法缩容并持续计费,需要人工进行业务 Pod 迁移。

弹性调度的目标,就是帮助客户解决在使用云上弹性资源时面对的挑战。包括按照多级资源的优先顺序进行调度,以及按照定义的优先顺序进行缩容的能力。

自定义弹性资源优先级调度

为了解决客户在多级资源管理中面临的难题,阿里云容器服务 ACK 在标准 K8s 调度框架的基础上扩展了弹性调度功能,推出了“自定义弹性资源优先级调度”功能。

该功能提供了差异化调度 ECS 和 ECI 资源的能力,包括:

  • 自定义弹性资源优先级调度策略:

    在应用发布或扩容过程中,客户可以按照自定义资源策略,设置应用实例 Pod 被调度到不同类型节点资源的顺序。

  • 逆序缩容:

    当客户通过 HPA 缩容业务 Pod 时,可以按照策略中资源优先级的逆序缩容业务,确保弹性资源优先缩容,减少计费。

  • 灵活修改策略:

    当策略发生变化时,同步调整已调度的业务 Pod 的优先级。而且,该功能通过自定义资源定义策略实现,无需改动业务 Deployment。

  • 控制业务资源使用量:

    通过限制不同业务在不同类型实例的资源使用量,确保高优资源优先供给高优业务使用。

  • 多种资源使用量统计策略:

    限制业务资源使用量时,支持多种不同的资源使用量统计策略,如忽略 Terminating 过程中的 Pod 或忽略提交 ResourcePolicy 策略前已调度的 Pod 等。

  • 优化 Deployment 滚动更新: 能够自动将滚动更新过程中新创建的 Pod 视为新的分组,无需在每次更新 Deployment 时同步手动更新 ResourcePolicy。

下面我们将通过两个场景示例介绍弹性调度功能是如何帮助企业优化资源配置,实现降本增效的。

场景一:常驻 ECS 实例+自动伸缩抢占式实例实现逆序缩容

抢占式实例(旧称竞价实例)是一种按需实例,性能与常规 ECS 实例无异,价格根据市场供需关系实时变化,相对于按量付费实例最高能节约 90% 的实例成本。通过合理使用抢占式实例,用户能够极大降低云资源成本。

抢占式实例具有可能被其他出价更高的用户抢占导致实例被回收的特点,不能保证业务的最低运行实例要求,所以用户通常会将抢占式实例和长期包年包月实例配合使用。

在业务流量的高峰期,由 Pod 水平扩缩(HPA)自动扩容出业务 Pod,再由自动伸缩节点池根据处于 Pending 状态的 Pod 实例数扩容出抢占式实例。

图片

在业务流量减少后,抢占式实例中的 Pod 应当被优先回收,使得抢占式实例能够被自动伸缩节点池回收以减少资源开销。目前默认的缩容策略可能会将运行在常驻 ECS 上的 Pod 回收,导致额外开销。

如下图所示,其中 cn-hongkong.192.168.7.147 和 cn-hongkong.192.168.7.148 分别带有 unit=first 和 unit=second 标签,代表优先希望调度到 cn-hongkong.192.168.7.147 上:

图片

图片

缩容到三个 Pod 后:

图片

可以看到 Pod 依然保留在 cn-hongkong.192.168.7.148 上。

为了实现优先回收抢占式实例的效果,可以向集群中提交以下的 ResourcePolicy,以下实例的含义是在调度业务 Pod 时仅在靠前的带有 alibabacloud.com/nodepool-id: example-ecs-nodepool-id 的节点均无法调度 Pod 时,才将 Pod 调度到带有 alibabacloud.com/nodepool-id: example-spot-instance-nodepool-id 的节点上。

策略中假设 ECS 实例和抢占式实例是通过节点池 ID 进行区分的,您也可以通过机型或其他自定义标签进行区分,实际使用时请将变量按需替换:

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:name: $example-namenamespace: $example-namespace
spec:selector:$example-label-key: $example-label-valuestrategy: preferunits:- nodeSelector:alibabacloud.com/nodepool-id: $example-ecs-nodepool-idresource: ecs- nodeSelector:alibabacloud.com/nodepool-id: $example-spot-instance-nodepool-idresource: ecs

配置后的效果如下:

图片

图片

这个示例中我们提交了一个优先调度到带有 unit=first 标签的节点,之后调度到带有 unit=second 标签的节点的策略。

图片

在扩容时,Pod 在完全使用节点 cn-hongkong.192.168.7.147 上的资源后,将后续业务 Pod 调度到节点 cn-hongkong.192.168.7.148 上。

图片

最后我们将业务 Deployment 缩容为三副本,此时节点 cn-hongkong.192.168.7.148 上的业务 Pod 被优先移除,达到了逆序缩容的效果。在实际使用场景中,在 cn-hongkong.192.168.7.148 上的业务 Pod 被移除后,自动伸缩节点池会自动进行相应节点的回收,从而达到节约成本的效果。

场景二:通过 Max 选项控制业务资源使用量

滚动更新是业务上线过程中一项非常重要的流程,为了保障业务在滚动更新过程中不受影响,业务通常会采用“创建后删除”的策略,即等到业务的新副本正常运行了再逐渐清理旧副本,这就使得滚动更新中业务实际消耗的资源量高于运行过程中的资源量,超出使用的资源量可能会影响到集群中其他业务的运行或扩容。

为了限制业务在部分类型资源上的资源使用量,您可以使用 Max 选项,该选项允许限制业务 Pod 在每种资源类型上的数量,从而限制资源使用。启用该功能只需要在 ResourcePolicy 的 Unit 中新增一个 Max 字段:

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:name: $example-namenamespace: $example-namespace
spec:selector:$example-label-key: $example-label-valuestrategy: preferunits:- nodeSelector:alibabacloud.com/nodepool-id: $example-ecs-nodepool-idresource: ecsmax: $example-max- nodeSelector:alibabacloud.com/nodepool-id: $example-spot-instance-nodepool-idresource: ecs

当设置了 Max 之后,如果业务 Pod 在该 Unit 上运行的 Pod 数量已经达到了 Max,则下一个 Pod 将会被调度到后续的 Unit 上,若已经是最后一个 Unit,则 Pod 会调度失败。

以下是一个使用 Max 限制资源使用的例子,依然给 cn-hongkong.192.168.7.147 和 cn-hongkong.192.168.7.148 分别设置 unit=first 和 unit=second 标签。

图片

图片

不加资源限制时,业务会将高优资源用完再使用下一级,若此时有其他高优应用则无法使用该高优资源。

图片

图片

在该例子中我们提交了一个优先调度到带有 unit=first 标签的节点,之后调度到带有 unit=second 标签的节点的策略,并在一级策略上添加了最多调度一个业务 Pod 的限制,这会将 app=nginx 业务在一级资源上的业务使用限制在 1 个 Pod 的级别。

图片

配置了 ResourcePolicy 之后,可以发现业务在 unit=first 的机器上的资源使用被限制,超出限制的部分被调度在了 unit=second 的机器上,从而实现了业务的资源合理分配。

What’s Next

弹性调度功能通过多级优先级调度、多级资源限制、逆序缩容等能力,帮助企业高效利用云上资源。除了本文介绍的两种基本用法外,阿里云容器服务 ACK 自定义弹性资源优先级调度还支持多种资源统计策略、根据 Label 智能分组等高级特性。通过灵活设置弹性调度,企业可以实现高效的资源配置与成本管理,更好的应对业务增长带来的资源管理挑战。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/242886.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot解决Slow HTTP慢速攻击漏洞

项目场景: 扫描到的漏洞截图: 攻击原理: Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送…

SpringCloud Aliba-Sentinel【上篇】-从入门到学废【4】

🎵诗词分享🎵 大江东去,浪淘尽,千古风流人物。 ——苏轼《念奴娇赤壁怀古》 目录 🍿1.Sentinel是什么 🧂2.特点 🧈3.下载 🌭4.sentinel启动 🥓5.实例演示 1.Senti…

Java代码审计Shiro反序列化CB1链source入口sink执行gadget链

目录 0x00 前言 0x01 CC链&CB链简介 1. Commons Collections链是什么? 2. Commons BeanUtils链是什么? 0x02 测试Commons BeanUtils1链 0x03 Shiro550 - Commons BeanUtils1链 - 跟踪分析(无依赖) 1. 前置知识 2. Co…

【每日一题】按分隔符拆分字符串

文章目录 Tag题目来源解题思路方法一:遍历方法二:getline 写在最后 Tag 【遍历】【getline】【字符串】【2024-01-20】 题目来源 2788. 按分隔符拆分字符串 解题思路 方法一:遍历 思路 分隔符在字符串开始和结束位置时不需要处理。 分隔…

设计模式设计原则——依赖倒置原则(DIP)

DIP:Dependence Inversion Principle 原始定义:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。 官…

【正点原子STM32】搭建开发环境(安装MDK和器件支持包、DAP仿真器和ST LINK仿真器、CH340串口驱动)

一、常用开发工具简介 MDKDAP 二、安装MDK 1、MDK简介2、如何获取MDK3、安装MDK和器件支持包 三、安装仿真器驱动 DAP仿真器免驱ST LINK仿真器驱动安装方法 ST LINK驱动及教程 四、安装CH340 USB虚拟串口驱动 1、安装CH340 USB虚拟串口驱动2、为什么要安装CH340 USB虚拟…

《WebKit 技术内幕》之八(2):硬件加速机制

2 Chromium的硬件加速机制 2.1 GraphicsLayer的支持 GraphicsLayer对象是对一个渲染后端存储中某一层的抽象,同众多其他WebKit所定义的抽象类一样,在WebKit移植中,它还需要具体的实现类来支持该类所要提供的功能。为了完成这一功能&#x…

蓝桥杯官网填空题(奇怪的分式)

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:1/4乘以8/5 小明居然把分子拼接在一起,分母拼接在一起&…

无法找到mfc100.dll的解决方法分享,如何快速修复mfc100.dll文件

在日常使用电脑时,我们可能会碰到一些系统错误提示,比如“无法找到mfc100.dll”的信息。这种错误通常会阻碍代码的执行或某些应用程序的启动。为了帮助您解决这一问题,本文将深入探讨其成因,并提供几种不同的mfc100.dll解决方案。…

【分享】MathWorks中国汽车年会:“软件定义汽车”

从软件赋能到软件定义,汽车行业不仅需要解决诸如错误发现滞后带来的高昂代价、功能融合所需的跨学科知识、功能安全与实施成本之间的权衡等老问题,也面临着新的挑战:软件复杂度的不断提升、利用数据驱动创造价值、人工智能的引入和实现、数字…

【从0上手cornerstone3D】如何加载nifti格式的文件

在线演示 支持加载的文件格式 .nii .nii.gz 代码实现 npm install cornerstonejs/nifti-volume-loader// ------------- 核心代码 Start------------------- // 注册一个nifti格式的加载器 volumeLoader.registerVolumeLoader("nifti",cornerstoneNiftiImageVolu…

Spark SQL函数定义

目录 窗口函数 SQL函数分类 Spark原生自定义UDF函数 Pandas的UDF函数 Apache Arrow框架基本介绍 基于Arrow完成Pandas DataFrame和Spark DataFrame互转 基于Pandas完成UDF函数 自定义UDF函数 自定义UDAF函数 窗口函数 分析函数 over(partition by xxx order by xxx [as…

如何在ubuntu22.04安装ROS2

ubuntu22.04安装ROS2 教程 选择对应版本进行安装设置编码添加源安装ROS2设置环境变量 运行ROS2 选择对应版本 通过官方网站,查询Ubuntu与ros对应的版本,版本不一致也会出现安装不成功。 https://wiki.ros.org/ROS/Installation 每一个都可以进行点击&a…

140:leaflet加载here地图(v2软件多种形式)

第140个 点击查看专栏目录 本示例介绍如何在vue+leaflet中添加HERE地图(v2版本的软件),并且含多种的表现形式。包括地图类型,文字标记的设置、语言的选择、PPI的设定。 v3版本和v2版本有很大的区别,关键是引用方法上,请参考文章尾部的API链接。 直接复制下面的 vue+leaf…

基于SpringBoot Vue高校失物招领系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

FPGA:我的零基础学习路线(2022秋招已上岸)持续更新中~

可内推简历,丝我即可 前言 初次接触FPGA是在2022年3月左右,正处在研二下学期,面临着暑假找工作,周围的同学大多选择了互联网,出于对互联网的裁员形势下,我选择了FPGA,对于硬件基础知识我几乎是…

SpringMVC获取参数与页面跳转

获取参数 第一种 直接当成方法的参数,需要与前台的name一致 相当于Request.getAttribute("username") Controller 第二种 使用对象接收 页面的name也要和对象的字段一致 创建一个对应的实体类 Controller 将参数更换为User对象就行 SpringMVC获取到…

【GNN】人大魏哲巍“青源Talk”图机器学习

目录 简介 图学习历史与应用 历史-哥尼斯堡七桥问题 图历史发展介绍 图神经网络 应用(!!) 图学习近期工作 概况 图卷积神经网络(ICML,NIPS,KDD) 大规模图神经网络&#xf…

HarmonyOS开源软件Notice收集策略说明

开源软件Notice是与项目开源相关的文件,收集这些文件的目的是为了符合开源的规范。 收集目标 只收集打包到镜像里面的模块对应的License;不打包的都不收集,比如构建过程使用的工具(如clang、python、ninja等)都是不收…

vivado JTAG链、连接、IP关联规则

JTAG链 这列出了定义板上可用的不同JTAG链。每个链都列在下面<jtag_chain>以及链的名称&#xff0c;以及定义名称和链中组件的位置&#xff1a; <jtag_chains> <jtag_chain name"chain1"> <position name"0" component"part0…