一、前提场景

在 Kubernetes(K8s)集群中,单个节点 CPU 占用过高是一个常见但影响较大的问题,往往会导致节点资源耗尽、Pod 调度失败、服务响应延迟甚至节点不可用。该问题的根本原因通常在于服务部署缺乏合理的资源规划,导致多个高负载应用集中部署在同一节点上,从而造成资源竞争和瓶颈。


二、问题成因分析

  1. 服务部署不均衡
    应用在部署时未指定资源请求(requests)和限制(limits),Kubernetes 调度器无法准确评估节点的可用资源,从而可能导致多个高负载 Pod 被调度到同一个节点上。

  2. 缺乏资源预留机制
    若未在 Deployment 或 Pod 模板中显式声明 CPU 和内存的 requests,Kubernetes 默认将其视为“BestEffort”类型,这类 Pod 在资源紧张时优先被驱逐,且调度时不会考虑节点实际负载,极易造成资源热点。

  3. 监控与调优缺失
    未结合监控系统(如 Prometheus + Grafana)对应用实际资源消耗进行长期观察,导致资源配置脱离实际需求,要么资源浪费,要么资源不足。


三、解决思路与最佳实践

1. 借助监控系统评估真实资源使用情况

在调整资源配置前,应首先通过监控工具(如 Prometheus)采集历史 CPU 和内存使用数据,分析以下指标:

  • 应用平均 CPU 使用率(如 500m)
  • 应用峰值 CPU 使用率(如 900m)
  • 内存常驻使用量与峰值使用量
  • 是否存在突发性资源消耗(如定时任务、批量处理)

这些数据是合理设置 requests 和 limits 的基础。

2. 在 Deployment 中配置合理的资源请求(requests)

requests 是 Kubernetes 调度器用于决定将 Pod 调度到哪个节点的关键依据。设置合理的 requests 可以:

  • 避免多个高负载 Pod 被调度到同一节点;
  • 保证节点资源分配的均衡性;
  • 提升集群整体资源利用率。

示例配置:

1
2
3
4
5
6
7
8
9
10
11
spec:
containers:
- name: my-app
image: my-app:latest
env:
- name: ENV
value: "prod"
resources:
requests:
cpu: 500m # 保留 0.5 个 CPU 核心
memory: 256Mi # 保留 256MB 内存

建议:requests 应略高于应用的平均资源使用量,以应对日常波动。

3. 谨慎设置资源限制(limits)(个人建议不设置)

limits 用于限制容器可使用的最大资源量。虽然可以防止某个 Pod 过度占用资源,但在生产环境中需谨慎使用:

  • CPU limits:若设置过低,可能限制应用性能,尤其对突发型负载不友好;
  • Memory limits:超过限制会导致 OOMKilled,影响服务稳定性。

因此,建议在大多数场景下仅设置 requests,而 limits 可暂不配置或设置为明显高于 requests 的值,除非有明确的资源隔离或计费需求。

示例(带 limits,但宽松):

1
2
3
4
5
6
7
resources:
requests:
cpu: 500m
memory: 256Mi
limits:
cpu: "2" # 允许突发使用最多 2 核 CPU
memory: 1Gi # 内存上限设为 1GB,避免内存泄漏导致节点崩溃

注意:若集群启用了 Horizontal Pod Autoscaler(HPA),应确保 CPU requests 与 HPA 的 targetUtilization 匹配,避免扩缩容异常。


四、辅助优化措施

  1. 启用 Pod 拓扑分布约束(Pod Topology Spread Constraints)
    通过 topologySpreadConstraints 强制将同类 Pod 分散到不同节点,避免集中部署。

  2. 使用节点亲和性(Node Affinity)或污点容忍(Taints/Tolerations)
    将高负载应用定向调度到专用节点,实现资源隔离。

  3. 定期进行资源审计
    使用 kubectl describe nodekubectl top pods 检查节点和 Pod 的资源分配与使用情况,持续优化资源配置。

  4. 启用 Vertical Pod Autoscaler(VPA)(可选)
    VPA 可自动推荐或调整 Pod 的 requests/limits,适合资源波动较大的应用(但需注意其与 HPA 的兼容性)。


五、总结

解决 Kubernetes 中单节点 CPU 占用过高的问题,关键在于“合理规划 + 精细化调度 + 持续监控”。通过在 Deployment 中科学配置 resources.requests,结合 Prometheus 监控数据动态调整,并辅以调度策略优化,可有效避免资源热点,提升集群稳定性与资源利用率。切忌“一刀切”地设置 limits,而应根据业务特性灵活配置

最终目标:让每个节点的资源负载均衡,每个应用获得其所需的资源保障,同时避免资源浪费。