Kubernetes 在 Debian 上的资源调度优化
一 基础与内核优化
- 关闭或谨慎使用 Swap:Kubernetes 调度与 kubelet 驱逐逻辑对内存压力敏感,建议生产环境关闭 Swap,或仅保留极小的 swap 并配合驱逐阈值使用。
- 内核网络与内存参数:在 /etc/sysctl.conf 中优化网络与内存回收相关参数(如 vm.swappiness、net.core.somaxconn、net.ipv4.ip_local_port_range 等),提升连接承载与内存紧张时的回收效率。
- 容器运行时与网络:优先使用 containerd 等轻量运行时;选择与业务匹配的 CNI(如 Calico/Flannel/Weave),并校准 MTU,减少分片与抖动。
- 操作系统选择:使用 Debian 12 可获得较新的内核与稳定基础,利于容器与网络栈的性能与兼容性。
二 调度策略与拓扑分布
- 节点亲和/反亲和:用 nodeAffinity 将负载调度到具备特定标签的节点(如 SSD、GPU);用 podAntiAffinity 将同一应用的副本分散到不同节点,提升容灾。
- 污点与容忍:为专用节点(如 GPU、高内存)设置 taints,仅允许声明 tolerations 的工作负载调度,避免资源争用。
- 拓扑分布约束:通过 topologySpreadConstraints 按 zone/rack/hostname 均匀分布 Pod,控制最大不均衡度(maxSkew),增强可用性与资源利用的均衡。
- 调度器扩展与策略:基于 Scheduling Framework 启用或调整打分插件(如 NodeResourcesBalancedAllocation),让资源余量与均衡性在打分中占更高权重,减少热点与碎片。
三 资源配置与 QoS
- 合理设置 Requests/Limits:Requests 用于调度与保障,Limits 为上限;示例:
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "1"
- QoS 影响驱逐与稳定性:
- Guaranteed(requests == limits):驱逐优先级最低,适合核心有状态服务。
- Burstable(requests < limits):中等优先级,适合常规业务。
- BestEffort(未设 requests/limits):驱逐优先级最高,仅用于测试。
- 命名空间级约束:用 LimitRange 设置默认/最大/最小 Requests/Limits;用 ResourceQuota 限制 requests.cpu/requests.memory/limits.cpu/limits.memory 的总量,防止租户/团队超额占用。
- 节点资源预留:通过 kubelet 为系统组件与内核预留资源,避免节点级不稳定:
kubelet --system-reserved=cpu=500m,memory=1Gi \
--kube-reserved=cpu=200m,memory=512Mi
四 弹性扩缩与专用硬件
五 监控 驱逐与常见排障
- 监控与可视化:部署 Prometheus + Grafana 持续观测 节点资源使用率、Pod 请求/限制命中、调度失败与驱逐事件,以数据驱动调参与策略迭代。
- 节点压力与驱逐:启用 kubelet 驱逐阈值(如 –eviction-hard/memory.available 等),在内存/磁盘压力时有序驱逐低优先级 Pod,保障节点稳定性。
- 碎片治理:对负载不均或资源碎片,使用 Descheduler 定期“重平衡” Pod 分布,提升装箱率与稳定性。
- 快速排障清单:
- Pod Pending:检查节点资源是否不足、ResourceQuota/LimitRange、亲和/污点/拓扑约束是否阻断调度。
- OOMKilled:适当提高 requests.memory 或优化应用内存;确认 QoS 与驱逐阈值设置是否合理。
- 负载不均:结合亲和/反亲和、topologySpreadConstraints 与 Descheduler 优化分布。