g.nodeInfoSnapshot.NodeInfoMap)// 获取所有node的优先级
ScheduleAlgorithm是一个接口卖力为pod选择一个合适的node节点,本节主要解析如何实现一个可扩展、可配置的通用算法框架来实现通用调理,如何进行算法的统一注册和构建,如何进行metadata和调理流程上下文数据的通报
1. 设计思考 1.1 调理设计 1.1.1 调理与抢占当接收到pod需要被调理后,默认首先挪用schedule来进行正常的业务调理测验考试从当前集群中选择一个合适的node
如果调理掉败则测验考试抢占调理,按照优先级抢占低优先级的pod运行高优先级pod 1.1.2 调理阶段
在k8s的调理算法运行流程中,主要分为两个阶段:预选和优选,即从当前集群中选择切合要求的node,再从这些node中选择最合适的节点 1.1.3 节点选择
跟着集群的增加集群中的node数量越来越多,k8s并不是遍历所有集群资源,而是只拔取部分节点,同时借助之前说的 schedulerCache来实现pod节点的分手
1.2 框架设计 1.2.1 注册表与算法工厂针对差此外算法,声明差此外注册表,卖力集群中当前所有算法的注册,从而供给给调理配置决策加载那些插件,实现算法的可扩展性
并通过工厂模式来进行统一打点,解耦算法的注册与具体调理流程中的使用,由每个算法的工厂要领来接受参数进行具体算法的创建 1.2.3 metadata与PluginContext
在调理实际运行的过程中,需要调集当前集群中的元数据信息(node和pod)来进行具体算法的决策,scheduler给与PredicateMetadataProducer和PriorityMetadataProducer来进行元数据的构建, 其次针对一些可能被多个算法都使用的数据,也会在这里完成构建,好比亲和性的pod、拓扑等
并通过PluginContext进行本次调理上下文数据的存储,用于在多个调理算法之间存储数据进行交互
1.2.4? ProviderProvider主要是封装一组具体的预选和优选算法,并通过注册来实现统一打点, 此中系统内置了DefaultProvider
1.2.5 frameworkframework是一种内部的扩展机制,通过定制给定的阶段函数,进行调理流程的影响,本节先不介绍
1.2.6 extender一种外部的扩展机制,可以按照需要进步履态的配置,其实就是外部的一个service,但是对比framework可以使用本身独立的数据存储,实现对调理器的扩展
2. 源码分析 2.1 数据布局 type genericScheduler struct { cache internalcache.Cache schedulingQueue internalqueue.SchedulingQueue predicates map[string]predicates.FitPredicate priorityMetaProducer priorities.PriorityMetadataProducer predicateMetaProducer predicates.PredicateMetadataProducer prioritizers []priorities.PriorityConfig framework framework.Framework extenders []algorithm.SchedulerExtender alwaysCheckAllPredicates bool nodeInfoSnapshot *schedulernodeinfo.Snapshot volumeBinder *volumebinder.VolumeBinder pvcLister corelisters.PersistentVolumeClaimLister pdbLister algorithm.PDBLister disablePreemption bool percentageOfNodesToScore int32 enableNonPreempting bool } 2.1.1 集群数据集群元数据主要分为三部分:
Cache: 存储从apiserver获取的数据?
SchedulingQueue: 存储当前行列队伍中期待调理和颠末调理但是未真正运行的pod
预选算法主要包罗两部分:当前使用的预选调理算法结合和元数据构建器
predicates map[string]predicates.FitPredicate predicateMetaProducer predicates.PredicateMetadataProducer 2.1.3 优先级算法相关优选算法与预选算法不太不异,在后续文章中会进行介绍
priorityMetaProducer priorities.PriorityMetadataProducer prioritizers []priorities.PriorityConfig 2.1.4 扩展相关 framework framework.Framework extenders []algorithm.SchedulerExtender 2.2 调理算法注册表Priority会庞大一点,这里就不介绍了,其核心设计都是一样的 2.2.1 工厂注册表 fitPredicateMap = make(map[string]FitPredicateFactory) 2.2.2 注册表注册
注册主要分两类:如果后续算法不会使用当前Args里面的数据,只需要使用metadata里面的,就直接返回注册算法,下面的函数就是返回一个工厂要领,但是不会使用Args参数
func RegisterFitPredicate(name string, predicate predicates.FitPredicate) string { return RegisterFitPredicateFactory(name, func(PluginFactoryArgs) predicates.FitPredicate { return predicate }) }温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31526.html