当前位置: 首页 > 科技观察

哔哩哔哩容器云平台VPA技术实践

时间:2023-03-21 15:26:39 科技观察

一、背景哔哩哔哩搭建的基于k8s的私有云平台已经达到万节点规模,承载了公司大部分线上业务和线下业务如机器学习、大数据、转码。在推动降本增效的过程中,我们发现业务应用的容器资源规范不合理。通常,资源配额集远大于实际负载。这导致节点的CPU分配率很高,无法再调度新的容器,但节点实际的CPU峰值利用率却很低(如图)。这种不合理的容器规范导致了整个集群资源的极大浪费。面对这个问题,我们主要从两个角度来解决:一是利用混合技术,将一些低质量的服务转移到这类机器上,实现闲置资源的有效利用。在之前的文章《B站云原生混部技术实践》【1】中有详细介绍;二是从业务容器本身出发,采用VerticalPodAutoscaler(VPA)技术,根据业务历史真实负载计算推荐资源量,自动调整容器资源规格。从我们大规模的实践结果来看,VPA技术有效释放了节点闲置的计算资源,满足了新业务的资源需求,降低了新机器的采购成本。同时,作为一种自动调整机制,也大大降低了人工容量管理的成本。下面,我们将详细介绍VPA技术的一些具体技术细节和实践经验。二、行业现状VPA一般需要具备以下三个关键能力:1.容器资源规范推荐。根据应用的实际负载,按照特定的算法计算出容器的合理资源规格。2、对于新创建的Pod,在基于k8swebhook创建Pod对象的过程中,需要将资源规范修改为推荐值。3.对于已经创建的Pod,需要定期动态调整容器的资源规格。目前社区开源的VPA技术只支持上述1和2,如果已经存在的pod需要进行VPA,必须先将其逐出,以便在重建时修改pod资源规格。许多业务不希望VPA调整资源配额时Pod被逐出。因此,业内部分公司选择修改K8S源码,支持in-placeVPA能力,从而实现容器资源规格的动态修改。K8S社区已经对in-placeVPA进行了相关问题讨论[2],预计后续的k8s版本会加入该特性。目前我们也选择修改K8S源码来支持in-placeVPA功能。同时,我们自主研发了VPA整体控制框架和管理平台,使整体功能更加稳定易用。3.VPA原理3.1总体架构VPA相关的CRDVPAGenerator对象:VPA管理平台创建的VPA策略模板对象。该对象根据标签选择器匹配业务应用的Pod,在应用维度创建一个VPA对象。VPA对象:控制器根据VPAGenerator对象自动生成。主要包括Pod匹配信息、推荐值算法相关参数、当前资源推荐值、容器资源更新方式等。VPA核心组件VPAGenerator控制器。主要用于降低VPA的管理复杂度。我们可以为同一类型的应用创建一个VPA策略模板对象VPAGenerator,控制器会自动匹配该类型的应用,并一一创建与每个应用关联的VPA对象。VPA推荐控制器。主要获取VPA对象关联的应用的历史负载值,计算出服务容器推荐的资源规格,记录在VPA对象的Status字段中。VPA更新程序控制器。当VPA对象将资源请求量调整为自动模式或直接更新模式时,controller会将VPA对象Status字段中记录的资源推荐值更新到已有的业务Pod中,并立即生效。VPAWebhook服务。当VPA对象调整资源请求量的模式为自动模式或初始化模式时,该组件会将VPA对象Status字段中记录的资源推荐值更新到新创建的业务Pod中。VPA-API服务。作为VPA管理平台与kube-apiserver服务交互的中间代理,实现对K8S集群中VPAGenerator对象的增删改查操作,同时负责收集相关可观察数据到VPA。其他依赖模块Kube-apiserver服务:是K8S集群的API访问入口。Cadvisor服务:用于收集pod中各个容器的资源使用指标。Prometheus服务:用于聚合汇总Cadvisor为VPARecommender控制器收集的资源指标,查询业务容器的历史资源使用情况。下面分别介绍VPAGenerator控制器、VPAUpdater控制器和VPARecommender控制器。3.2VPAGeneratorController业界的VPA系统一般只定义VPACRD,为每个应用创建一个VPA。但是在实际场景中有大量的应用。逐一维护VPA对象会产生较大的运维成本。B站内部业务是按服务级别区分的,通常同一个服务级别需要的VPA推荐策略是相同的,所以我们考虑引入VPAGeneratorCRD,在其中定义某类VPA生成策略,然后通过controller来动态维护VPA对象的生命周期。上层不再需要关心如何配置各个应用的VPA,只需要为不同服务级别的应用制定VPA策略即可。VPAGenerator控制器的主要逻辑如下:1.VPAGenerator控制器监听管理平台创建的策略模板VPAGenerator对象,根据其中的selector信息匹配集群中的相关pod;2.将第1步匹配到的pod按其所属的应用组Createapplication-levelVPAobjects;3、对于已经下线的servicePod,关联的VPA对象会保留一段时间,然后controller会自动删除这些VPA对象。如下图,VPAGenerator对象的分组标签为:level=L0,会打到集群中所有level=L0的服务,归类到一个服务组中,这样controller会创建Export关联的VPA对象。基于该策略,业务SRE只需要为同一应用层级的服务组维护一个VPAGenerator对象,控制器可以动态创建或删除该服务组对应的VPA对象,降低了管理和运维成本VPA对象。3.3VPAUpdatercontrollerVPAUpdatercontroller会根据VPA对象中的匹配策略过滤出与VPA对象关联的servicePod,并结合设置的更新方式完成servicePod资源量的更新动作。这里有四种更新模式:预运行模式、初始化模式、直接更新模式和自动模式。每种模式适用于不同的应用场景。模式一:预运行模式,只计算创建的VPA对象的推荐值,不动态更新Pod资源配额。主要用于VPA策略估计和比较的场景。方式二:初始化方式。在创建Pod时,VPAWebhook根据Pod的标签信息匹配对应的VPA对象,然后根据VPA对象中的资源推荐值更新Pod的资源配额。由于公有云不支持in-placeVPA能力,所以这种模式只能通用。模式3:直接更新模式,VPAUpdater控制器直接动态更新stockpod的资源配额。IDC内部k8s集群(私有云)支持in-placeVPA能力,所以可以开启该模式。模式4:自动模式。该模式相当于同时启用模式2和模式3,可以更新增量Pod或存量Pod的资源配额。我们内部集群一般采用这种模式。如下图所示,模式2是指VPAWebhook组件监听创建Pod的动作,然后根据VPA对象设置的模式决定是否更新Pod的资源配额。模式3是指VPAUpdater组件检测到VPA对象中的推荐值有更新后,会根据VPA对象设置的模式决定是否直接更新stockPod的资源配额。通过多种更新方式,很好地支持私有云和公有云场景的VPA需求。3.4VPARecommendercontrollerVPARecommendercontroller根据VPA对象的指标策略从Prometheus服务中获取业务服务的历史负载,然后结合推荐值算法计算出业务Pod的资源推荐值,并进行更新到VPA对象的状态。其中,根据VPA对象中设置的Schedule字段,可以规定VPA计算推荐资源值的周期,可以控制更新推荐资源值的节奏。目前VPA推荐组件的推荐算法主要涵盖两种场景。场景一:自动调整业务实例的资源请求值,释放闲置资源,提高集群资源利用率我们引入容器资源饱和度的概念,即“容器资源使用/资源请求”。假设当前VPA对象使用业务容器7天资源使用率的第95个百分位值作为历史负载targetUsed,bufferFactor表示预期资源饱和率,我们根据以下公式计算推荐资源值targetRequest,并将其更新为VPA对象Status。可以看出,预期的资源饱和率实际上决定了为容器预留多少quotabuffer。对于服务级别较高的应用,我们希望峰值饱和率比较低,比如40%,以保证其在流量突发等场景下的稳定性;对于服务级别较低的应用,我们将期望饱和率设置为较高,虽然牺牲了一些稳定性,但可以节省更多的配额资源。在计算推荐值targetRequest时,需要对推荐值的边界值进行约束。一般在生产环境中,推荐下限MinAllowed默认为0.1C或0.1G,推荐上限MaxAllowed=资源限制值-资源预留值,以保证业务容器的推荐资源值合理并且有效。场景二:业务Pod发生OOM事件,自动调整资源限制值,提高运维效率。业务容器触发OOM事件是因为资源评估不准确,内存限制值设置过低。如果不及时调整限值,会导致业务容器OOM频繁重启。针对这种现象,VPARecommendercontroller可以实时捕捉PodOOM事件,并使用下面的公式来评估新的内存限制值。方法是根据最近的内存使用memoryUsed、扩展因子oomFactor、内存泄漏的次数oomCount计算新的内存限制值,以保证重建的Pod不会频繁发生OOM事件。4.VPA管理平台VPA管理平台基于PaaS层的VPA技术,实现了集群资源的自动化管理能力。平台主要负责VPA策略优化、VPA策略规避、VPA效果分析、VPA异常检测。下图为VPA管理平台的功能矩阵图。VPA策略调优主要包括业务容器资源指标管理、VPA策略模板维护、VPA策略预估与对比分析。VPA策略规避主要用于压测、活动等场景临时关闭某些应用的VPA策略。VPA效果分析主要用于VPA策略的数据运算和分析,重点统计资源覆盖率、VPA调整前后的资源量、调整记录。VPA异常检测主要用于监控VPA策略的一些异常行为,例如业务容器资源调整失败,单个应用命中多个VPA策略等异常事件。4.1VPA策略管理业务容器资源指标资源指标用于计算业务容器的历史负载。VPA策略中一般采用容器最近7天的资源使用率的第95个百分位值(索引名称:app_cpu_usage_7day_p95)作为指标策略。当前策略的调整效果可以灵活改变指标策略。VPA策略模板VPA策略模板主要定义了VPAGenerator对象的核心属性,如匹配的应用级别、自动伸缩的执行周期、推荐资源值上下限、指标策略、预期资源饱和率等.平台可以根据VPA策略模板在K8s集群中创建一个VPAGenerator对象。VPA的预运行和比较能力基于VPA对象的预运行模式。平台可以发布预运行的VPA策略,分析策略效果是否达到预期,在确保完全符合预期后,发布正式的VPA策略。对于已经生效的VPA策略,我们也可以在pre-run模式下发布一个VPA策略作为对照组,提炼对比分析VPA调整效果,最终选择最优VPA策略。4.2VPApolicyavoidance在生产环境中,有一些场景需要暂时禁用某些应用的VPApolicy。例如,企业往往会针对大型活动提前进行压力测试。压测期间,业务流量比平时高出很多倍,相应业务容器的资源负载也会增加很多。这时候如果VPA继续按照历史峰值计算推荐值,资源池的分配率就会突然增加。因此,VPA管理平台与压测平台挂钩,支持策略规避能力,可以指定具体的应用和时间窗口进行规避。4.3VPA效果分析VPA效果分析主要记录一些关键的运营数据,可以用来评价VPA策略是否达到预期。运营数据包括以下关键指标:覆盖应用数量、覆盖资源数量、资源伸缩记录。VPA政策涵盖的申请数量。下图记录了VPA策略命中的应用数量趋势图,区分了VPA可以调整的应用数量和不能调整的应用数量。VPA策略覆盖的资源量(以CPU为例),如下图记录了所有被VPA策略命中的应用占用资源请求的趋势图(即coveredcpucapacity),其中包括估计调整VPA策略后应用占用的cpu容量和不可调整的cpu容量。从趋势图对比可以看出,调整后的VPA策略应用预估占用的CPU容量与覆盖的CPU容量比较接近,说明资源调整比较充分。VPA策略调整记录详情,记录VPA策略命中的每个应用的伸缩资源请求量。包括调整前后应用资源的容量和变化,政策覆盖的应用数量,释放的整体免费资源容量。资源饱和度指标记录了业务服务的资源饱和度(即资源使用/资源请求)的变化趋势图。VPA是根据基于预期资源饱和度的资源推荐值来计算的,因此我们可以根据服务的实际资源饱和率趋势图来有效地评估VPA的整体调整效果。4.4VPA异常检测VPA异常检测主要是通过自动分析VPA核心组件错误日志和错误事件,定期检查关键指标来实现的。例如,VPA强烈依赖于监控系统的可用性。如果VPARecommender控制器获取容器历史指标的错误日志频率超过阈值,值班同学就会收到告警。此外,系统底层还记录??了非常详细的应用资源使用数据、VPA调整明细等,基于这些数据,VPA管理平台可以灵活定制一些检测规则,比如应用是否命中了VPA策略能否达到预期的峰值饱和率和VPA调整失败率是否高于阈值等,这一系列的异常检测和告警手段使我们能够快速感知VPA系统的潜在风险并及时介入。五、基于VPA的集群资源管理集群容量管理是一个逐步优化的过程。有了这套VPA体系,我们还需要不断优化VPA策略,管理业务端一些不合理的资源配置。1.存在一些VPA无法生效的场景,VPA管理平台会记录这些问题,方便制定优化资源调整的策略。例如,对于一些服务级别较低的应用,PodQos级别是有保证的。此时VPA无法调整业务容器的资源请求量。对于此类问题,我们会整理应用列表,与业务服务负责人沟通,修改配置。当然,对于新的应用,我们也会在创建应用的时候加入一些预检措施,提前避免此类问题的发生。2.优化业务容器指标。一开始我们使用前一天的第99个百分位值作为历史负载来计算推荐值,忽略了周末流量高峰对次日推荐值的影响,导致推荐值波动比较大的资源。将前7天的第95个百分位值替换为历史负荷计算的推荐值后,整体推荐值变得更加稳定。3.精细配置VPA策略的预期饱和率。不同保证级别的应用程序的预期饱和率是不同的。例如,对于多活场景的应用,保证VPA对象的资源饱和率设置在50%以下,这样在单机房出现故障后,多活机房可以承载所有的流量。对于非多活场景下的非高保应用,VPA对象的资源饱和率设置为70%~80%,减少资源浪费。6.相关收益基于上述VPA技术,我们更好的解决了IDC和公有云集群中容器规格不合理的问题,从而释放了存量机器中的大量闲置资源。在测试集群中,释放了大约60%的CPU容量空间和30%的内存容量空间;生产集群释放了约30%的CPU容量空间,节省了千余台机器的采购成本。7.总结与展望本文介绍哔哩哔哩云平台垂直弹性伸缩(VPA)的技术实践,主要涉及VPA的核心控制器逻辑,包括策略生成模板、推荐值计算、推荐值更新方式等。在同时介绍了VPA管理平台的VPA策略优化、VPA策略规避、VPA效果分析、VPA异常检测等功能。我们充分结合实际业务场景,将VPA技术进行商业化推广。在未来VPA技术的迭代过程中,我们将结合应用画像、算力标准化等技术能力,制定精细化的VPA策略,进一步助力降本增效。参考资料:[1]https://mp.weixin.qq.com/s/pPEkfrLm0XEpgMU1KjiD4A[2]https://github.com/kubernetes/enhancements/issues/1287本期作者徐龙,哔哩哔哩高级开发工程师崔朝杰哔哩哔哩高级开发工程师张赫哔哩哔哩高级SRE工程师