源码分析:crane主要组件及优秀代码总结

一、crane-scheduler

扩展了 k8s 原生调度器使其支持实时感知节点实际资源负载并且优化了热点调度。

主要组件包含:

1、crane-scheduler-controller

该组件会间歇性通过 prometheus 获取各节点的监控指标以得到实时负载,并且会通过 kube-apiserver 获取节点对应的调度事件以判断该节点是否出现热点调度,最终将实时负载和热点调度信息通过注解形式更新到对应节点。

源码调用逻辑如下图所示

上图中存放 event 信息的 heap 是一个 BindingHeap 结构,该结构定义如下:

当 event Contoller 收到 event 以后会提取出 nodeName、namespace、podName、时间戳等信息并构造一个 Binding 对象推到栈上;node Controller 更新节点注解时会计算该节点 Hot value 值,计算逻辑是遍历调度策略配置里面 hotValue 数组,调用**GetLastNodeBindingCount**函数计算每一个配置的热点值最终进行累加,代码如下:

2、crane-scheduler

扩展了 kube-scheduler 的 FilterScore等阶段,使得调度过程可以通过注解中的负载信息感知到该节点的实时负载。官方文档

crane-scheduler 也支持基于节点拓扑资源感知进行调度,但是需要 crane-agent 组件配合使用。官方文档

二、crane-agent

功能包含:收集节点拓扑信息、根据 pod 注解同步更新容器 cpuset 配置等等,以下代码主要分析这两个功能实现。

调用栈概览

源码分析

1、初始化 crane-agent 命令行参数、agent对象,然后运行 agent.Run() 函数启动所有注册的 manager。

2、收集node resource topology相关信息,包含:k8s node、kubelet reserved config、node topo info、cpuManagerPolicy,创建或更新 noderesourcetopology crd资源

3、cpu manager 初始化和启动

同步cm.state和linux cgroup中的cpusets

主要模块

1、collector模块

  • node resource topology

    收集主机 cpu topology、kubelet reserved、cpu manager policy、k8s node等资源信息,然后更新对应节点的noderesourcetopology crd资源。

优秀源码总结

1、适用于 k8s 资源不同版本数据对比,如果使用Golang 语言提供的 reflect.DeepEqual方法,当预期资源与已有资源默认值不同时,会导致此种方式失效。

equality.Semantic.DeepEqual(),可以配置一些参数来过滤掉空值、或指定的字段。

2、通用的patch资源实现

3、Builder pattern设计

Last updated