Kubernetes 中的 Scheduler 是什么?

在 Kubernetes 中,Scheduler 是一个集群级别的调度器,负责将 Pod 指派到集群内的节点上。它监听来自 API Server 的新创建的未指派节点的 Pod,并根据调度策略为其选择一个节点。

Scheduler 的主要作用是:

  • 为新创建的 Pod 选择调度到的节点。
  • 根据调度策略和节点状态进行调度判断。
  • 确保高效利用集群资源。
  • 维持 Pod 的高可用性。

Scheduler 的工作流程是:

  1. Scheduler 启动时会从 API Server 获取所有未指定主机的 Pod 列表。
  2. Scheduler 计算出每个 Pod 可调度的候选节点列表。
  3. Scheduler 根据调度策略评估每个候选节点,选择一个最优节点。
  4. Scheduler 通过 API Server 将 Pod 绑定到选定节点。
  5. API Server 持久化绑定关系,并通知相关控制器和 kubelet。
  6. 控制器和 kubelet 接收到通知后会进一步操作来启动 Pod。
  7. Scheduler 继续循环监听未调度 Pod 并重复上述过程。

Scheduler 中主要的调度算法有:

  • SelectorSpreadPriority:尽量将匹配同一 selector 的 Pod 分散部署到不同节点上。
  • InterPodAffinityPriority:考虑 Pod 间的亲和性约束。
  • LeastRequestedPriority:选择已请求资源较少的节点。
  • BalancedResourceAllocation:综合考虑节点的 CPU 和内存利用率,选择资源利用率较均衡的节点。
  • NodePreferAvoidPodsPriority:优先选择指定的节点,避免选择排除的节点。

示例:

  1. 用户通过 kubectl 创建一个新的 Pod。
  2. Scheduler 检测到新创建的未调度 Pod。
  3. Scheduler 根据 Pod 的要求和节点选择算法计算出 3 个候选节点。
  4. Scheduler 对比 3 个节点,根据调度策略选择其中一个节点(如资源充足的节点)作为最优节点。
  5. Scheduler 通过 API Server 将该 Pod 绑定到选定节点。
  6. API Server 持久化绑定关系,并通知 kubelet 和相关控制器。
  7. Kubelet 和控制器将 Pod 启动在选定节点上。
  8. Scheduler 循环再次监听未调度 Pod 调度下一个 Pod。

所以总结来说,Scheduler 的主要作用是在集群内对新创建的 Pod 进行调度与节点选择,其主要特征是:

  1. 监听未指定节点的新 Pod。
  2. 计算 Pod 的可调度节点列表。
  3. 根据调度算法和策略选择最优节点。
  4. 通过 API Server 完成 Pod 与节点的绑定。
  5. 确保高效利用集群资源和 Pod 高可用性。

它的工作流程是:

  1. Scheduler启动时获取所有未指定节点的Pod列表。
  2. 计算每个Pod的可调度节点列表。
  3. 根据调度策略选择最优节点。
  4. 通过API Server完成Pod与节点绑定。
  5. API Server持久化绑定关系并通知相关组件。
  6. 相关组件启动Pod。
  7. Scheduler继续监听未调度Pod,重复调度过程。