k8s扩展调度能力的三种实现方式

 更新时间:2025年10月30日 11:01:46   作者:云原生运维  
Kubernetes调度器扩展主要通过调度框架和调度器扩展器实现,调度框架提供多种插件接口,如QueueSort、Filter、Score等,允许扩展调度逻辑,调度器扩展器通过HTTP服务扩展调度功能,支持Filter、Prioritize等扩展点

Kubernetes 调度器扩展原理

Kubernetes 调度器扩展主要通过两种机制实现:

调度框架(Scheduling Framework)调度器扩展器(Extender)

前者是内置的可编程插件体系,后者是外部的独立服务。

调度框架(Scheduling Framework)

调度框架将调度过程分解为多个阶段,每个阶段允许通过插件扩展:

1. 调度周期(Scheduling Cycle)

  • QueueSort插件:定义 Pod 的调度队列排序规则。
  • PreFilter插件:检查 Pod 的调度前提条件(如资源请求是否合法)。
  • Filter插件:替代原生的 Predicates 逻辑,过滤不满足条件的节点。
  • PostFilter插件:当无可用节点时触发(如抢占逻辑)。
  • PreScore插件:为 Score 阶段准备数据。
  • Score插件:替代原生的 Priorities 逻辑,为节点打分。
  • NormalizeScore插件:标准化分数到统一范围(如 0-100)。
  • Reserve插件:预留资源(绑定前执行清理逻辑)。

2. 绑定周期(Binding Cycle)

  • PreBind插件:绑定前执行(如挂载网络存储)。
  • Bind插件:将 Pod 绑定到节点(默认实现为 API 调用)。
  • PostBind插件:绑定后执行通知类操作。

插件通过实现接口注册到框架,例如:

type ScorePlugin interface {
    Score(ctx context.Context, state *CycleState, pod *v1.Pod, nodeName string) (int64, *Status)
}

调度器扩展器(Extender)

Extender 是独立于调度器的 HTTP 服务,通过配置 kube-scheduler--policy-config-file 实现扩展:

1. 扩展点支持

  • Filter:扩展节点过滤逻辑。
  • Prioritize:扩展节点打分逻辑。
  • Preempt:扩展抢占逻辑。
  • Bind:扩展绑定逻辑。

2. 通信协议

调度器通过 HTTP POST 请求与 Extender 交互,请求体包含 Pod 和节点列表,响应返回过滤结果或打分。

示例 Filter 请求体:

{
  "Pod": {"metadata": {"name": "nginx"}},
  "Nodes": {"items": [{"metadata": {"name": "node-1"}}]}
}

3. 配置示例

{
  "extenders": [{
    "urlPrefix": "http://extender-service:80",
    "filterVerb": "filter",
    "prioritizeVerb": "prioritize",
    "weight": 1
  }]
}

自定义调度器(Custom Scheduler)

完全独立的调度器实现:

  1. 监听未调度的 Pod(pod.spec.schedulerName 匹配自定义名称)。
  2. 调用 Kubernetes API 完成绑定(需具备 bind 权限)。
  3. 可与默认调度器共存,通过 schedulerName 区分。

性能与隔离考量

  • 调度框架:插件运行在调度器进程中,性能高但可能影响稳定性。
  • Extender:独立进程隔离性好,但 HTTP 通信有延迟。
  • 自定义调度器:灵活性最高,但需重复实现基础功能。

典型场景选择:

  • 简单策略扩展优先用调度框架插件。
  • 复杂外部依赖(如对接内部系统)适合 Extender。
  • 特殊调度需求(如批量任务)可开发自定义调度器。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一文详解如何高效查看k8s日志

    一文详解如何高效查看k8s日志

    K8S是kubernetes的缩写,是为解决容器服务编排而生的,在运维K8S服务的过程中,经常会遇到各种报错和诊断问题,那么我们一般怎么查看K8S组件的日志,这篇文章主要给大家介绍了关于如何高效查看k8s日志的相关资料,需要的朋友可以参考下
    2023-10-10
  • Prometheus Operator架构介绍

    Prometheus Operator架构介绍

    这篇文章主要为大家介绍了Prometheus Operator架构介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • k8s容器反复重启问题及解决

    k8s容器反复重启问题及解决

    这篇文章主要介绍了k8s容器反复重启问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • Harbor高可用配置及仓库使用介绍

    Harbor高可用配置及仓库使用介绍

    这篇文章主要为大家介绍了Harbor高可用配置及仓库使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 2022最新青龙面板对接机器人的详细过程(傻妞对接onebot(oicq)协议实现机器人功能)

    2022最新青龙面板对接机器人的详细过程(傻妞对接onebot(oicq)协议实现机器人功能)

    这篇文章主要介绍了2022最新青龙面板对接机器人的详细过程(傻妞对接onebot(oicq)协议实现机器人功能),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Kubernetes(k8s)常用yaml配置和注释方式

    Kubernetes(k8s)常用yaml配置和注释方式

    这篇文章主要介绍了Kubernetes(k8s)常用yaml配置和注释方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • 如何给k8s集群里的资源打标签

    如何给k8s集群里的资源打标签

    k8s集群,节点如果有多个角色,需要标记出来,可以给对应的节点打上标签,方便后续了解节点的功能,这篇文章主要介绍了如何给k8s集群里的资源打标签,需要的朋友可以参考下
    2023-02-02
  • 在CentOS上如何安装Singularity高性能容器

    在CentOS上如何安装Singularity高性能容器

    Singularity是劳伦斯伯克利国家实验室专门为大规模、跨节点HPC和DL工作负载而开发的容器化技术,具备轻量级、快速部署、方便迁移等优势,且支持从Docker镜像格式转换为Singularity镜像格式,本文给大家介绍在CentOS上如何安装Singularity高性能容器,感兴趣的朋友一起看看吧
    2024-05-05
  • Kubernetes(k8s 1.23))安装与卸载详细教程

    Kubernetes(k8s 1.23))安装与卸载详细教程

    这篇文章主要介绍了Kubernetes(k8s 1.23))安装与卸载,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • k8s如何给node添加标签(最新推荐)

    k8s如何给node添加标签(最新推荐)

    k8s集群如果由大量节点组成,可将节点打上对应的标签,然后通过标签进行筛选及查看,更好的进行资源对象的相关选择与匹配,这篇文章主要介绍了k8s如何给node添加标签,需要的朋友可以参考下
    2023-02-02

最新评论