4. 调度策略配置实战:通过YAML配置节点选择器、亲和性规则与污点容忍

在Kubernetes集群中,Pod的调度并非随机分配,而是由调度器根据一系列策略决定。本章聚焦于三种最核心的调度控制手段:节点选择器(nodeSelector)、节点亲和性(NodeAffinity)与污点容忍(Taints & Tolerations)。通过YAML配置实战,你将掌握如何精准控制Pod的调度目标,并为后续的配置漂移审计打下策略基线。

核心认知: nodeSelector 是“硬性必须”的简单标签匹配;NodeAffinity 提供“必须”与“偏好”两种语义;Taints & Tolerations 则是一种“排斥-容忍”机制,用于阻止或允许Pod调度到特定节点。
节点选择器、亲和性与污点容忍决策流程 调度策略决策流程:从 nodeSelector 到 Tolerations Pod 调度请求 nodeSelector 标签匹配 节点亲和性规则评估 节点污点容忍检查 调度至目标节点 策略执行顺序 1. nodeSelector(硬匹配) 2. NodeAffinity(硬/软) 3. Taints & Tolerations

4.1 节点选择器(nodeSelector):最简单的标签约束

nodeSelector 是 Pod 规范中最直接的调度约束。它要求目标节点必须包含 Pod 中指定的所有标签键值对。如果集群中没有节点满足这些标签,Pod 将处于 Pending 状态。

4.1.1 实战配置

以下 YAML 片段展示了一个要求节点必须包含 disktype: ssd 标签的 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-ssd
spec:
  nodeSelector:
    disktype: ssd
  containers:
  - name: nginx
    image: nginx:1.25
审计要点: nodeSelector 的配置漂移通常表现为标签被误删除或修改。建议在 Prometheus 中设置 kube_node_labels 指标的告警,监控关键调度标签的存在性。

4.2 节点亲和性(NodeAffinity):灵活且强大的调度规则

节点亲和性提供了比 nodeSelector 更丰富的表达能力,支持两种语义:

  • requiredDuringSchedulingIgnoredDuringExecution:硬性要求,调度时必须满足,类似 nodeSelector 但支持更复杂的表达式。
  • preferredDuringSchedulingIgnoredDuringExecution:软性偏好,调度器会尽量满足,但不保证。

4.2.1 实战配置:硬性亲和性 + 软性偏好

apiVersion: v1
kind: Pod
metadata:
  name: nginx-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values:
            - us-east-1a
            - us-east-1b
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 80
        preference:
          matchExpressions:
          - key: instance-type
            operator: In
            values:
            - high-cpu
  containers:
  - name: nginx
    image: nginx:1.25
字段 说明 调度影响
requiredDuringScheduling... 节点必须属于 us-east-1a 或 us-east-1b 可用区 不满足则 Pod 无法调度
preferredDuringScheduling... 偏好节点具有 instance-type=high-cpu 标签 权重 80,调度器优先选择,但不强制
配置漂移风险: 亲和性规则中的 operator 和 values 容易被误修改。例如将 In 改为 NotIn 会导致调度行为完全反转。审计时应重点对比 matchExpressions 的变更。

4.3 污点与容忍(Taints & Tolerations):节点级别的排斥机制

污点(Taint)是节点的一种属性,用于排斥不满足条件的 Pod。Pod 必须设置对应的容忍(Toleration)才能调度到带有污点的节点上。污点有三种效果:

  • NoSchedule:不调度新的 Pod 到该节点。
  • PreferNoSchedule:尽量不调度,但不强制。
  • NoExecute:不仅不调度新 Pod,还会驱逐节点上已有的不匹配 Pod。

4.3.1 实战配置:节点污点 + Pod 容忍

首先为节点添加污点:

kubectl taint nodes node1 dedicated=gpu:NoSchedule

然后配置 Pod 容忍该污点:

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "gpu"
    effect: "NoSchedule"
  containers:
  - name: gpu-container
    image: nvidia/cuda:12.0-base
污点与容忍匹配逻辑 污点容忍匹配逻辑:Key、Value、Effect 全匹配 节点污点 key=dedicated value=gpu, effect=NoSchedule Pod 容忍 key=dedicated value=gpu, effect=NoSchedule Key/Value/Effect 全匹配 → 允许调度 key=dedicated, value=gpu effect=NoExecute key=dedicated, value=gpu effect=NoSchedule Effect 不匹配 → 拒绝调度

4.4 策略组合与优先级

在实际生产环境中,这三种策略通常组合使用。调度器按以下顺序评估:

  1. nodeSelector:先过滤出标签完全匹配的节点。
  2. NodeAffinity required:进一步过滤满足硬性亲和性规则的节点。
  3. NodeAffinity preferred:对剩余节点进行打分排序。
  4. Taints & Tolerations:最后检查节点污点,只有 Pod 容忍所有污点才能调度。
审计最佳实践: 在 Prometheus 中,通过 kube_pod_spec_node_selector、kube_pod_spec_affinity 和 kube_pod_spec_tolerations 指标可以持续监控调度策略的配置状态。结合 kube_node_taints 指标,可以快速发现策略不匹配导致的调度失败。

4.5 配置漂移审计清单

策略类型 审计指标 常见漂移场景
nodeSelector kube_pod_spec_node_selector 标签被删除、键值对修改
NodeAffinity kube_pod_spec_affinity operator 变更、values 列表增减、权重调整
Tolerations kube_pod_spec_tolerations effect 修改、key/value 变更、容忍被移除