k8s scheduler Cahce 优化
文章目录
注:
该代码是基于k8s release v1.21.1 版本
Cache 概念
Cache 在 kube-scheduler 中是一个专门用来缓存当前集群 node 和 pod 状态信息的中间层。
Cache 数据结构如下所示:
type schedulerCache struct {
// 用来通知schedulerCache停止的chan,说明schedulerCache有自己的协程
stop <-chan struct{
}
// 假定Pod一旦完成绑定,就要在指定的时间内确认,否则就会超时,ttl就是指定的过期时间,默认30秒
ttl time.Duration
// 定时清理超时的AssumePod. 默认是1秒钟
period time.Duration
// This mutex guards all fields within this cache struct.
mu sync.RWMutex
// a set of assumed pod keys.
// The key could further be used to get an entry in podStates.
// 假定Pod集合,map的key与podStates相同,都是Pod的NS+NAME,
// 使用空结构体作为值,一种设计,在v1.20 还是用bool型的,这里就是用strcut{} 'sets.String map[string]Empty'
// struct {}是一个无元素的结构体类型,通常在没有信息存储时使用。优点是大小为0,不需要内存来存储struct {}类型的值。conli-good
assumedPods sets.String
// a map from pod key to podState.
// 获取podState的map, podState是对Cache的属性拓展,主要还是一个v1.Pod
podStates map[string]*podState
// 所有的Node,键是Node.Name,值是nodeInfoListItem
// 双向链表,怎么感觉有点像是一个LRU缓存,最近更新的放在头节点中
nodes map[string]*nodeInfoListItem
// headNode points to the most recently updated NodeInfo in "nodes". It is the
// head of the linked list.
headNode *nodeInfoListItem
//节点按照zone组织成树状,前面提到用nodeTree中Node的名字再到nodes中就可以查找到NodeInfo
nodeTree *nodeTree
// A map from image name to its imageState.
imageStates map[string