阿里技术实战:一些云上资源调度的经验谈
本文作者
李雨前,阿里云弹性计算技术专家,有 5 年的大规模集群资源管理调度实践经验:针对 long-time service 及 co-location 调度具有全面、深入的一线实践和解决问题经验,提交 10+ 项相关发明专利;擅长稳定性优先的集群调度策略和稳定性架构设计、全局稳定性数据分析实践,以及 Java 和 Go 编程语言。
背景
随着企业数字化和全面上云的推进,更多的企业将在云上生云上长,云计算的集群管理调度技术支撑着所有云上业务应用。工程师应该像过去了解操作系统一样了解今天的集群管理调度。云时代的工程师,需要进一步了解这一领域,从而更好地理解云、利用云、发挥云的优势,赢在云计算时代。
对于已经上云的企业,如果想深度管理自己云上的计算资源,有哪些途径或者说有哪些实践方法呢?求解的朋友们,请看下文。在正式介绍之前,先概要介绍下相关概念,帮助大家更好地理解后面的内容。
ICR
立即生效容量预定(Immediately Capacity Reservation)。您可以随时购买立即生效容量预定,预订成功后立即生效,即容量被锁定。购买立即生效容量预定时设置可用区、实例规格、操作系统类型等属性,系统会以私有池的方式预留属性相匹配的资源。在创建按量付费实例时选择使用私有池的容量,即可提供资源确定性保障。无论是否使用预定容量创建了实例,生效后即开始按照按量实例费率收费,直至立即生效容量预定被释放。
ROS
阿里云资源编排服务(Resource Orchestration Service )是一种简单易用的云计算资源自动化部署服务。用户可以通过使用 Json/Yaml 格式的模版描述多个云计算资源(如 ECS、RDS、SLB)的配置、依赖关系等,并自动完成所有云资源在多个不同地域以及多个账户中的部署和配置,实现基础设施即代码(Infrastructure as Code)。
OOS
阿里云运维编排服务 OOS 是一个全面的云上自动化运维平台,提供了运维任务的管理和执行。使用场景有:事件驱动,批量操作,定时运维任务,跨地域等,OOS 特别为重要的场景提供了审批、通知等功能。OOS 支持跨产品使用,您可以使用 OOS 管理 ECS、RDS、SLB、VPC 等云产品。
Auto Scaling
使用弹性伸缩(Auto Scaling),您可以根据业务需求和策略设置伸缩规则,在业务需求增长时自动为您增加 ECS 实例以保证计算能力,在业务需求下降时自动减少 ECS 实例以节约成本。弹性伸缩不仅适合业务量不断波动的应用程序,同时也适合业务量稳定的应用程序。
DDH
专有宿主机(Dedicated Host)是阿里云专为企业用户定制优化的解决方案。具有物理资源独享、部署更灵活、配置更丰富、性价比更高等特点。专有宿主机为单租户独享物理资源,作为该云主机的唯一租户,您不需要与其他租户共享云主机所有物理资源。同时宿主机上可以灵活创建 ECS 云服务器,并和其他 ECS 云服务器一样,可以挂载云盘,可以通过 VPC 联通,具有高度的灵活性和使用便捷性。
上云后,资源调度的必要性
上云后,我的资源调度有必要自己做不?这个问题首先需要评估清楚。上云后,企业内部围绕业务的研发投入始终是企业最关键的研发投入。如果企业再投入人力研发云上资源调度,等于增加了研发成本,此时就需要评估投入成本和带来的效益是否匹配。一般需要从以下几个方面综合评估。
资源规模有多大
这个规模非常直接,就是看自己在云上运行的 ECS 实例个数有多少。如果资源数量较少,完全没有必要引入自己的调度。这个数量多少,业界暂没有统一的标准。不同的云平台资源服务能力、企业内部 SRE 专业技能、SRE 的依赖工具、IT 环境成熟度各不相同,很难给出一个准确的参考值。我们先假设一个数字 1000,当小于 1000 台的云上 ECS 资源,可以借助阿里云的 ROS 资源编排或者 OOS 运维编排或者 Auto Scale 弹性伸缩服务进行资源管理。当大于 1000 台云上 ECS 资源的时候,可以考虑进行云上资源的自研资源编排服务。
资源成本压力有多大
这里的资源成本压力特指:已经在云上保有一点规模的计算实例资源,并且业务还在呈现快速的发展势头,对云上资源的需求量在持续的增加。例如云上的计算实例个数已经达到 5000。业务应用 App 数量也超过了 100 多个。此时,精细化管理 5000 以上的云上实例,期望通过合适的混合部署,节约计算实例的成本,以及优化业务编排提升业务稳定性。
资源调度的管理人员是否准备就位
如果企业想对自己云上资源进行精细化调度和管理,这就需要企业招聘、培养属于自己的资源调度和管理同学。
上云后,资源调度的可行性
不上云的时候,我们的资源调度是怎么做的呢?先回顾下,一个最简单、直接的调度系统运行起来,需要哪些基本的职责模块。如图 1 所示,我们理解最简单直接的调度系统模块有:资源请求 API 模块、中心调度器模块、数据库模块、物理机结点模块。
图1 - 简单直接的调度模块构成
其中,资源请求 API 负责对我提供资源创建、启停等服务。中心调度器负责读取数据库中物理机资源信息,进行资源的分配扣减、回收增加等,数据库负责存储调度依赖的各种数据,包括物理机的资源信息。物理机结点模块,主要是响应调度器的请求,执行资源创建或者释放或者启停的指令。并将处理后的数据写入数据库。
对照上面图 1,上云后,相关的模块是否还可以工作呢?答案是可以的。只是需要做一些适配。目前所有的云平台供应商,对外不提供物理机信息的,只提供虚拟化的计算实例的资源信息。
上云后,继续资源调度的主要适配点:
(1)数据库里存储的资源信息,需要从云平台的 OpenAPI 获取。
(2)资源信息的维度稍有变化,原来直接可见的物理机,上云后,需要感知地域 Region、可用区 Zone、云上网络 VPC、云上安全组 SecurityGroup 等信息。
(3)执行指令的接口也发生了变化,原来直接连接内部协议进行资源的操作,在云上需要将资源操作指令,最早转换为 OpenAPI 进行资源操作。
以上是基于最简单的资源调度的模块介绍,实际生产中会相对复杂一些,模块也会多一些。例如资源的监控、资源数据的初始化和更新等。例如异常资源结点的自动替换。
上云后,资源调度的实践方案
继续基于最简单的资源调度模块,以及目前云上提供的资源数据和资源操作 API,我们来看看实践过程,有哪些方案,各自有哪些优缺点。
目前云上的计算资源的形态多样。例如阿里云提供广泛的、适合各种业务场景下,特定 Workload 的计算实例,也提供了专有宿主机计算实例,还提供了私有池服务(CR Capacity Reservation 容量预留,适合进行云上的容量规划、云上的资源确定性等场景。例如 ICR 理解容量预留)。下面介绍下企业基于以上三种云的资源售卖形态进行资源调度的实践方案。
基于通用的 ECS 计算实例的企业云上资源调度
基于通用 ECS 计算实例的企业云上资源调度(最小集)如图 2 所示,其中资源数据库部分,资源数据来源 ECS 计算实例,图 1 中的物理结点替换为 ECS 计算实例,图 1 中的操作指令依然是内部协议。这个场景下,强依赖的能力模块有:
图2 - 基于ECS计算实例的企业云上资源调度
- 能力模块 1: 业务支持容器化部署
在图 2 所示,资源分配执行的结点是 ECS 实例。在 ECS 实例上继续进行资源分配,典型的就是多容器运行在同一个 ECS 实例上。当 ECS 实例规格很大,例如 vCPU (virtual CPU)核数为 32,此时,CPU 能力等于传统的一个 32 vCPU 的物理机算力了。
- 能力模块 2: 动态扩缩 ECS 实例数量
在图 2 所示,企业自行调度的云上资源池规模就是已购买的云上 ECS 实例构成的资源规模。
优势:
企业自主、细粒度控制不同 ECS 实例规格类型、ECS 实例数量、ECS 实例地域分布等信息,从而结合业务Workload特征,针对性地购买 ECS 实例,针对性地编排部署容器实例。
典型的也可以直接交给云平台的容器服务来托管。例如阿里云的 ACK 服务,进行容器服务托管。
劣势:
需要事先购买 ECS 计算实例。这里是说要先购买 ECS 计算实例,然后这个 ECS 实例才会进入企业云上调度的资源数据库。比较省成本的做法,只在需要的扩充资源池的时候,才购买 ECS 计算实例,而不是事先批量购买 ECS 计算实例。批量事先购买,但是实际没有使用的话,就产生了资源浪费。
另一个是,只支持容量操作的内部协议。
适合的场景:
企业业务规模大,不同业务间负载不同,业务已应用容器化部署;
专职资源调度管理的同学、对云上资源成本有优化诉求的企业。
基于专有宿主机计算实例的企业云上资源调度
基于专有宿主机(DDH)计算实例的企业云上资源调度(最小集)如图3所示。其中资源数据库部分,资源数据来源 DDH 计算实例的资源。
图3 - 基于 DDH 计算实例的企业云上资源调度
图 1 中的物理结点替换为 DDH 计算实例,图1中的操作指令由内部协议,改为 OpenAPI 协议(也支持容器的内部协议)。这个场景下,强依赖的能力模块有:
- 能力模块 1: 动态扩缩 DDH 实例数量
图 3 所示,企业自行调度的云上资源池规模就是已购买的云上 DDH 实例构成的资源规模。
优势:
企业自主、细粒度控制不同 DDH 实例规格类型、DDH 实例数量、DDH 实例地域分布等信息。从而结合业务Workload特征,针对性地购买 DDH 计算实例,针对性地编排部署容器实例或者 ECS 实例。
支持容器的高密度部署,同时也支持通用的 ECS 实例部署,以及 DDH 上自定义 ECS 实例部署。
劣势:
需要事先购买 DDH 计算实例。这里是说要先购买 DDH 计算实例,然后这个 DDH 实例才会进入企业云上调度的资源数据库。比较省成本的做法,只在需要的扩充资源池的时候,才购买 DDH 计算实例,而不是事先批量购买 DDH 计算实例。批量事先购买,但是实际没有使用的话,就产生了资源浪费。
由于 DDH 计算实例规格是整个物理机,所以 DDH 计算实例单个的成本相对 ECS 计算实例较高。并且 DDH 单个容量较大,相同资源池规模下,DDH 结点数就比 ECS 少,一定程度上导致 DDH 上部署的密度会比 ECS 大。
适合的场景:
对安全法规有苛刻要求的业务。DDH 可以最小化被管控的物理结点规模,减少规模的风险;
对软件版权有苛刻要求的业务。DDH 上 license 的费用可以分摊到多个业务实例上;
对性能有极致要求的业务。DDH 可以实现本地化访问,获取极致响应时间;
超大规模的资源诉求,并且有专业的资源调度和管理部门。
基于私有池的企业云上资源调度
基于私有池的企业云上资源调度(最小集)如图4所示。其中资源数据库部分,资源数据来源私有池计算实例的资源。
图4 - 基于私有池的企业云上资源调度
对比图1中的物理结点替换为私有池,图1中的操作指令由内部协议,改为 OpenAPI 协议。这个场景下,强依赖的能力模块有:
- 能力模块 1: 动态扩缩私有池对应的容量
在图 4 所示,企业自行调度的云上资源池规模就是动态扩容或者缩容指定已有私有池容量或者新增或者释放私有池。
优势:
企业自主、细粒度控制容量,进行云上容量的规划和分配。将原来直接对资源的感知转化为对容量的感知。更符合业务的发展诉求;
面向私有池同时保留了资源的特性,又支持了面向业务的容量或者算力的规划;
私有池的费用更加有竞争力,当不使用的时候,私有池剩余容量可以共享给其他用户,也可以继续保有,支付低折扣的剩余容量费用;
相比 ECS 计算实例、DDH 计算实例,私有池容量一旦预定成功,后面 100% 资源交付成功。而前者 ECS、DDH 在发生资源大量购买的情况下,会出现小概率的因为库存不足,导致购买失败。
劣势:
需要企业实时规划云上容量的变化趋势,从而准实时规划私有池容量。目前云平台也提供容量预测的服务,帮助企业更精准的进行容量规划;
相比 ECS 计算实例或者 DDH 实例的事先创建好,私有池是实时创建 ECS 实例,有一些些“延时”,几乎可以忽略。
适合的场景:
对成本和灵活性有极大诉求的企业,并且具备成熟的基础技术能力来快速扩容部署业务;
有专职的资源调度管理同学、对云上资源成本有强烈优化诉求的企业。
总结
上云后,企业依然可以进行云上资源的精细化调度,并且可以针对企业的实际情况,选择适合自己的资源管理模式。我们推荐基于容量预定的云上资源调度。除了满足精细化资源调度,同时保障资源的 100% 交付,以及长期使用下的折扣优惠。
更多关于资源调度和管理的相关知识介绍,可以参考书籍《深入集群-大型数据中心资源调度和管理》。
关注公众号“弹性计算百晓生”,后台留言分享你对“云上资源调度”的想法。留言的内容可以但不限是,你对“云上资源调度”的实战经验论;避坑小感悟;亦或是你在“云上资源调度”中遇到的难点困境,均可分享。╰( ̄▽ ̄)╭
后台将挑选两条优质留言,送上阿里云弹性计算技术专家李雨前老师的《深入集群-大型数据中心资源调度和管理》一本。本周五开奖~