一、kube-scheduler 概述
kube-scheduler 是 Kubernetes 中的核心组件之一,它负责将新创建但未指定 Node 的 Pod 分配到适合的 Node 上进行运行,这个过程称为 调度 (scheduling)。
二、工作流程
-
检测到新 Pod:kube-apiserver 收到新创建的 Pod 请求后会存入 etcd,等待 kube-scheduler 调度
-
调度 Pod:kube-scheduler 获取未调度的 Pod
-
进行筛选与评分:对所有 Node 进行筛选、分数、排序
-
分配 Node:选出最佳节点给该 Pod
-
写入 Pod 指定节点:将结果写回 kube-apiserver
三、调度策略
Kubernetes 使用两步法进行调度:
-
Predicate (Filter) 策略:筛选出合选节点
-
如 PodFitsResources (资源是否足够)
-
PodFitsHost (节点名是否匹配)
-
PodToleratesNodeTaints (是否容忍 taint)
-
-
Priority (Score) 策略:对合选节点分值
-
LeastRequestedPriority (资源资池最大余量)
-
BalancedResourceAllocation (资源均衡)
-
NodeAffinityPriority (节点亲和)
-
四、常用配置项
kube-scheduler 支持通过参数或配置文件进行调整:
--kubeconfig=/etc/kubernetes/scheduler.conf
--leader-elect=true
--bind-address=127.0.0.1
--scheduler-name=default-scheduler
--config=/etc/kubernetes/scheduler-config.yaml
配置文件 scheduler-config.yaml 示例:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
kubeconfig: "/etc/kubernetes/scheduler.conf"
leaderElection:
leaderElect: true
profiles:
- schedulerName: default-scheduler
plugins:
score:
enabled:
- name: NodeResourcesBalancedAllocation
pluginConfig:
- name: NodeResourcesBalancedAllocation
args:
resources:
- name: cpu
weight: 1
- name: memory
weight: 1
五、实际应用场景
5.1 自定义 Scheduler
可以设置 Pod 属性中的 schedulerName
,使用自定义调度器:
spec:
schedulerName: my-custom-scheduler
配合自己开发的策略插件,实现更复杂的调度逻辑。
5.2 构造多调度器互不干扰环境
对于有多种运维策略需求的集群,可构造多个 scheduler 执行不同策略,通过 Pod 指定 schedulerName 分层执行。
5.3 跟踪 Scheduler 调度过程
使用日志查看 Pod 是否被分配,或查看 Events:
kubectl describe pod <pod-name>
或者监控 scheduler 日志:
journalctl -u kube-scheduler
六、总结
kube-scheduler 是 Kubernetes 中非常重要的组件,它确保了 Pod 能被合理分配到合选节点。熟悉它的调度模型和扩展性将有助于建立高效、稳定的 Kubernetes 运行环境。