4. Kubernetes 调度与资源分配:调度器工作原理、节点资源分配策略、Pod优先级与抢占

4.1 调度器工作原理:从 Pod 到 Node 的决策链路

Kubernetes 调度器(kube-scheduler)是控制平面中负责将待调度 Pod 绑定到合适 Node 的核心组件。其工作本质是一个“过滤-打分-绑定”的三阶段决策过程,确保集群资源的高效利用与负载均衡。

核心调度流程: 调度器通过 Predicates(过滤) 排除不满足条件的节点,再通过 Priorities(打分) 对剩余节点排序,最终选择最优节点执行绑定。
Kubernetes 调度器三阶段工作流程 阶段1:过滤 Predicates 阶段2:打分 Priorities 阶段3:绑定 Bind 常见过滤规则 • PodFitsResources • PodFitsHostPorts • NodeSelectorMatch • NodeAffinity/taint • PodAntiAffinity 常见打分策略 • LeastRequestedPriority • BalancedResourceAllocation • NodeAffinityPriority • TaintTolerationPriority • ImageLocalityPriority 绑定操作 1. 更新 Pod 的 NodeName 字段 2. 写入 etcd 3. kubelet 监听到 后启动容器

4.2 节点资源分配策略:Request 与 Limit 的博弈

Kubernetes 通过 Request(请求量) 和 Limit(上限) 两个维度管理容器资源。调度器基于 Pod 的 Request 值进行调度决策,而 kubelet 则通过 QoS(服务质量) 等级在节点层面进行资源争抢时的回收策略。

QoS 等级 条件 资源回收优先级 典型场景
Guaranteed 所有容器 Request == Limit 最低(最不易被驱逐) 数据库、核心中间件
Burstable 至少一个容器 Request < Limit 中等 Web 服务、API 网关
BestEffort 所有容器未设置 Request/Limit 最高(最先被驱逐) 批处理、CI/CD 任务
成本优化提示: 过度设置 Request 会导致节点资源碎片化,降低装箱率;而 Limit 设置过高则可能引发节点过载。建议对稳定负载使用 Guaranteed 等级,对弹性负载使用 Burstable,对可中断任务使用 BestEffort。

4.3 Pod 优先级与抢占:保障关键业务的调度特权

当集群资源紧张时,高优先级 Pod 可以 抢占(Preempt) 低优先级 Pod 的资源。Kubernetes 通过 PriorityClass 定义优先级,数值越大优先级越高。

4.3.1 PriorityClass 定义与使用

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000                # 优先级数值
globalDefault: false          # 是否设为集群默认
description: "用于生产核心服务"
---
apiVersion: v1
kind: Pod
metadata:
  name: critical-pod
spec:
  priorityClassName: high-priority
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "512Mi"
        cpu: "500m"
      limits:
        memory: "1Gi"
        cpu: "1"

4.3.2 抢占流程与避坑指南

Pod 抢占流程与关键节点 1. 调度失败 2. 寻找牺牲者 3. 驱逐低优 Pod 4. 绑定高优 Pod 抢占避坑指南 • 抢占只发生在调度阶段,不会驱逐正在运行的 Pod(除非节点资源不足触发节点级驱逐) • 被驱逐的 Pod 会记录 Preemption 事件,可通过 kubectl describe pod 查看 • 建议将关键系统组件(如 CoreDNS、ingress-controller)设为高优先级,避免被抢占

4.4 调度策略与成本分摊的关联

调度策略直接影响集群的资源利用率和成本分摊精度:

  • 装箱率优化: 使用 MostRequestedPriority 或自定义调度器将 Pod 集中调度,提高节点利用率,降低单位 Pod 的节点成本。
  • 资源碎片控制: 避免 Request 与节点可分配资源不匹配导致的碎片,建议使用 NodeResourcesFit 插件进行精细过滤。
  • 优先级与成本权重: 高优先级 Pod 通常对应核心业务,在成本分摊模型中应分配更高的权重系数。
注意: 抢占虽然能保障高优 Pod 运行,但频繁抢占会导致低优 Pod 反复重建,增加调度开销和资源浪费。建议结合 Cluster Autoscaler 动态扩缩节点,减少对抢占的依赖。

4.5 调度器扩展:自定义调度策略

Kubernetes 支持通过 Scheduler Framework 扩展调度器行为,实现企业级成本优化调度:

扩展点 作用阶段 典型应用
PreFilter 过滤前 检查 Pod 是否满足全局配额
Filter 过滤 自定义节点过滤逻辑(如 GPU 型号)
PreScore 打分前 运行预计算,缓存中间结果
Score 打分 自定义成本权重打分(如按 Spot 实例价格)
Reserve 绑定前 预留资源,防止并发冲突
Permit 绑定前 等待外部审批或资源预算检查
FinOps 实践: 在 Score 扩展点中,可以引入节点 Spot 实例折扣率、地域电价差异等成本因子,让调度器自动选择成本最优的节点,实现“成本感知调度”。