调度器简介
学习目标
- 理解 Kubernetes 调度器的作用和工作原理
- 掌握调度过程的各个阶段
- 了解默认调度策略
核心概念
一句话解释
kube-scheduler 负责将未调度的 Pod 分配到合适的 Node 上运行。
调度流程
┌─────────────────────────────────────────────────────────────┐
│ kube-scheduler │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 过滤 │ -> │ 打分 │ -> │ 绑定 │ -> │ 完成 │ │
│ │ Filter │ │ Score │ │ Bind │ │ Done │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ v v v │
│ 排除不满足 对候选节点 将 Pod 绑定 │
│ 条件的节点 进行评分 到最优节点 │
└─────────────────────────────────────────────────────────────┘
调度阶段详解
| 阶段 | 作用 | 示例 |
|---|---|---|
| 过滤 (Filter) | 排除不满足条件的节点 | 资源不足、节点选择器不匹配 |
| 打分 (Score) | 对剩余节点评分 | 资源均衡、亲和性偏好 |
| 绑定 (Bind) | 将 Pod 绑定到最高分节点 | 创建 Binding 对象 |
默认过滤条件
1. 资源检查
- CPU/Memory 请求是否能满足
2. 节点状态
- 节点是否 Ready
- 节点是否可调度 (Schedulable)
3. 污点容忍
- Pod 是否能容忍节点的污点
4. 端口冲突
- 主机端口是否已被占用
默认打分策略
1. LeastRequestedPriority
- 优先选择资源使用率低的节点
- 公式:(capacity - requested) / capacity * 10
2. BalancedResourceAllocation
- 优先选择 CPU 和 Memory 使用率均衡的节点
3. SelectorSpreadPriority
- 同一 Service/RC 的 Pod 尽量分散到不同节点
4. InterPodAffinityPriority
- 根据 Pod 亲和性/反亲和性打分
调度器配置示例
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
plugins:
score:
enabled:
- name: NodeResourcesBalancedAllocation
- name: NodeResourcesLeastAllocated
实践练习
练习 1:观察调度过程
# 创建一个 Pod 并观察调度
kubectl run test-pod --image=nginx
# 查看 Pod 被调度到哪个节点
kubectl get pod test-pod -o wide
# 查看调度事件
kubectl describe pod test-pod | grep -A 5 Events
练习 2:查看节点资源
# 查看节点资源使用情况
kubectl describe node <node-name> | grep -A 10 "Allocated resources"
# 查看节点上运行的 Pod
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node-name>
练习 3:模拟调度
# 使用 kubectl 模拟调度(dry-run)
kubectl run test-pod --image=nginx --dry-run=server -o yaml
# 查看调度器日志
kubectl logs -n kube-system -l component=kube-scheduler
调度器扩展点
┌─────────────────────────────────────────────────────────┐
│ 调度框架扩展点 │
├─────────────────────────────────────────────────────────┤
│ PreFilter → 预处理和检查 │
│ Filter → 过滤不满足条件的节点 │
│ PostFilter → 过滤后处理(可抢占) │
│ PreScore → 打分前预处理 │
│ Score → 对节点打分 │
│ NormalizeScore → 标准化分数 │
│ Reserve → 预留资源(乐观绑定) │
│ Permit → 准入控制 │
│ PreBind → 绑定前操作 │
│ Bind → 执行绑定 │
│ PostBind → 绑定后清理 │
└─────────────────────────────────────────────────────────┘
常见问题
1. Pod 一直 Pending
# 检查调度失败原因
kubectl describe pod <pod-name> | grep -A 10 Events
# 常见原因:
# - 资源不足 (Insufficient cpu/memory)
# - 节点选择器不匹配 (NodeSelectorMismatch)
# - 污点不容忍 (TaintTolerationMismatch)
# - 节点不可调度 (NodeNotSchedulable)
2. 如何指定调度器
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
schedulerName: my-custom-scheduler # 指定自定义调度器
containers:
- name: app
image: nginx
小结
| 要点 | 说明 |
|---|---|
| kube-scheduler | 负责 Pod 调度的核心组件 |
| 过滤阶段 | 排除不满足条件的节点 |
| 打分阶段 | 对候选节点评分选择最优 |
| 绑定阶段 | 将 Pod 绑定到选定节点 |
| 默认策略 | 资源均衡、负载分散 |
练习编辑器
bash
Loading...