温馨提示×

centos上k8s如何进行资源调度

小樊
37
2025-12-23 16:54:42
栏目: 智能运维

在 CentOS 上,Kubernetes 的资源调度由调度器 kube-scheduler 主导,结合节点资源、亲和/反亲和、污点与容忍、配额与 QoS 等机制共同决定 Pod 落在何处以及如何在集群内均衡负载。

核心概念与调度流程

  • 调度器职责:kube-scheduler 为每个未绑定的 Pod 选择一个最合适的节点,流程分为两步:
    1. 过滤 Filter:剔除不满足资源与约束的节点(如资源不足、节点选择器/亲和性不匹配、污点不容忍等);
    2. 打分 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 widekubectl 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 过高)、亲和/反亲和规则不匹配、污点不容忍、节点选择器不匹配。
  • 节点资源紧张导致驱逐
    • 核查 QoSlimits,为关键业务设置 requests≈limits 并提升 QoS 等级;必要时调整驱逐阈值与优先级策略。
  • 拓扑或亲和规则冲突
    • 复核 topologySpreadConstraints、podAntiAffinitytopologyKey 与副本数是否可满足;检查节点标签是否正确。

0