随着云计算和容器技术的发展,以docker为核心的容器技术迅速在开发者和科技公司中应用,Kubernetes凭借丰富的企业级、生产级功能成为事实上的容器集群管理系统。可是k8s的通用性
削弱了调度算法的定制性
,本文将调研定制化调度算法的方法,并且给出一个开源实现。
k8s与调度器架构
图1-1是Kubernetes的整体架构图,集群节点分为两种角色:Master节点
和Node节点
。Master节点是整个集群的管理中心,负责集群管理、容器调度、状态存储等组件都运行在Master节点上;Node节点是实际上的工作节点,负责运行具体的容器。
图 1-1 Kubernetes整体架构
Kubernetes调度器是独立运行的进程,内部运行过程从逻辑上可以分为多个模块。图1-2展示了默认调度器内部包含的具体模块,配置模块负责读取调度器相关配置信息,并且根据配置内容初始化调度器。
优先队列模块是一个优先堆数据结构,负责将待调度Pod根据优先级排序,优先级高的Pod排在前面,调度器会轮询优先队列,当队列中存在待调度Pod时就会执行调度过程[1]。
调度模块由
算法模块
、Node缓存
和调度扩展点
三部分组成,算法模块提供对Node进行评分的一系列基础算法,比如均衡节点CPU和内存使用率的NodeResourcesBalancedAllocation算法,算法模块是可扩展的,用户可以修改和添加自己的调度算法;Node缓存模块负责缓存集群节点的最新状态数据,为调度算法提供数据支撑;调度扩展点由一系列扩展点构成,每个扩展点负责不同的功能,最重要的扩展点是Filter、Score和Bind这三个扩展点。最后是绑定模块,负责将调度器选择的Node和Pod绑定在一起。
图 1-2 Kubernetes调度器架构
Kubernetes调度器代码采用可插拔的插件化设计思路,包括核心部分和可插拔部分。图1-2中的配置模块、优先队列和Node缓存是核心部分,算法模块、调度扩展点属于可插拔部分。这种插件化设计允许调度器一些功能通过插件的方式实现,方便代码修改和功能扩展,同时保持调度器核心代码简单可维护[