调度器保证的是调度,内核保证的是限制。这两者之间没有任何协调。
你给 Pod 设置了 requests,也设置了 limits。Pod 还是被限流了,或者被杀了。
不是 Kubernetes 有问题,而是多数人对这两个字段的理解有偏差。
很多人把 requests 和 limits 当成简单的 min/max 对——requests 是预留的资源,limits 是能用的上限。这个理解很直观,但不够准确。
Requests 和 limits 运行在完全不同的两个层面,由完全不同的两个系统执行。搞不清这个区别,生产环境的 Pod 就会在半夜莫名其妙地消失。
设置一个 500m CPU 的 request,并不意味着这 500m 毫核被独占保留给这个 Pod。
它的真实意思是:调度器只会把这个 Pod 放到它的账本里还有 500m CPU 可用的节点上。
节点可能正承受着真实的 CPU 压力,但只要调度器的账本上还有额度,它就会认为这个节点"合格"。
Request 是一个调度信号,不是一个性能保证。
对于 CPU 和内存,limit 的后果完全不一样:
这两个行为完全不等价:一个默默降级,一个毫无预警地宕机。
核心结论:requests 和 limits 不是资源配置,它们是调度信号和运行时故障触发器。调度器用一个,内核强制执行另一个,它们之间从不交互。
对 requests 和 limits 的困惑,源于把 Kubernetes 当成一个单一系统。实际上,调度和强制执行由完全不同的组件处理。
使用:requests only
调度器在 Pod 创建时运行一次。它根据 requests 评估节点容量,然后做出放置决策。
之后,调度器的工作就结束了。它不会监控 Pod,不会在节点过载时介入,它甚至不知道 limits 被设置成了什么。
使用:limits only
Kubelet 在每个节点上持续运行。它监控容器的资源使用情况,在运行时强制执行 limits。
Kubelet 不知道调度器做了什么决定,它只关注实际使用量是否超过了 limits。
这两个系统不共享任何状态。
一个 Pod 可能被调度器完美放置——requests 满足、节点容量充足——但在运行时仍然被限流或杀掉。

resources:
requests:
cpu: "200m"
# 没有设置 limits
resources:
requests:
cpu: "200m"
limits:
cpu: "500m"
验证命令:
# 查看 CPU 限流统计
cat /sys/fs/cgroup/cpu/kubepods/pod<pod-id>/cpu.stat
# nr_periods: 总调度周期数
# nr_throttled: 被限流的周期数

内存 limit 是一堵硬墙。
resources:
requests:
memory: "256Mi"
limits:
memory: "512Mi"
容器尝试分配 600Mi 内存 → 超过 limit=512Mi→ 内核 OOM Killer 介入 → 容器被直接终止→ Pod 状态变为 OOMKilled。
内存超限 → 容器直接死掉。内存 limit 设置不当的风险远高于 CPU。

Kubernetes 根据 requests 和 limits 的设置方式,将 Pod 划分为三个 QoS 类,决定了当节点资源不足时,谁先被驱逐。
QoS 类 | 条件 | 驱逐优先级 |
|---|---|---|
Guaranteed | 每个容器的 CPU 和内存都同时设置了 request 和 limit,且两者相等 | 最低(最安全) |
Burstable | 至少一个容器设置了 request 或 limit,但不满足 Guaranteed 条件 | 中等 |
BestEffort | 没有任何容器设置任何 request 或 limit | 最高(最先被杀) |
当节点内存不足时:BestEffort 最先被驱逐 → Burstable 其次 → Guaranteed 最后。
关键服务(如数据库、核心 API)务必设置为 Guaranteed(request = limit),确保最低的驱逐优先级。

只设置 request 不设置 limit → 单个容器可能耗尽节点所有资源。
只设置 limit 不设置 request → 调度器无法合理调度。
资源 | 超限后果 | 风险等级 |
|---|---|---|
CPU | 变慢(限流) | 中 |
内存 | 死掉(OOM Kill) | 高 |
先用监控工具观察实际使用量:
数据库、核心 API 等关键服务:request = limit,获得 Guaranteed QoS。
一般服务:Burstable,允许在资源空闲时适当突破。
批处理任务:可设为 BestEffort,利用闲置资源。
概念 | 谁在用 | 什么时候用 | 超限后果 |
|---|---|---|---|
Requests | 调度器 | Pod 创建时 | 调度失败(Pending) |
Limits | Kubelet + 内核 | 运行时持续 | 限流或被杀 |
记住:requests 保证调度,limits 保证限制。它们各司其职,从不交互。