71·调度与资源进阶

调度器简介

kubernetesschedulerscheduling

调度器简介

学习目标

  1. 理解 Kubernetes 调度器的作用和工作原理
  2. 掌握调度过程的各个阶段
  3. 了解默认调度策略

核心概念

一句话解释

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...

继续学习

完成本课后,建议继续学习下一课「节点选择器」 以巩固所学知识。