4. 调度策略配置实战:通过YAML配置节点选择器、亲和性规则与污点容忍
在Kubernetes集群中,Pod的调度并非随机分配,而是由调度器根据一系列策略决定。本章聚焦于三种最核心的调度控制手段:节点选择器(nodeSelector)、节点亲和性(NodeAffinity)与污点容忍(Taints & Tolerations)。通过YAML配置实战,你将掌握如何精准控制Pod的调度目标,并为后续的配置漂移审计打下策略基线。
核心认知: nodeSelector 是“硬性必须”的简单标签匹配;NodeAffinity 提供“必须”与“偏好”两种语义;Taints & Tolerations 则是一种“排斥-容忍”机制,用于阻止或允许Pod调度到特定节点。
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
4.4 策略组合与优先级
在实际生产环境中,这三种策略通常组合使用。调度器按以下顺序评估:
- nodeSelector:先过滤出标签完全匹配的节点。
- NodeAffinity required:进一步过滤满足硬性亲和性规则的节点。
- NodeAffinity preferred:对剩余节点进行打分排序。
- 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 变更、容忍被移除 |