创新点:
设计实现一个基于网络带宽资源均衡的优选调度算法BWNA,充分利用k8s集群中节点的网络带宽,满足密集型应用调度需求。设计实现一种伪并行调度,减少调度过程的冗余工作量,降低Pod平均调度耗时。设计实现了一个控制器DQ验证了能够监控集群节点的资源变化,动态修改多租户资源配额,用户空间下能调度的资源额度可动态变化。

重要理论:(概念)
·k8s不能满足所有应用场景,默认调度策略不能基于网络带宽资源均衡调度,无法满足网络密集型应用调度需求。默认调度器对同一个副本集下所有Pod都会执行完整预优选流程,大量冗余影响性能。集群中为多租户配置的资源配额是静态的,不能随集群节点资源变化。针对这些问题提出解决方案验证有效性。
·Scheduler资源调度 预选、优选(算法打分评估最高) 绑定,默认只有CPU、内存,不会考虑网络带宽,对于像CDN等网络带宽要求高的应用无法将Pod均衡调度到不同节点。
·Controller管理集群内资源对象状态。K8s管理者,集群内部控制中心,会努力将资源当前状态调整为期望状态。

·V.18版之后k8s支持自定义调度器,难度大。V.1.15版推出Scheduling Framework来方便开发者添加自定义调度算法到默认scheduler上只需按规范开发自定义调度算法并注册到默认Scheduler上。V1.19版本k8s还提供了scheduler configuration使开发者在调度不同阶段关闭/开启指定调度算法,使自定义调度策略更灵活。
·根据权重综合考虑CPU、内存、网络带宽避免集群节点资源分配失衡,优化预优选两个阶段逻辑降低调度耗时。
·Docker镜像本质是文件系统,提供容器运行时一切文件,镜像层存储该镜像层列表和元数据等镜像信息不可变。
·Pod中有一个pause容器用于标识Pod生命周期,其他容器通过pause共享pod网络栈和存储卷资源,映射关系通过标签选择器完成。
·Scheduler framework在scheduler几乎所有关键路径上设置了plugins扩展点与core一起编译打包生成二进制包实现扩展。编写好自定义调度算法后,需要使用scheduler提供的方法withplugin将算法注册到集群中,重新编译scheduler,最后在k8s1.19版本中新增的kubeschedulerconfiguration对象配置要使用的调度插件。
·Namespace可对集群中不同用户进行资源隔离,隔离对象分为:资源对象、资源配额。
资源对象隔离:在集群中Pod和Deployment等在ns中互相不可见,用户只能管理自己负责ns下的资源对象。但对于集群中CPU、Mem却相互竞争。
资源配额隔离:为了解决这种竞争关系,在ns下可独立设置资源配额对象。RQ可设置Pod数目、额度,防止恶意竞争。若超过资源配额最大值则创建请求失败。用户必须为相应的资源类型设置Requests和Limits否则Controller拒接创建资源。LimitRange为没有配置资源额度的容器设置默认值
研究问题:
1.设计能够基于网络资源均衡调度算法BWNA,综合考虑cpu、内存、网络带宽三个指标,满足网络密集型应用的调度需求。让每个资源都被使用,为每个资源加上权重,算法更关注想关注的指标,想使网络资源更均衡,使网络带宽权重Wn更大,网络资源剩余比例越高,得分越高。节点上不同资源使用量占比差距越小表示资源分配越均衡,分数越高。通过设置权重灵活地选择用户更加关注的指标。
2.pod伪并行调度策略PPS提升调度速度,验证其调度性能。K8s默认scheduler对pod调度是串行的每次只会调度队列中优先级最高的pod,依此进行预优选过程,选出最合适的节点来运行这个pod,冗余工作可能会对集群中性能产生影响。
3.多租户动态伸缩资源配额策略
Dynamic Quota(DQ)控制器解决用户空间下可调度资源额度不可变问题,用户空间下资源额度不能动态变化问题。先分析多用户资源配额作用与隔离对象,然后介绍DQ控制器的设计实现,实验验证DQ可动态调整多用户下资源配额,动态变化。

