温馨提示×

CentOS环境下Kubernetes的资源调度策略

小樊
44
2026-01-08 06:08:52
栏目: 智能运维

CentOS 环境下 Kubernetes 资源调度策略

一 调度流程与核心机制

  • 调度器通过 Informer/List-Watch 监听 API Server,筛选 spec.nodeName==“” 的待调度 Pod,进入调度队列。
  • 调度周期(Scheduling Cycle):依次执行 QueueSort → PreFilter → Filter → PostFilter(抢占) → PreScore → Score → Reserve → Permit
  • 绑定周期(Binding Cycle):执行 PreBind → Bind → PostBind,将 Pod 绑定到目标 Node(设置 spec.nodeName)。
  • 关键插件举例:
    • Filter:NodeResourcesFit、NodeAffinity、TaintToleration、PodTopologySpread、VolumeBinding、NodePorts
    • Score:NodeResourcesBalancedAllocation、ImageLocality、InterPodAffinity、TaintToleration、NodeAffinity、PodTopologySpread
  • 节点最终得分计算:各 Score 插件分数(0–100)× 插件权重后加权求和,选择总分最高节点。
  • 注意:Pod.spec.nodeName 可强制指定节点并绕过调度器,不做资源过滤与检查。

二 常用调度策略与配置要点

  • 资源请求与限制
    • 为容器设置合理的 requests/limits,requests 参与调度时资源匹配,limits 用于运行时限制;CPU 为可压缩资源,内存 为不可压缩资源(不足会触发 OOM)。
    • 示例:
      • resources.requests.cpu: 1000m;resources.limits.cpu: 2000m
      • resources.requests.memory: 1Gi;resources.limits.memory: 2Gi
  • 节点选择与亲和反亲和
    • nodeSelector:按节点标签精确匹配。
    • nodeAffinity:支持 requiredDuringSchedulingIgnoredDuringExecution(硬约束)与 preferredDuringSchedulingIgnoredDuringExecution(软约束)。
    • podAffinity/podAntiAffinity:按 Pod 标签实现同/反亲和,可配合 topologyKey(如 kubernetes.io/hostname)控制分布域。
  • 污点与容忍
    • 节点 taints(如 NoSchedule/NoExecute)配合 tolerations 控制 Pod 能否调度到带污点节点,常用于 master 隔离与专用节点池。
  • 拓扑分布与端口/卷绑定
    • PodTopologySpread:跨 拓扑域(节点/机架/可用区)均衡分布副本。
    • NodePorts:检查节点端口冲突。
    • VolumeBinding:结合 PV/PVC拓扑 进行卷绑定与延迟绑定。
  • 调度权重与策略调优
    • 通过 KubeSchedulerConfiguration 调整 Score 插件权重,影响节点排序。例如将 InterPodAffinity 权重调高到 100,可显著增强“同域优先/互斥”的调度倾向。

三 集群维度资源治理

  • ResourceQuota:限制 Namespace 内总 requests/limits存储对象数量,防止资源被单一命名空间耗尽。
    • 示例:
      • 计算资源:requests.cpu 1000m、requests.memory 1000Mi、limits.cpu 2000m、limits.memory 2000Mi
      • 存储资源:requests.storage 10Gi
      • 对象数量:如 pods、services、configmaps 等上限
  • LimitRange:为 Namespace 内未显式设置资源的 Pod/Container 提供默认 requests/limits 与取值约束,避免“无请求”导致调度与资源争用异常。

四 弹性伸缩与调度联动

  • Horizontal Pod Autoscaler(HPA):基于 CPU/内存 或自定义指标自动扩缩 Pod 副本数,提升资源利用与稳定性。
  • Cluster Autoscaler:当节点资源紧张或存在 Pending Pod 时,自动扩容 Node,与调度器协同减少排队。
  • 建议与监控:结合 Prometheus + Grafana 观测 节点/容器 资源使用,配合 日志(如 EFK/ELK)定位调度失败与资源瓶颈。

五 快速排障与最佳实践

  • 排查 Pending
    • 使用 kubectl describe pod -n 查看 Events(如资源不足、亲和/污点不匹配、端口冲突、卷绑定失败)。
    • 使用 kubectl get nodes -o widekubectl top nodes/pods 检查资源余量与分配。
  • 常见修复:
    • 调整 requests/limits 或增加节点资源;修正 nodeSelector/nodeAffinity/podAntiAffinity;为节点添加/调整 taints/tolerations;优化 PodTopologySpreadtopologyKeywhenUnsatisfiable
  • 不建议绕过调度器:避免使用 spec.nodeName 做常规调度;若必须使用,务必自行保证资源与约束的正确性。
  • 调度器调优:通过 KubeSchedulerConfiguration 调整 Score 插件权重,验证对 Pod 分布与资源均衡的实际影响。

0