在 CentOS 上,Kubernetes 的资源调度由调度器 kube-scheduler 主导,结合节点资源、亲和/反亲和、污点与容忍、配额与 QoS 等机制共同决定 Pod 落在何处以及如何在集群内均衡负载。
核心概念与调度流程
- 调度器职责:kube-scheduler 为每个未绑定的 Pod 选择一个最合适的节点,流程分为两步:
- 过滤 Filter:剔除不满足资源与约束的节点(如资源不足、节点选择器/亲和性不匹配、污点不容忍等);
- 打分 Score:对候选节点按策略评分并选出最优节点进行绑定。
- 调度依据:以容器的 requests/limits 为主,结合节点标签、亲和/反亲和、污点/容忍、拓扑分布等策略实现精细化调度。
- 服务质量 QoS:依据 requests/limits 将 Pod 分为 Guaranteed / Burstable / BestEffort,在节点资源紧张时影响驱逐顺序与稳定性。
在 CentOS 上的落地步骤
- 为节点打标签与划分资源池:给节点打上业务或机型标签(如 disktype=ssd、zone=cn-beijing-1a、gpu=true),便于后续按标签定向调度。
- 查看节点:
kubectl get nodes --show-labels
- 打标签:
kubectl label nodes <node-name> disktype=ssd zone=cn-beijing-1a
- 设置污点与容忍,构建专用/隔离节点池:
- 专用 GPU 节点:
kubectl taint nodes <node-name> accelerator=gpu:NoSchedule
- 容忍示例(Pod spec):
- tolerations:
- key: “accelerator”
operator: “Equal”
value: “gpu”
effect: “NoSchedule”
- 为工作负载配置调度策略:在 Pod/Deployment 中使用 nodeSelector / nodeAffinity / podAffinity&podAntiAffinity / 拓扑分布约束 实现“定向投放、分散部署、降低跨域通信”。
- 设置资源请求与限制,保障调度与稳定性:为容器设置 requests/limits,让调度器基于 requests 选择节点,并避免个别 Pod 超额占用。
- 命名空间级配额与默认约束:用 ResourceQuota 限制命名空间总资源,用 LimitRange 设置默认 requests/limits 与取值范围,防止滥用。
- 验证与观测:
- 查看调度结果:
kubectl get pod <pod> -o wide、kubectl describe pod <pod>(Events 会提示调度失败原因,如资源不足、污点不容忍等)
- 观测指标:部署 Metrics Server + Prometheus/Grafana,结合 HPA 做弹性伸缩。
关键配置示例
- Pod 资源请求与限制(requests/limits)
- 作用:requests 用于调度;limits 用于运行时上限(CPU 可压缩、内存不可压缩)。
- 示例:
- resources:
- requests:
- cpu: “250m”
- memory: “64Mi”
- limits:
- cpu: “500m”
- memory: “128Mi”
- 节点亲和性与反亲和性
- 作用:将协同服务尽量靠近(减少网络时延),或将关键服务分散到不同节点/故障域(提升可用性)。
- 示例:
- affinity:
- nodeAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values: [“ssd”]
- podAntiAffinity:
- preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values: [“frontend”]
topologyKey: kubernetes.io/hostname
- 污点与容忍(专用节点)
- 作用:为 GPU/高性能/维护 等场景预留节点。
- 示例:
-
节点:
- kubectl taint nodes dedicated=gpu:NoSchedule
-
Pod:
- tolerations:
- key: “dedicated”
operator: “Equal”
value: “gpu”
effect: “NoSchedule”
- 拓扑分布约束(跨故障域打散)
- 作用:在 zone/rack/node 等拓扑域上均匀分布副本,提升容错。
- 示例:
- topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: myapp
- 命名空间配额与默认限额
- 作用:多租户/团队资源治理。
- 示例:
- ResourceQuota(命名空间级总配额):
- hard:
- requests.cpu: “4”
- requests.memory: “8Gi”
- limits.cpu: “8”
- limits.memory: “16Gi”
- LimitRange(默认/范围):
- default:
- cpu: “100m”
- memory: “128Mi”
- defaultRequest:
- cpu: “100m”
- memory: “128Mi”
调度优化与弹性扩缩
- 负载感知与热点打散:基于节点真实负载进行调度,并将热点节点上的负载打散,避免单点过载。
- 批量作业调度:对 MPI/Spark/AI 训练 等协同任务使用 Gang Scheduling(全量一起调度) 与 Capacity Scheduling(容量预留+共享)。
- 拓扑感知调度:对 CPU/GPU/NUMA 敏感的工作负载,将 Pod 固定在合适的 CPU 核心/GPU 卡与 NUMA 域,减少跨域访存与抖动。
- QoS 与性能优化:启用 CPU Burst 缓解限流、提升突发性能;结合 优先级与抢占 保障关键业务在资源紧张时可获得资源。
- 自动伸缩:
- HPA:基于 CPU/内存/自定义指标 自动扩缩副本数;
- Cluster Autoscaler:基于节点资源压力自动增减节点,配合调度策略提升整体利用率。
常见排错清单
- Pod 无法调度(Pending):
- 使用
kubectl describe pod <pod> 查看 Events,常见原因包括:节点资源不足(requests 过高)、亲和/反亲和规则不匹配、污点不容忍、节点选择器不匹配。
- 节点资源紧张导致驱逐:
- 核查 QoS 与 limits,为关键业务设置 requests≈limits 并提升 QoS 等级;必要时调整驱逐阈值与优先级策略。
- 拓扑或亲和规则冲突:
- 复核 topologySpreadConstraints、podAntiAffinity 的 topologyKey 与副本数是否可满足;检查节点标签是否正确。