基于火山引擎 VCI 实现资源装箱率提升,助力企业云成本优化

高装箱率意味着高资源利用率,即表示在可用资源内,大部分资源都被有效使用,闲置的资源较少,进一步而言,支撑相同离线任务所需投入的资源成本也会更少。

当前,随着公共云使用规模的扩大,如何降低云资源购买成本、提升云资源利用率、优化云资产配置以实现云成本控制、降低 IT 基础设施的 TCO(总拥有成本),已经成为衡量企业上云用云成效的关键因素。

根据 Flexera 的《2023 年云状态调查报告》,企业平均 32% 的云支出被浪费,有 71% 的重度云用户将优先考虑优化云的现有使用情况以节省云成本。这包括关注未使用的云资源成本、不合理配置资源的成本以及折扣/Spot 覆盖的基础设施的比例。

同时,近年来数据分析和 AI 大模型服务的大规模应用,也带动了离线 AI 训练等业务场景对计算资源需求的明显增长。在这个背景下,除了进一步完善在线业务场景下云资源的管理方案,如何保障大数据和 AI 场景下各类离线任务的资源量和使用率,也成了业界的重要课题。

在线服务 VS 离线任务

在线服务和离线任务的区别在于它们的处理方式和用途,它们在提升云资源利用率上的关键点也各有侧重。

在企业场景下,一般都使用基于 Kubernetes 的容器管理平台管理在线服务和离线任务两种类型的工作负载。其中在线服务主要指需要对实时数据进行处理和响应的任务,它们通常需要快速的响应时间,并且需要在处理每个请求时都重新计算结果,常见有实时推荐系统、在线广告投放、在线电商、聊天机器人等。

在云资源消耗上,这类服务流量具有明显峰谷潮汐变化,举个例子,下图显示了抖音在某个时期的在线业务流量,波峰波谷间资源利用率的差距可以达到 40%,如果是春晚、大促等极端流量场景,这个差值会更大。

为了使业务能安然度过高峰(如节日活动、电商大促等),企业一般会按照高峰的流量预估准备资源。同时对于这种业务对扩容延迟非常敏感的情况,Kubernetes 社区的 Cluster Autoscaler 自动扩容节点方案存在 Pod 启动过慢的问题,因此推荐企业选择具备快速弹出计算资源与快速启用业务应用的云产品,比如火山引擎弹性容器实例 VCI,可满足分钟级数万核 vCPU 计算资源的需求。

相比之下,离线任务是指在没有实时数据输入的情况下,对大量数据进行批量处理的任务,它们通常没有时间限制,可以在后台运行,例如大数据分析、机器学习的数据标注和训练作业、科学计算、日志分析、数据清洗等。这些任务通常涉及到大量的数据处理和计算,因此需要强大的计算能力和存储能力来支持。

仍以字节跳动为例,截至 2023 年,字节跳动离线训练的框架拓扑可以达到每天 10000 任务的量级,有约 160 万核的离线训练作业被部署在 Kubernetes 集群上(占总训练量的 40%)。下图展示了某业务团队离线任务的 CPU 使用率情况,可以看到,这些任务的运行时间较短,在几十分钟左右,虽然在凌晨等在线服务的流量波谷时段有运行高峰,但整体在时间上还是呈现不确定性。

对于这类任务,提升资源利用率的难点在于如何提前预备不定时进行的离线任务所需要的资源,同时在任务运行结束后快速回收资源,即提升整体装箱率(Bin Packing Efficiency)——通过在集群中有效地分配资源,以最小化运行工作负载所需的节点数量。

VCI 助力离线任务场景降本增效

弹性容器实例 VCI 是火山引擎云原生团队基于字节跳动内部深度实践,推出的一种无服务器 Serverless 和容器化的计算服务,通过 Virtual Kubelet 技术与火山引擎容器服务 VKE 无缝结合,提供弹性计算和 Kubernetes 编排能力。它能通过免运维、免规划以及按量付费的方式,帮助用户降低使用成本。

关键概念:装箱率

面对离线业务场景,弹性容器实例 VCI 具有诸多天然优势,其中最关键的是弹性容器所带来的资源成本优势。

