目录
- 1. 角色与功能
- 2. 调度流程
- 3. 调度策略与约束
- 4. 配置与启动
- 5. 监控与调试
Scheduler 是 Kubernetes 集群中的核心组件之一,负责将待调度的 Pod 分配到合适的节点上运行。
1. 角色与功能
-
Pod 分配:当一个新的 Pod 被创建或现有 Pod 需要重新调度时,Scheduler 会根据一系列调度策略和约束条件,从集群中的可用节点中选择一个最合适的节点,将 Pod 分配到该节点上运行。
-
调度循环:Scheduler 以一定频率(默认为 100ms)从 API Server 中获取未调度(Pending)的 Pod 列表,对每个未调度的 Pod 执行调度流程。
-
调度算法:Scheduler 采用基于优先级和过滤器的调度算法。首先,通过一系列过滤器(如资源需求匹配、节点标签选择器、污点容忍度检查等)筛选出符合条件的节点列表;然后,对筛选后的节点计算优先级得分,并选择得分最高的节点作为 Pod 的目标节点。
-
调度插件:Scheduler 具有高度的可扩展性,支持插件化调度策略。用户可以通过编写自定义调度插件来实现特定的调度需求,如亲和性/反亲和性调度、工作负载隔离、硬件亲和性等。
2. 调度流程
-
监听未调度 Pod:Scheduler 通过监听 API Server 的事件,获取待调度的 Pod 列表。
-
预选阶段:对每个未调度的 Pod,执行一系列预选(Filter)插件。每个插件返回一个布尔值,表示节点是否满足该插件的条件。只有所有插件都返回
true
的节点才会进入下一轮优选阶段。 -
优选阶段:对预选阶段筛选出的节点,执行一系列优选(Score)插件。每个插件为每个节点计算一个优先级得分。所有插件的得分汇总后,形成每个节点的总得分。得分最高的节点将被选为 Pod 的目标节点。
-
绑定:Scheduler 将选定的目标节点信息写入 Pod 的
.spec.nodeName
字段,并通过 API Server 更新 Pod 状态。kubelet 在检测到新的 Pod 分配后,会在目标节点上启动 Pod。 -
抢占:在资源紧张的情况下,如果无法为高优先级的 Pod 找到足够资源的空闲节点,Scheduler 可能会选择终止(驱逐)低优先级的 Pod,以释放资源供高优先级 Pod 使用。这一过程称为抢占(Preemption)。
3. 调度策略与约束
-
资源需求:Scheduler 确保目标节点有足够的 CPU、内存、GPU 等资源来满足 Pod 的资源请求(
.spec.containers[].resources.requests
)和限制(.spec.containers[].resources.limits
)。 -
节点选择器与亲和性/反亲和性:通过 Pod 或 Node 上的标签选择器(
.spec.nodeSelector
、.affinity.nodeAffinity
、.affinity.podAffinity
、.affinity.podAntiAffinity
),控制 Pod 能够运行在哪些节点上,以及与其他 Pod 的位置关系。 -
污点与容忍度:节点可以被标记为具有污点(Taint),表示存在某种限制或异常情况。Pod 必须声明对应的容忍度(Toleration)才能被调度到具有相应污点的节点上。
-
调度器扩展点:通过编写自定义调度插件,可以实现更复杂的调度策略,如基于硬件特性(如 NUMA 架构、SSD 类型)的调度、基于工作负载特性的调度(如区分生产/测试环境、按租户隔离)等。
4. 配置与启动
-
配置文件:Scheduler 的配置通常通过一个 YAML 或 JSON 文件(如
kube-scheduler.yaml
)来指定,包括但不限于以下内容:- 调度策略插件:启用的预选和优选插件及其配置。
- 领导选举:当集群中有多个 Scheduler 实例时,通过 LeaderElection 配置实现主从选举,确保只有一个 Scheduler 实例处于活跃状态。
- 绑定超时:Pod 与节点绑定的超时时间,超过该时间仍未成功绑定的 Pod 将重新进入调度队列。
-
启动命令:使用
kube-scheduler
二进制文件启动 Scheduler,传入配置文件路径作为参数。例如:kube-scheduler --config=kube-scheduler.yaml
5. 监控与调试
-
日志:查看 Scheduler 日志可以帮助诊断调度失败、调度延迟等问题。日志通常输出到标准输出(stdout)或日志文件中。
-
Metrics:Scheduler 提供了一系列 Prometheus 格式的指标,如调度周期、调度失败次数、插件执行耗时等,可用于监控调度性能和健康状况。
-
调试工具:
kubectl describe pod <pod-name>
可以查看 Pod 的调度状态和相关事件。kubectl get events
可以查看集群中发生的事件,包括与调度相关的事件。kubectl debug
命令可以帮助调试运行中的 Pod。
总结一下吧:
Kubernetes Scheduler 负责将待调度的 Pod 分配到合适的节点上运行,通过一系列预选和优选策略确保资源的有效利用和工作负载的合理分布。其高度可扩展的插件化架构允许用户根据实际需求定制调度策略,实现复杂的工作负载管理和资源调度。