图解kubernetes调度器SchedulerExtender扩展

本文探讨了kubernetes调度器SchedulerExtender的实现,包括其设计思路、服务插拔、资源存储。SchedulerExtender允许用户通过实现特定接口构建独立的调度服务,进行远程调用扩展。重点讲解了过滤接口Filter和优先级接口Prioritize的调用过程,Filter阶段为串行调用,而优先级阶段为并行调用。此外,文中还提及了SchedulerExtender的缓存机制和资源管理策略。
摘要由CSDN通过智能技术生成

在kubernetes的scheduler调度器的设计中为用户预留了两种扩展机制SchdulerExtender与Framework,本文主要浅谈一下SchdulerExtender的实现, 因为还有一篇Framework, 所以本文的k8s代码切到1.18版本

1. 设计思路

image.png

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 远程通信接口

image.png其实通信很简单,通过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 {
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes是一个用于容编排和管理的开源平台。它可以帮助您在分布式系统中自动化部署、扩展和管理容化的应用程序。 以下是一个简单的Kubernetes架构图解: ``` +---------------------------------------+ | | | Master节点 | | | +---------------------------------------+ | | | | +---------------------------------------+ | | | Node节点(工作节点) | | | +---------------------------------------+ | | | | +---------------------------------------+ | | | Pod(容组) | | | +---------------------------------------+ | | | | +---------------------------------------+ | | | 容(Docker等) | | | +---------------------------------------+ ``` 在这个架构中,Kubernetes集群由一个Master节点和多个Node节点组成。Master节点负责整个集群的管理和控制,而Node节点是实际运行应用程序容的工作节点。 每个Node节点上可以运行多个Pod(容组),而每个Pod可以包含一个或多个容。这些容可以是使用Docker等容技术创建的。 Kubernetes通过Master节点上的控制平面组件来管理整个集群。这些组件包括: - API Server:提供集群的API接口,用于与集群进行交互; - Scheduler:负责将Pod调度到合适的Node节点上运行; - Controller Manager:负责监控和管理集群中的各种资源和控制; - etcd:分布式键值存储,用于保存集群的状态信息。 Node节点上的工作平面组件包括: - Kubelet:负责与Master节点通信,并在Node节点上运行和管理Pod; - Container Runtime:负责管理容的生命周期,例如Docker。 这个架构图简单地展示了Kubernetes的基本组件和层级关系,帮助您理解Kubernetes的工作原理和部署架构。请注意,实际的Kubernetes集群可能更加复杂,具体的配置和组件数量可能会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值