温馨提示×

Kubernetes在Debian上的资源调度策略

小樊
32
2025-11-29 08:54:52
栏目: 智能运维

Kubernetes 在 Debian 上的资源调度策略

一 调度流程与总体原则

  • 调度器通过 List-Watch 监听 API Server,为 spec.nodeName 为空 的 Pod 执行调度:先进行预选(过滤不满足条件的节点,如资源不足、亲和/污点不匹配),再进行优选(按策略为候选节点打分,如资源余量、亲和性、镜像本地性等),最后绑定节点并持久化到 etcd。该流程与操作系统无关,在 Debian 上与其它 Linux 发行版一致。默认倾向于将副本分散到不同节点以提升容错与资源均衡。理解该流程有助于正确设置 requests/limits、亲和性、污点与容忍 等关键参数。

二 核心调度策略与配置要点

  • 资源请求与限制
    • 为容器设置 requests(调度依据)与 limits(上限);CPU 为可压缩资源(超限会被限流),内存为不可压缩资源(超限可能被 OOMKilled)。未设置 requests 的 Pod 可能被调度到任何节点,负载升高时易引发资源争用与驱逐。建议结合压测为关键工作负载设置合理值,避免“无请求”导致的不确定调度与稳定性风险。
  • 节点选择
    • 使用 nodeSelector 按节点标签定向调度;使用 nodeAffinity 定义硬性/软性约束(如必须落在 disktype=ssd 的节点,或优先落在某类节点),实现更灵活的节点选择策略。
  • 亲和性与反亲和性
    • 通过 podAffinity/podAntiAffinity 控制 Pod 间的共置或分散。例如对 app=web 的副本设置 podAntiAffinity,以 topologyKey: kubernetes.io/hostname 将副本打散到不同节点,提升容灾能力。
  • 污点与容忍
    • 对专用节点(如 GPU、特殊硬件)打上 taint(如 key=value:NoSchedule),仅允许带有匹配 toleration 的 Pod 调度,从而实现节点隔离与专用化。
  • 拓扑分布约束
    • 使用 topologySpreadConstraintszone/机架/主机 等拓扑域约束 Pod 分布,设置 maxSkewwhenUnsatisfiable,实现跨域的均匀分布与高可用。
  • 调度器扩展与策略权重
    • 通过 调度框架(Scheduling Framework) 启用/调整打分插件,例如提升 NodeResourcesBalancedAllocation 的权重以优化节点资源均衡;在特殊场景可部署自定义调度器与默认调度器并存。

三 面向 Debian 的优化建议

  • 内核与网络
    • 适度优化 /etc/sysctl.conf(如 net.core.somaxconn、net.ipv4.tcp_tw_reuse、vm.swappiness 等)并 sysctl -p 生效;为 CNI 选择合适插件(如 Calico/Flannel/Weave),并根据网卡支持设置 MTU 1500/9000,降低网络抖动与丢包对调度与业务的影响。
  • 存储与节点标签
    • 优先使用本地 SSD/NVMe 或高性能存储,并为节点打上如 disktype=ssd、gpu=true 等标签,以便在调度阶段利用 nodeAffinity污点/容忍 精确控制放置。
  • 监控与自动扩缩
    • 部署 Prometheus + Grafana 观察节点与 Pod 的 CPU/内存/网络/磁盘 指标,结合 HPA(HorizontalPodAutoscaler) 基于 CPU/内存利用率 自动扩缩副本,缓解峰谷波动带来的调度压力。

四 快速配置示例

  • 节点标签与污点
    • 标记节点标签:kubectl label node node1 disktype=ssd
    • 专用 GPU 节点打污点:kubectl taint nodes node2 accelerator=nvidia:NoSchedule
  • 资源请求与限制
    • 示例容器片段:
      resources:
        requests:
          cpu: "1"
          memory: "2Gi"
        limits:
          cpu: "2"
          memory: "4Gi"
      
  • 节点亲和性与反亲和性
    • 示例:必须落在 ssd 节点,且同应用副本分散到不同主机
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disktype
                operator: In
                values: ["ssd"]
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values: ["web"]
            topologyKey: kubernetes.io/hostname
      
  • 污点容忍
    • 示例:允许调度到带 accelerator=nvidia:NoSchedule 的节点
      tolerations:
      - key: "accelerator"
        operator: "Equal"
        value: "nvidia"
        effect: "NoSchedule"
      
  • HPA(V2)
    • 示例:基于 CPU 70% 平均利用率,副本数 2–10
      apiVersion: autoscaling/v2
      kind: HorizontalPodAutoscaler
      metadata:
        name: web-hpa
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: web
        minReplicas: 2
        maxReplicas: 10
        metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 70
      
  • 调度器配置(启用资源均衡打分插件)
    • 示例:提升 NodeResourcesBalancedAllocation 权重
      apiVersion: kubescheduler.config.k8s.io/v1beta3
      kind: KubeSchedulerConfiguration
      profiles:
      - schedulerName: default-scheduler
        plugins:
          score:
            enabled:
            - name: NodeResourcesBalancedAllocation
              weight: 2
      
    应用方式:kubectl apply -f kube-scheduler-config.yaml,并在 kubelet 启动参数中通过 --config 指定该配置文件。

0