在分析 Kubernetes 架构中离线业务的资源成本时,理解装箱率这一概念是至关重要的。通常而言,装箱率指的是在给定资源容量限制下,实际使用的资源量占总可用资源量的比例,是衡量资源利用率的重要指标。

在 Kubernetes 集群中,装箱率往往用于衡量工作负载(容器化应用)实际占用的计算资源(CPU、内存等)与节点总计算资源容量之间的比率,可以通过将节点上所有 Pod 的资源请求(Requests)之和除以节点的总资源容量来计算。高装箱率意味着高资源利用率,即表示在可用资源内,大部分资源都被有效使用,闲置的资源较少,进一步而言,支撑相同离线任务所需投入的资源成本也会更少。

离线任务场景下的计算资源浪费

在介绍弹性容器 VCI 如何支撑离线业务场景降低资源成本之前,我们首先简单讨论在传统以云服务器节点为中心的 Kubernetes 集群架构中运行容器化的离线业务应用时造成计算资源浪费的几个关键因素:

必须为系统预留资源:Kubernetes 为了保证云服务器节点具有充足的资源支撑系统进程与核心组件的稳定运行,需要在每个节点上进行计算资源预留,即便预留资源在大多数时间内实际上处于闲置状态,也无法被普通工作负载使用,这将导致集群整体装箱率的下降,特别是在资源紧张的环境中,未利用的预留资源可能会成为瓶颈。此外,云服务器规格越大,所需要预留的计算资源也会越多,造成的资源闲置浪费情况也越严重。

离线任务难以合理利用节点资源:这个问题有以下三种常规场景:

● 首先,不同任务对于计算资源(CPU、内存等)的需求差异较大,而受限于云服务器较为固定的 CPU、内存规格情况,难以实现“完美匹配”,从而极为可能导致某些计算资源在特定云服务器节点上过剩,但却无法被其他任务利用,从而导致整体资源装箱率较低;

● 其次,不同离线任务运行的启动和结束时间不同,极有可能导致云服务器产生资源“碎片”,即小块未被利用的资源分布在不同的云服务器上,往往难以被新的离线任务有效利用;

● 最后,某些业务场景下,离线任务之间存在依赖关系或者优先级差异,这意味着某些任务往往需要等待其他任务完成之后才能启动,这种依赖性进一步加剧了云服务器资源利用率的挑战。

需要为任务执行周期之外的“时间”买单:云资源的成本开销一般可以通过“所需资源量 * 使用时间”进行衡量,在认为所需资源量不变的情况下,尽量压缩资源的使用时间,也可以有效降低成本。对于离线业务而言,真正需要计算资源其实是任务从启动到执行结束的这段时间,这段时间也称为“业务实际运行时间”,理想的情况是只为所用计算资源的“业务实际运行时间”付费,而在以云服务器节点为中心的 Kubernetes 集群架构中,一方面需要额外为离线任务的前置部署阶段和后置停止阶段付费;另一方面还可能因为集群节点弹性伸缩策略所导致的频繁对云服务器初始化所花费的时间买单。

具体案例

接下来我们以一个简化的离线任务场景为例,通过对比常规云服务器节点和弹性容器实例的资源使用情况,帮助大家更加直观地理解弹性容器 VCI 如何降低资源使用成本:

假设 Kubernetes 集群中可使用的云服务器节点规格均为 4C-8Gi,3 个离线任务对应的 Pod 资源需求均为 2C-4Gi,而且在不同的时间点(第 0 秒和第 10 秒)调度到集群中开始执行,以此来分析资源装箱率情况。

首先,根据节点预留资源策略(www.volcengine.com/docs/6460/144563),可明确计算出每个 4C-8Gi 规格的云服务所需要预留的资源为 0.1C-1.8Gi(此处未包括 Daemonset 类型系统组件的资源占用。实际上,系统组件的资源需求取决于集群中安装的具体组件,通常每个节点需要至少 0.5C-0.5Gi 资源用于系统组件),因此每个节点均只能承载单个 2C-4Gi 资源需求的 Pod,剩余 1.9C-2.2Gi 资源处于闲置浪费状态。这意味着对于每个云服务器节点而言,其装箱率仅为 50%,值得一提的是真实场景下 Kubernetes 集群中云服务器节点的装箱率也约为 50%。

