K8s Pod 调度深度优化:节点亲和性、污点容忍与 Pod 优先级协同策略

1. 节点亲和性(Node Affinity)

控制 Pod 倾向性调度到特定节点,基于节点标签实现精准定位:

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:  # 硬亲和性(必须满足)
      nodeSelectorTerms:
      - matchExpressions:
        - key: topology.kubernetes.io/zone
          operator: In
          values: ["zone-a"]
    preferredDuringSchedulingIgnoredDuringExecution:  # 软亲和性(优先满足)
    - weight: 80
      preference:
        matchExpressions:
        - key: node-type
          operator: In
          values: ["gpu-accelerated"]

  • 硬亲和性:强制 Pod 调度到含 zone-a 标签的节点
  • 软亲和性:优先调度到含 gpu-accelerated 标签的节点(权重 80)

2. 污点与容忍(Taints & Tolerations)

通过 节点排斥机制 实现专用节点隔离:

# 节点添加污点(阻止非常规Pod调度)
kubectl taint nodes node01 special=true:NoSchedule

# Pod声明容忍
tolerations:
- key: "special"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"

  • 污点效果NoSchedule(禁止调度) / PreferNoSchedule(尽量避免)
  • 典型场景:GPU 节点只允许 AI 训练 Pod 调度

3. Pod 优先级(PriorityClass)

通过 抢占机制 保障关键业务资源:

# 定义优先级类
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: mission-critical
value: 1000000   # 优先级数值(0-10亿)
globalDefault: false

# Pod引用优先级
spec:
  priorityClassName: mission-critical

  • 高优先级 Pod 可 抢占 低优先级 Pod 的资源
  • 优先级数值越高,调度权重越大

三阶联动实战场景

目标:将 AI 推理服务精准调度到 GPU 节点,并确保资源抢占能力

步骤 1:节点准备
# 标记GPU节点
kubectl label nodes gpu-node01 accelerator=nvidia-tesla

# 添加防护污点
kubectl taint nodes gpu-node01 dedicated=ai:NoSchedule

步骤 2:PriorityClass 配置
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: ai-priority
value: 1000000

步骤 3:Pod 声明
apiVersion: v1
kind: Pod
metadata:
  name: ai-inference
spec:
  priorityClassName: ai-priority
  tolerations:
    - key: "dedicated"
      operator: "Equal"
      value: "ai"
      effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: accelerator
            operator: In
            values: ["nvidia-tesla"]
  containers:
  - name: inference-engine
    resources:
      limits:
        nvidia.com/gpu: 2


调度决策矩阵

调度机制 作用阶段 资源匹配逻辑
节点亲和性 预选 (Filtering) 排除不满足标签条件的节点
污点容忍 预选 (Filtering) 排除无法容忍污点的节点
Pod 优先级 优选 (Scoring) 按优先级数值排序调度队列
资源请求/限制 预选 (Filtering) 检查节点剩余资源是否满足 Pod 需求

最佳实践建议

  1. 亲和性组合策略

    • 硬亲和性 + 软亲和性组合使用,例如:
      $$ \text{强制区域约束} + \text{优选机型权重} $$
    • 避免过度使用硬亲和性导致调度失败
  2. 污点分级管理

    污点等级 Effect 使用场景
    绝对隔离 NoExecute 生产数据库节点
    调度隔离 NoSchedule GPU/FPGA 专用节点
    柔性隔离 PreferNoSchedule 开发测试环境节点
  3. 优先级设计原则

    • 优先级数值跨度建议 $\geq 1000$,避免小跨度导致频繁抢占
    • 关键业务优先级公式参考:
      $$ \text{PriorityValue} = 10^6 \times \text{SLA等级} + 10^3 \times \text{业务层级} $$
  4. 资源碎片优化
    结合 Descheduler 定期清理低优先级 Pod,释放资源碎片:

    apiVersion: "descheduler/v1alpha1"
    kind: "DeschedulerPolicy"
    strategies:
      "LowNodeUtilization":
        enabled: true
        params:
          nodeResourceUtilizationThresholds:
            thresholds:
              "cpu": 20
              "memory": 20
    

效能验证:通过调度成功率指标监控优化效果
$$ \text{Scheduling Success Rate} = \frac{\text{成功调度Pod数}}{\text{总创建Pod数}} \times 100% $$
目标值应 $\geq 99.5%$(生产环境 SLA 标准)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