调度策略
约 641 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › K8s › 调度与资源(在新窗口打开) › 调度策略
NodeSelector
最简单的节点选择方式——通过标签匹配:
# 为节点添加标签
kubectl label node node1 disktype=ssdapiVersion: v1
kind: Pod
metadata:
name: ssd-pod
spec:
nodeSelector:
disktype: ssd
containers:
- name: app
image: nginx:alpine节点亲和性(nodeAffinity)
比 nodeSelector 更灵活的节点选择:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: # 硬要求
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
- nvme
preferredDuringSchedulingIgnoredDuringExecution: # 软偏好
- weight: 50
preference:
matchExpressions:
- key: zone
operator: In
values:
- us-east-1操作符:In / NotIn / Exists / DoesNotExist / Gt / Lt。
Pod 亲和性/反亲和性
控制 Pod 之间的部署关系:
spec:
affinity:
# Pod 亲和性:与同一机架上的 Web Pod 靠近
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: topology.kubernetes.io/zone
# Pod 反亲和性:避免同一节点上有多个 API Pod
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: api
topologyKey: kubernetes.io/hostname| 拓扑键 | 含义 |
|---|---|
kubernetes.io/hostname | 同一节点 |
topology.kubernetes.io/zone | 同一可用区 |
topology.kubernetes.io/region | 同一地域 |
Taint 与 Toleration
Taint 打在节点上(拒绝 Pod 调度),Toleration 加在Pod上(允许容忍)。
# 给节点添加污点
kubectl taint nodes node1 app=myapp:NoSchedule
# 查看节点污点
kubectl describe node node1 | grep Taint
# 删除污点
kubectl taint nodes node1 app=myapp:NoSchedule-# Pod 容忍污点
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
tolerations:
- key: "app"
operator: "Equal"
value: "myapp"
effect: "NoSchedule"
- key: "node.kubernetes.io/not-ready"
operator: "Exists"
tolerationSeconds: 300 # 300 秒后驱逐污点效果
| 效果 | 说明 |
|---|---|
NoSchedule | 不调度到该节点(已有 Pod 不受影响) |
PreferNoSchedule | 尽量不调度(软限制) |
NoExecute | 不调度 + 已有无容忍 Pod 被驱逐 |
系统默认污点
| 污点 | 触发条件 |
|---|---|
node.kubernetes.io/not-ready | 节点未就绪 |
node.kubernetes.io/unreachable | 节点不可达 |
node.kubernetes.io/disk-pressure | 磁盘压力 |
node.kubernetes.io/memory-pressure | 内存压力 |
node.kubernetes.io/out-of-disk | 磁盘空间不足 |
PodDisruptionBudget
保证自愿干扰时最少可用 Pod 数:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: api-pdb
spec:
minAvailable: 2 # 最少 2 个可用
# maxUnavailable: 1 # 或最多 1 个不可用
selector:
matchLabels:
app: api# 节点维护时 PDB 阻止 drain 操作
kubectl drain node1 --ignore-daemonsets
# 如果 drain 违反 PDB,操作会被阻止小结
| 调度方式 | 作用 |
|---|---|
nodeSelector | 简单节点标签匹配 |
nodeAffinity | 灵活节点选择(硬/软要求 + 多表达式) |
podAffinity | Pod 靠近部署 |
podAntiAffinity | Pod 分散部署 |
| Taint + Toleration | 节点排斥 + Pod 容忍 |
| PDB | 保证最小可用 Pod 数 |
topologyKey控制亲和性的拓扑范围(节点/区域/地域)。NoExecute污点会驱逐已有 Pod(除非有相应 Toleration)。- PDB 保护服务在节点维护或更新时保持可用。
