1.6 Kube Scheduler
Kube Scheduler 是 Kubernetes 控制平面的核心组件之一,负责将新创建的 Pod 分配到集群中合适的节点上运行。scheduler只决定哪个pod放在哪里,但不执行任何操作。
以下是基于 Kubernetes 官方文档和 Udemy 课程内容的详细解析:
一、核心工作原理
1. 调度流程概述
- **过滤阶段 (Predicates)**:从所有节点中筛选出符合 Pod 要求的候选节点
- **打分阶段 (Priorities)**:对候选节点进行评分,选择最优节点
- **绑定阶段 (Binding)**:将 Pod 与选定节点绑定
2. 详细工作流程
- Pod 创建:用户通过 kubectl 或 API 创建 Pod
- 进入调度队列:Pod 进入 Scheduler 的待调度队列
- 调度周期开始:
- 从队列中取出一个 Pod
- 检查 Pod 是否可调度(如是否有 nodeSelector 等限制)
- 过滤阶段:
- 检查节点资源是否足够(CPU、内存)
- 检查节点是否满足 Pod 的亲和性/反亲和性规则
- 检查节点是否有污点而 Pod 是否有相应容忍
- 检查端口冲突等
- 打分阶段:
- 对通过过滤的节点进行评分(0-10 分)
- 考虑因素包括:资源平衡、亲和性得分、数据局部性等
- 选择节点:选择得分最高的节点
- 绑定:通过 API Server 更新 Pod 的 nodeName 字段
二、调度策略详解
1. 预选策略 (Predicates)
- PodFitsResources:检查节点资源是否满足
- PodFitsHostPorts:检查请求的 HostPort 是否可用
- MatchNodeSelector:检查节点标签匹配
- CheckVolumeBinding:检查卷绑定情况
- NoDiskConflict:检查存储卷冲突(已弃用)
- PodToleratesNodeTaints:检查污点容忍
2. 优选策略 (Priorities)
- LeastRequestedPriority:优先选择请求资源少的节点
- BalancedResourceAllocation:平衡 CPU 和内存使用
- NodeAffinityPriority:节点亲和性权重
- TaintTolerationPriority:污点容忍权重
- ImageLocalityPriority:优先选择已有所需镜像的节点
三、常用命令
1. 查看 Scheduler 状态
1 | kubectl get componentstatuses scheduler |
2. 查看 Scheduler Pod
1 | kubectl get pods -n kube-system -l component=kube-scheduler |
3. 查看调度日志
1 | kubectl logs -n kube-system <scheduler-pod-name> |
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 | apiVersion: kubescheduler.config.k8s.io/v1beta2 |
2. 多调度器配置
1 | apiVersion: v1 |
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. 调度器性能问题
1 | # 查看调度延迟 |
3. 节点资源不足
1 | kubectl describe node <node-name> | grep -A 10 Allocatable |
七、最佳实践(来自 Udemy 课程)
- 合理设置资源请求和限制:帮助调度器做出更好决策
- 使用亲和性/反亲和性规则:控制 Pod 分布
- 使用污点和容忍:专用节点管理
- 监控调度延迟:确保调度性能
- 考虑 Pod 优先级:重要 Pod 优先调度
- 使用 PodTopologySpread:实现 Pod 拓扑分布
八、调试技巧
- 模拟调度:
1 | kubectl create -f pod.yaml --dry-run=server |
- 查看调度器决策:
1 | kubectl get events --sort-by=.metadata.creationTimestamp |
- 检查节点容量:
1 | kubectl describe nodes | grep -A 5 Capacity |
- 检查调度器指标:
1 | kubectl proxy & |