Day 16 - 调度策略与亲和性
📘 Day 16:调度策略与亲和性
🎯 今日目标
- 用 nodeSelector 做简单节点选择
- 用 nodeAffinity 做高级节点亲和
- 用 podAffinity 让 Pod 靠近部署
- 用 podAntiAffinity 让 Pod 分散部署
- 用 topologySpreadConstraints 做均匀分布
🧠 理论精讲(30 分钟)
调度策略对比
| 策略 | 作用范围 | 强制/偏好 | 典型场景 |
|---|---|---|---|
| nodeSelector | 节点标签 | 强制 | 简单:GPU 节点 |
| nodeAffinity | 节点标签 | 可偏好 | 复杂:优先 SSD,可退而求其次 |
| podAffinity | Pod 标签 | 可偏好 | 缓存靠近应用 |
| podAntiAffinity | Pod 标签 | 可偏好 | 高可用:同一服务分散 |
| Taint/Toleration | 节点污点 | 排斥/许可 | 专用节点 |
| topologySpreadConstraints | 拓扑域 | 强制 | 跨可用区均匀分布 |
nodeAffinity 字段
1 | affinity: |
运算符
| 操作符 | 含义 |
|---|---|
In |
在列表中 |
NotIn |
不在列表中 |
Exists |
存在此标签 |
DoesNotExist |
不存在此标签 |
Gt |
大于(数值) |
Lt |
小于(数值) |
🔧 动手实操(120 分钟)
练习 16.1:nodeSelector
1 | # 1. 给节点打标签 |
练习 16.2:nodeAffinity
1 | cat <<EOF | kubectl apply -f - |
练习 16.3:podAffinity(靠近部署)
1 | # 场景:缓存 Pod 和 应用 Pod 部署在同一节点 |
练习 16.4:podAntiAffinity(分散部署)
1 | # 场景:高可用 Web 服务分散到不同节点 |
练习 16.5:topologySpreadConstraints
1 | # 按可用区均匀分布 |
🐛 排错练习(30 分钟)
场景:Pod 一直 Pending(调度失败)
1 | # 排查清单: |
🏆 赛题模拟(40 分钟)
⚠️ 严格限时 35 分钟
题目:高级调度策略
1 | 【初始环境】3 节点集群 |
📋 命令速查
| 命令 | 功能 | 注解 |
|---|---|---|
kubectl label node <node> key=value |
给节点打标签 | 配合 nodeSelector 使用,Pod 通过 nodeSelector 精确匹配 |
kubectl label node <node> key- |
删除节点标签 | 标签名后加 - |
kubectl get nodes --show-labels |
查看节点和标签 | 确认标签是否打对 |
kubectl get nodes -l key=value |
按标签筛选节点 | -l = --selector,快速找到匹配标签的节点 |
kubectl taint node <node> key=value:NoSchedule |
添加污点(硬排斥) | 无对应 Toleration 的 Pod 无法调度 |
kubectl taint node <node> key=value:PreferNoSchedule |
添加软污点 | 尽量不调度,资源不足时仍可调度 |
kubectl taint node <node> key=value:NoExecute |
添加驱逐级污点 | 已有 Pod 若未容忍也会被驱逐 |
kubectl taint node <node> key=value:NoSchedule- |
移除污点 | 末尾加 - 删除对应 Taint |
kubectl describe node <node> | grep Taints |
查看节点污点 | 排错时确认节点是否有预期外的污点 |
kubectl cordon <node> |
标记节点不可调度 | 等同于添加 node.kubernetes.io/unschedulable:NoSchedule |
kubectl uncordon <node> |
恢复节点可调度 | 取消 cordon 标记 |
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data |
安全驱逐节点上所有 Pod | 节点维护必需;DaemonSet Pod 需 –ignore-daemonsets 跳过 |
kubectl top nodes |
查看节点资源用量 | 调度决策参考;需安装 metrics-server |
kubectl get pods -o wide | grep <node> |
查看某节点上的所有 Pod | 替代 --field-selector=spec.nodeName=<node> |
📚 参考来源
| 来源 | 链接 / 说明 |
|---|---|
| Kubernetes 官方:调度与驱逐 | https://kubernetes.io/docs/concepts/scheduling-eviction/ |
| Kubernetes 官方:节点亲和性 | https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity |
| Kubernetes 官方:污点与容忍 | https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ |
| Kubernetes 官方:Pod 拓扑分布约束 | https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/ |
| Kubernetes 官方:安全驱逐节点 | https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/ |