Kubernetes 集群里最常见的两类问题:多个副本被调度到同一节点,节点故障时整个服务集体下线;节点资源分配不均,高负载节点拖垮全链路。前者是调度策略问题,后者是 Pod 韧性设计问题。本文从节点亲和性、Pod 反亲和性、污点容忍、拓扑分布约束、探针与 PodDisruptionBudget 六个方面给出可直接部署的配置。
节点亲和性调度:把Pod调度到指定节点
nodeAffinity 控制 Pod 只调度到满足标签条件的节点,GPU 任务、专用存储节点这类场景直接适用:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/gpu
operator: Exists
required 是硬约束,找不到节点 Pod 一直 Pending;preferred 是软约束,调度器尽力满足,适合资源优化类需求。
Pod反亲和性:副本分散到不同节点
多个副本落在同一节点,节点一故障整个集群同时下线。用 podAntiAffinity 按主机维度分散副本:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels:
app: web
required 硬约束在副本数超过节点数时会直接 Pending,生产环境优先用 preferred,副本分散同时保留调度柔性。
污点与容忍:隔离异常节点
节点出现异常或进入维护期时,直接给节点打污点,新的 Pod 不再调度上去;需要专用节点承接任务时,Pod 用 toleration 显式声明。示例:kubectl taint node node1 role=critical:NoSchedule。节点修复后 kubectl taint node node1 role=critical- 移除污点,集群自动恢复正常调度。
拓扑分布约束:副本跨可用区均匀分布
topologySpreadConstraints 比反亲和更精细,把副本均摊到多个可用区或节点,跨可用区部署时配合使用:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: web
maxSkew=1 表示任意两个区之间的副本数差不超过 1。集群规模小时调度器可能没有足够节点满足约束,whenUnsatisfiable 可放宽为容忍偏差。
Pod韧性设计:探针、资源配额与PDB
Pod 韧性不等于启动成功:
- readinessProbe 就绪前不接入流量,发布过程无中断。
- livenessProbe 检测死锁,自动重启恢复。
- resources.requests/limits 控制共享节点的资源竞争。
- PodDisruptionBudget 保证维护期可用副本数下限,节点驱逐时服务不中断。
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: web-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: web
验证调度与韧性配置
部署后依次验证:kubectl get pods -o wide 查看副本节点分布;kubectl describe node 查看资源水位;kubectl drain node 演练节点维护,观察 Pod 迁移与 PDB 生效情况。调度与韧性配置在演练中验证,比故障发生时发现更有价值。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-rong-qi-bian-pai-shi-zhan-qin-he-xing-diao-du-yu/