在 Kubernetes 中,Scheduler 是一个集群级别的调度器,负责将 Pod 指派到集群内的节点上。它监听来自 API Server 的新创建的未指派节点的 Pod,并根据调度策略为其选择一个节点。
Scheduler 的主要作用是:
- 为新创建的 Pod 选择调度到的节点。
- 根据调度策略和节点状态进行调度判断。
- 确保高效利用集群资源。
- 维持 Pod 的高可用性。
Scheduler 的工作流程是:
- Scheduler 启动时会从 API Server 获取所有未指定主机的 Pod 列表。
- Scheduler 计算出每个 Pod 可调度的候选节点列表。
- Scheduler 根据调度策略评估每个候选节点,选择一个最优节点。
- Scheduler 通过 API Server 将 Pod 绑定到选定节点。
- API Server 持久化绑定关系,并通知相关控制器和 kubelet。
- 控制器和 kubelet 接收到通知后会进一步操作来启动 Pod。
- Scheduler 继续循环监听未调度 Pod 并重复上述过程。
Scheduler 中主要的调度算法有:
- SelectorSpreadPriority:尽量将匹配同一 selector 的 Pod 分散部署到不同节点上。
- InterPodAffinityPriority:考虑 Pod 间的亲和性约束。
- LeastRequestedPriority:选择已请求资源较少的节点。
- BalancedResourceAllocation:综合考虑节点的 CPU 和内存利用率,选择资源利用率较均衡的节点。
- NodePreferAvoidPodsPriority:优先选择指定的节点,避免选择排除的节点。
示例:
- 用户通过 kubectl 创建一个新的 Pod。
- Scheduler 检测到新创建的未调度 Pod。
- Scheduler 根据 Pod 的要求和节点选择算法计算出 3 个候选节点。
- Scheduler 对比 3 个节点,根据调度策略选择其中一个节点(如资源充足的节点)作为最优节点。
- Scheduler 通过 API Server 将该 Pod 绑定到选定节点。
- API Server 持久化绑定关系,并通知 kubelet 和相关控制器。
- Kubelet 和控制器将 Pod 启动在选定节点上。
- Scheduler 循环再次监听未调度 Pod 调度下一个 Pod。
所以总结来说,Scheduler 的主要作用是在集群内对新创建的 Pod 进行调度与节点选择,其主要特征是:
- 监听未指定节点的新 Pod。
- 计算 Pod 的可调度节点列表。
- 根据调度算法和策略选择最优节点。
- 通过 API Server 完成 Pod 与节点的绑定。
- 确保高效利用集群资源和 Pod 高可用性。
它的工作流程是:
- Scheduler启动时获取所有未指定节点的Pod列表。
- 计算每个Pod的可调度节点列表。
- 根据调度策略选择最优节点。
- 通过API Server完成Pod与节点绑定。
- API Server持久化绑定关系并通知相关组件。
- 相关组件启动Pod。
- Scheduler继续监听未调度Pod,重复调度过程。