其次,在时间轴的前 10 秒,集群中运行了 2 台 4C-8Gi 的云服务器,共有 3.8C-4.4Gi 的闲置资源(2 * 1.9C-2.2Gi)。当来到时间轴的第 10 秒,同样需要 2C-4Gi 资源的 Pod 3 开始执行,此时即便集群中的闲置资源总量足够,却也因为分属于两个“碎片”而无法支撑 Pod 3 的运行,只能再启动一个新的云服务器节点,从而使得闲置浪费资源进一步增多。总体而言,在暂不考虑节点初始化时间等因素的情况下,运行 60C*秒-120Gi*秒的离线任务,却需要为此消耗 120C*秒-240Gi*秒的云服务器计算资源。

而如果使用弹性容器实例 VCI 运行上述任务,用户只需为实际运行中的业务所占用的计算资源付费,Pod 需要何种规格的计算资源只需要创建对应规格的弹性容器实例 VCI 即可,装箱率可达到 100%,运行 60C*秒-120Gi*秒的离线任务,也只需要 60C*秒-120Gi*秒的弹性容器计算资源即可,无任何资源闲置浪费。

从下图的实际生产案例监控曲线中,也能够非常直观地看出弹性容器实例 VCI 的高装箱率所带来的资源成本节省优势。

使用云服务器:存在大量闲置资源
使用 VCI:完全按需使用

面对离线业务场景,弹性容器实例 VCI 除了具备资源成本优势之外,也能帮助客户进一步降低企业云上架构的计算资源运维成本。弹性容器 VCI 通过与容器服务 VKE 无缝集成,同时实现了 Kubernetes 集群控制平面全托管和数据平面的 Serverless 化全托管、免运维、安全隔离,极大地降低用户在 Kubernetes 基础设施上的运维成本,并且省去了容量规划的复杂性,帮助用户聚焦于自己的业务应用。

● 接入成本:弹性容器 VCI 兼容 Kubernetes 的使用方式,用户只需适配 Kubernetes 就可以达到一次开发,到处运行的效果。此外,借助于 VCI Profile 配置文件等能力可以支持在业务无侵入的情况下使用弹性容器作为算力资源(www.volcengine.com/docs/6460/1209385);

● 运维成本:用户无需管理特定的资源,弹性容器 VCI 提供安全可靠的容器计算资源,用户无需关注系统的升级、安全补丁以及故障恢复等各种问题;

● 算力成本:弹性容器 VCI 基于火山引擎海量计算资源,让用户无需为没有使用的资源付费,例如为了保障资源供给而提前购买资源、为少量任务而购买过量的资源等。

实际客户落地案例

某客户是一家以智能化、自动化驱动的药物研发科技公司,为全球生物医药企业提供药物发现一体化解决方案。作为 AI 制药领域的龙头企业,该客户使用了多云架构,单个镜像超过 20G,经常需要同时拉起超过 500 个节点,所以其对算力的性价比要求极高。

火山引擎云原生团队和客户合作构建的云原生基础设施,通过 VCI 极速弹性伸缩和超高资源利用率的特性,实现秒级拉起万核 CPU 资源,保障高峰期客户的算力需要;通过镜像预热、镜像缓存、P2P 传输等功能,实现超大镜像秒级加载,实现了数千 Pod 分钟级自动扩缩容,充分助力 AI 提速;通过 VCI+VKE 资源成本控制,帮助客户将集群装箱率提升到 95% 以上。

结语

面向未来,上云仍是全球范围内的广泛趋势,根据 Gartner 的研究报告,企业在公共云上的 IT 支出将超过传统 IT 支出,到 2025 年,51% 的 IT 预算将用于基于云的系统开发和运营。

通过弹性容器实例 VCI,火山引擎云原生团队希望能帮助更多企业解决上好云、用好云的难题,提供基础设施免运维、计算资源免规划、极致弹性的 Serverless 容器化产品与服务,让云资源真正为企业业务带来效益。