1.6 Kube Scheduler

1.6 Kube Scheduler

Kube Scheduler 是 Kubernetes 控制平面的核心组件之一,负责将新创建的 Pod 分配到集群中合适的节点上运行。scheduler只决定哪个pod放在哪里,但不执行任何操作。

以下是基于 Kubernetes 官方文档和 Udemy 课程内容的详细解析:

一、核心工作原理

1. 调度流程概述

  1. **过滤阶段 (Predicates)**:从所有节点中筛选出符合 Pod 要求的候选节点
  2. **打分阶段 (Priorities)**:对候选节点进行评分,选择最优节点
  3. **绑定阶段 (Binding)**:将 Pod 与选定节点绑定

2. 详细工作流程

  1. Pod 创建:用户通过 kubectl 或 API 创建 Pod
  2. 进入调度队列:Pod 进入 Scheduler 的待调度队列
  3. 调度周期开始
    • 从队列中取出一个 Pod
    • 检查 Pod 是否可调度(如是否有 nodeSelector 等限制)
  4. 过滤阶段
    • 检查节点资源是否足够(CPU、内存)
    • 检查节点是否满足 Pod 的亲和性/反亲和性规则
    • 检查节点是否有污点而 Pod 是否有相应容忍
    • 检查端口冲突等
  5. 打分阶段
    • 对通过过滤的节点进行评分(0-10 分)
    • 考虑因素包括:资源平衡、亲和性得分、数据局部性等
  6. 选择节点:选择得分最高的节点
  7. 绑定:通过 API Server 更新 Pod 的 nodeName 字段

二、调度策略详解

1. 预选策略 (Predicates)

  • PodFitsResources:检查节点资源是否满足
  • PodFitsHostPorts:检查请求的 HostPort 是否可用
  • MatchNodeSelector:检查节点标签匹配
  • CheckVolumeBinding:检查卷绑定情况
  • NoDiskConflict:检查存储卷冲突(已弃用)
  • PodToleratesNodeTaints:检查污点容忍

2. 优选策略 (Priorities)

  • LeastRequestedPriority:优先选择请求资源少的节点
  • BalancedResourceAllocation:平衡 CPU 和内存使用
  • NodeAffinityPriority:节点亲和性权重
  • TaintTolerationPriority:污点容忍权重
  • ImageLocalityPriority:优先选择已有所需镜像的节点

三、常用命令

1. 查看 Scheduler 状态

1
2
3
kubectl get componentstatuses scheduler
# 或缩写
kubectl get cs scheduler

2. 查看 Scheduler Pod

1
kubectl get pods -n kube-system -l component=kube-scheduler

3. 查看调度日志

1
2
3
kubectl logs -n kube-system <scheduler-pod-name>
# 带时间戳查看
kubectl logs -n kube-system <scheduler-pod-name> --timestamps=true

4. 查看调度事件

1
kubectl get events --field-selector involvedObject.kind=Pod

5. 查看未调度 Pod

1
kubectl get pods --all-namespaces --field-selector status.phase=Pending

6. 查看 Pod 调度详情

1
kubectl describe pod <pod-name> | grep -A 10 Events

7. 检查调度器配置

1
kubectl get pod <scheduler-pod-name> -n kube-system -o yaml

四、与其他功能的交互

1. 与 API Server 交互

  • 监听未绑定 Pod 的变化
  • 通过 API Server 更新 Pod 的绑定信息
  • 使用领导者选举机制实现高可用

2. 与 Controller Manager 交互

  • Controller Manager 创建的 Pod 需要 Scheduler 调度
  • 某些控制器(如 Deployment)会响应调度失败事件

3. 与 Kubelet 交互

  • Kubelet 接收调度结果并启动 Pod
  • Kubelet 上报节点资源使用情况影响后续调度

4. 与集群自动扩缩容 (Cluster Autoscaler) 交互

  • 当没有合适节点时,Cluster Autoscaler 可能扩展集群
  • Scheduler 会考虑自动扩缩容约束

五、高级配置

1. 自定义调度策略

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
plugins:
preScore:
enabled:
- name: InterPodAffinity
score:
enabled:
- name: InterPodAffinity
weight: 10

2. 多调度器配置

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
schedulerName: my-custom-scheduler
containers:
- name: nginx
image: nginx

3. 调度器调优参数

  • --percentage-of-nodes-to-score: 设置评分节点的百分比(默认 50%)
  • --kube-api-qps: 控制 API Server 的 QPS(默认 50)
  • --kube-api-burst: 控制 API Server 的突发请求量(默认 100)

六、常见问题排查

1. Pod 处于 Pending 状态

1
2
# 查看原因
kubectl describe pod <pod-name> | grep -i "failed scheduling"

2. 调度器性能问题

1
2
# 查看调度延迟
kubectl get --raw /metrics | grep scheduler_scheduling_algorithm_duration_seconds

3. 节点资源不足

1
kubectl describe node <node-name> | grep -A 10 Allocatable

七、最佳实践(来自 Udemy 课程)

  1. 合理设置资源请求和限制:帮助调度器做出更好决策
  2. 使用亲和性/反亲和性规则:控制 Pod 分布
  3. 使用污点和容忍:专用节点管理
  4. 监控调度延迟:确保调度性能
  5. 考虑 Pod 优先级:重要 Pod 优先调度
  6. 使用 PodTopologySpread:实现 Pod 拓扑分布

八、调试技巧

  1. 模拟调度
1
kubectl create -f pod.yaml --dry-run=server
  1. 查看调度器决策
1
kubectl get events --sort-by=.metadata.creationTimestamp
  1. 检查节点容量
1
kubectl describe nodes | grep -A 5 Capacity
  1. 检查调度器指标
1
2
kubectl proxy &
curl http://localhost:8001/metrics | grep scheduler