研究方法:(模型建立、计算、分析方法总结)
1.Pod默认不能设置网络资源需求和Limit,调度pod时不知如何计算Request需要在pod.Metadata中为pod添加一个Label标记pod的网络request。
Master上运行pod比worker节点多,不考虑Master,设Master为不可调度的污点,让pod都调度到资源相同的worker节点上。

两种评价方法:均方误差、计算不同资源使用量的绝对值差评价是否均衡。

2.预选:scheduler依次调度队列中取出一个pod,为每个pod遍历集群中所有可用的节点,找出列表,同一个副本集的pod由同样模板文件定义,对于节点需求是相同的。
优选:遍历集群中通过预选阶段的节点,进行优选算法打分,若不考虑前面pod的绑定结果,节点打分一致所有的pod优选流程结果一样。
PPS核心思想:
1)为节点设置一个最小可运行pod的分数值MinNodeScore将pod调度到能满足pod运行条件且得分不少于MinNodeScore节点上,代表节点相对较优符合最优解的思想。
2)一旦节点绑定过pod那下一个pod调度可不考虑这个节点,但如果每个节点上只绑定一个pod就不再调度也不合理。
PPS将待调度同一Set下pod分为ThePod和NormalPod两种,对ThePod进行全流程预优选,对NormalPod无需执行全部预优选。一对多,从NormalPod n+1开始新的调度周期,并将它定义为新的调度周期Thepod重复,直到所有Pod都调度到条件合格的节点上。在每个调度周期内每一个Pod调度不考虑之前pod调度后结果,选择当前调度周期内最优的节点,且每个调度周期内节点不会被重复调度。

3.动态资源配额
设计DQ控制器,以集群资源变化出发,监听集群中节点增加和删除、根据集群资源变化比率计算RQ,动态调整比例,最后修改多租户下RQ数据。
DQ设计:统计集群当前所有可用节点的CPU和内存的总量,保存当前集群节点列表NodeList。通过NodeInformer监听集群中节点资源变化。若变化,更新NodeList,分别计算CPU、mem资源变化率。计算DQ支持Mean、Max、Min三种策略。按照DQ的changepolicy选择公式计算最终Ratio,遍历配置中需要动态变化的ns。对ns下RQ进行资源配额调整达到RQ随集群资源变化而变化。

DQ由两个核心部分组成:
自定义k8s资源对象Custom Resource,存放自定义控制器需要的变量和对象。
自定义控制器Custom Controller,编写控制器核心控制逻辑Reconcile调和方法。
使用控制器绑定Kind工作在另一方法SetupWithManager中,用于绑定控制器和GVK使DQ自动监听。

使用openstack中虚拟机作为集群节点来搭建k8s集群。

主要结论:(摘要结尾句)
1.基于网络带宽资源均衡的优选调度BWNA算法,充分利用k8s集群中节点的网络带宽,验证了满足密集型应用调度需求。
2.一种伪并行调度,减少调度过程的冗余工作量,降低Pod平均调度耗时。PPS算法调度同一个副本集上的pod能明显降低调度耗时
3.DQ随集群节点资源多次变化,不断地调整为多租户设置的资源配额。
不足与展望:
伪并行调度策略只适合同一个副本集下的pod,可以考虑研究推广到所有pod。
考虑使用schedulerframework实现伪并行算法无需修改代码的问题。
总结与思考:(心得、这篇文章是否可模仿、可扩展、换参数)
读了这篇文献了解了pod调度扩展,可以考虑将网络资源、伪并行算法和动态资源调度同时加入调度策略,实验操作起来应该很复杂,可以先尝试建立模型。另外这篇论文可以模仿,通过换参数、扩展网络资源除带宽外其他资源参数等。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