图解kubernetes调理器SchedulerExtender扩展
在kubernetes的scheduler调理器的设计中为用户预留了两种扩展机制SchdulerExtender与Framework,本文主要浅谈一下SchdulerExtender的实现, 因为还有一篇Framework, 所以本文的k8s代码切到1.18版本
1. 设计思路 1.1 实现机制SchdulerExtender是kubernets外部扩展方法,用户可以按照需求独立构建调理处事,实现对应的长途挪用接口(目前是http), scheduler在调理的对应阶段会按照用户界说的资源和接口来进行长途挪用,对应的service按照本身的资源数据和scheduler通报过来的中间调理功效来进行决策
1.2 处事插拔extender只需要实现对应插件的接口,并编写yaml文件来进行注册对应的处事接口,就可以实现scheduler的扩展,不需要改削任何调理器的代码,即可实现调理插件的插拔
1.3 资源存储因为是独立的处事,extender可以实现自界说资源的存储与获取,甚至可以不依赖于etcd使用第三方的存储来进行资源的存储,主要是用于kubernetes中不撑持的那些资源的调理扩展
2. SchedulerExtender 2.1 接口与实现 2.1.1 接口声明Scheduler主要用于扩展
type SchedulerExtender interface { // Name returns a unique name that identifies the extender. Name() string //预选阶段, 进行筛选 Filter(pod *v1.Pod, nodes []*v1.Node) (filteredNodes []*v1.Node, failedNodesMap extenderv1.FailedNodesMap, err error) // 优选阶段,参预优选评分 Prioritize(pod *v1.Pod, nodes []*v1.Node) (hostPriorities *extenderv1.HostPriorityList, weight int64, err error) // extender对pod指向绑定操纵 Bind(binding *v1.Binding) error // 扩展是否撑持bind IsBinder() bool // 是否对对应的pod的资源感兴趣 IsInterested(pod *v1.Pod) bool // 抢占阶段 ProcessPreemption( pod *v1.Pod, nodeToVictims map[*v1.Node]*extenderv1.Victims, nodeInfos listers.NodeInfoLister) (map[*v1.Node]*extenderv1.Victims, error) // 是否撑持抢占 SupportsPreemption() bool // IsIgnorable returns true indicates scheduling should not fail when this extender // is unavailable. This gives scheduler ability to fail fast and tolerate non-critical extenders as well. IsIgnorable() bool } 2.1.2 默认实现 // HTTPExtender implements the algorithm.SchedulerExtender interface. type HTTPExtender struct { extenderURL string preemptVerb string filterVerb string prioritizeVerb string bindVerb string weight int64 // 对应的权重 client *http.Client // 卖力http接口通过 nodeCacheCapable bool // 是否通报node元数据 managedResources sets.String // 当前extender打点的资源 ignorable bool }extender的默认是海鲜是同过 HTTPExtender实现,即基于http协议通过json来进行数据通报,其核心数据布局如下
2.2 关键实现机制 2.2.1 长途通信接口其实通信很简单,通过http协议json序列化方法来进行长途post的提交,并序列化返回的功效 // Helper function to send messages to the extender func (h *HTTPExtender) send(action string, args interface{}, result interface{}) error { // 序列化 out, err := json.Marshal(args) if err != nil { return err } // 拼接url url := strings.TrimRight(h.extenderURL, "/") + "/" + action req, err := http.NewRequest("POST", url, bytes.NewReader(out)) if err != nil { return err } // 设置http header req.Header.Set("Content-Type", "application/json") // 发送数据接收功效 resp, err := h.client.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("Failed %v with extender at URL %v, code %v", action, url, resp.StatusCode) } // 序列化返回功效 return json.NewDecoder(resp.Body).Decode(result) } 2.2.2 node cache
nodeCacheCapable是声明extender的一个参数,即对应的extender是否会缓存node的数据,如果缓存数据,则只需要通报node的名字,而不会进行所有元数据的通报,可以减少通信的数据包巨细
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30744.html