腾讯陈东东:Caelus全场景在离线混部的思考与实践( 三 )


以CPU资源为例 , 在云原生场景下 , 离线任务通过扩展资源提交 , 默认为BestEffort类型 。
腾讯陈东东:Caelus全场景在离线混部的思考与实践
文章图片
CPU不能复用Guaranteed类型的空闲资源(CPUManager开启Statics策略);内存不能复用所有空闲内存(Kubelet开启QoSReserved策略);
对于离线任务只能复用部分空闲资源问题 , 我们考虑把离线进程放入独立cgroup目录下 。 我们可以通过周期性移动离线进程到独立cgroup目录下 , 但这种方式时效性差 , 尤其是离线任务在刚启动时若消耗大量CPU , 这段时间的离线资源开销是不可控的 。 基于此 , 我们采用拦截的方式 , 在离线任务创建时 , 让其进程直接放入独立cgroup目录(Offline目录)下 。 该目录独立于Kubelet管理范围 , 可复用全部空闲资源 。 拦截操作不入侵Kubernetes原生代码逻辑 , 具有兼容性强、方便移植的特点 。 腾讯陈东东:Caelus全场景在离线混部的思考与实践
文章图片
全维度资源隔离资源隔离是混部的基础 , 全维度资源隔离能够避免离线在单一维度上的资源挤占对在线造成影响 。
腾讯陈东东:Caelus全场景在离线混部的思考与实践
文章图片
资源隔离要遵循两个原则 。
离线资源严格限制 , 保障在线资源充裕;
在线高优先级抢占 , 实时满足在线资源需求 。 离线服务质量保障技术及思考离线高性能调度
混部离线任务主要是大数据任务 , 大数据任务多是短作业且数量大、并发度高 , 对调度要求非常高 。
腾讯陈东东:Caelus全场景在离线混部的思考与实践
文章图片
Kubernetes原生的调度逻辑面向在线业务 , 注重在线的调度功能 , 无法满足离线业务的性能需求 。 所以我们自研了离线调度器 , 采用批量调度方式 , 相较K8s原生调度器 , 有数量级的提升 。
在离线任务填充满集群的情况下 , 若有大量在线任务需要调度 , 我们可以采用批量抢占的方式迅速抢占离线 , 从而大大提高在线调度的调度效率 。 在提升调度性能的同时 , 我们也通过插件式机制高效实现各种功能迭代 。
混部场景下 , 在线调度和离线调度该如何协同呢?
若集群只有一个调度器 , 在线和离线调度逻辑集中在一起 , 会产生调度器逻辑复杂、调度性能易成为瓶颈等问题 。
若采用多个调度器基于全局锁进行协调 , 调度器在进行调度前需要先获得锁 , 才能进行调度 。 这种方式并发度低、资源利用率低 , 故又被称为“悲观并发” 。
当前 , 我们采用的是“多调度器+协调器”的方式进行调度 , 它也被称为基于共享状态的“乐观并发” 。
腾讯陈东东:Caelus全场景在离线混部的思考与实践
文章图片
如上图所示 , 集群中不同的调度器单独进行调度 , 在绑定节点之前向协调器申请资源 。 协调器可以统筹协调调度 , 支持多调度器同时运行 , 且具有高效的冲突解决机制 。 多调度器+协调器架构能够兼顾在线调度的功能需求和离线调度的性能需求 。
大数据任务混部服务质量保障
混部的离线任务包括大数据任务和AI训练任务 , 大数据任务当前可分为云原生大数据和Hadoop , Caelus原生支持云原生大数据 。 针对Hadoop场景下的大数据任务 , 我们采用YARNonK8s的方式 , 将NM(NodeManager)以容器化的方式运行在K8s上 。
为了保证NM在容器中稳定地运行 , 我们也做了很多优化 。 如镜像热升级功能可以保证容器中的离线任务在NMPod升级过程中继续保持运行 。 另外混部资源是动态变化的 , 所以RM(ResourceManager)端的资源也需要动态感知 , 热更新capacity功能可以在不重启NM进程的情况下 , 动态地更新NM在RM端的资源 , 从而减少因重启带来的资源开销 。