2. Kubernetes 资源模型基础:Pod 资源请求(Request)与限制(Limit)的定义、作用与区别

在 Kubernetes 集群中,Pod 是最小的调度与运行单元。为了让调度器(kube-scheduler)做出合理的节点选择,以及让节点上的 kubelet 对容器进行有效的资源管控,Kubernetes 为每个容器定义了两种资源规格:Request(请求) 和 Limit(限制)。这两个参数是资源画像与临时资源预留优化的基石。

2.1 核心定义

参数 定义 作用域
Request 容器启动时向集群保证预留的最小资源量。调度器依据所有容器的 Request 总和判断节点是否满足 Pod 运行条件。 调度决策、CPU 共享权重、内存 OOM 优先级
Limit 容器运行时允许使用的资源上限。当容器试图超过 Limit 时,CPU 会被节流(Throttle),内存可能触发 OOM Kill。 运行时资源上限、CPU 配额周期、内存硬限制
关键认知:Request 是“承诺”,Limit 是“天花板”。在资源画像场景下,我们通常关注 Request 的利用率,因为它是节点资源预留的硬约束。

2.2 作用机制详解

2.2.1 Request 的作用

  • 调度准入:调度器计算每个节点的已分配 Request 总和,只有剩余可分配资源 ≥ 新 Pod 的 Request 时,节点才会被纳入候选。
  • CPU 权重分配:当节点 CPU 资源紧张时,CFS(完全公平调度器)按各容器的 CPU Request 比例分配时间片。Request 越高,获得 CPU 时间片的比例越大。
  • 内存保障:kubelet 根据内存 Request 计算节点的“已分配内存”,用于驱逐决策(Eviction)。内存 Request 越高的 Pod,在节点内存压力下被驱逐的优先级越低。

2.2.2 Limit 的作用

  • CPU 节流:当容器 CPU 使用量超过 Limit 时,CFS 会限制其时间片配额,导致容器进入 Throttling 状态,表现为延迟上升、吞吐下降。
  • 内存硬限制:当容器内存使用量超过 Limit 时,内核会直接触发 OOM Killer,终止容器进程(通常重启 Pod)。
  • 资源隔离:Limit 防止单个容器“抢占”同节点其他容器的资源,是集群稳定性的一道防线。
常见误区:很多用户认为设置 Limit 就能保证资源不被超卖。实际上,只有 Request 才是调度和预留的依据。如果只设 Limit 不设 Request,Kubernetes 默认 Request = Limit,可能导致节点资源被过度预留,利用率偏低。

2.3 Request 与 Limit 的区别

对比维度 Request Limit
调度影响 直接影响节点选择 不影响调度
资源预留 保证预留,不可被其他 Pod 抢占 不预留,仅作为上限约束
CPU 超卖 不允许超卖(调度时校验) 允许超卖(Limit 可大于 Request)
内存超卖 不允许超卖 允许超卖,但超限即 OOM
计费/配额 通常作为资源计费依据 通常作为资源使用上限
默认行为 未设置时默认为 0(无保证) 未设置时默认为无上限

2.4 资源模型与临时资源预留的关系

在 Deployment 滚动升级场景中,新 Pod 和旧 Pod 会短暂共存。此时,节点上的资源预留总量 = 旧 Pod 的 Request + 新 Pod 的 Request。如果 Request 设置过高,升级期间的临时资源预留会急剧膨胀,导致节点资源紧张甚至调度失败。理解 Request 与 Limit 的区别,是后续优化临时资源预留策略的前提。

资源画像视角:我们通常通过监控实际资源使用量(Usage)与 Request 的比值来评估资源浪费程度。如果 Usage 长期远低于 Request,说明存在过度预留,升级时的临时资源冲突风险反而更高。

2.5 资源模型关系图

Pod 资源模型:Request 与 Limit 关系 Request(请求) 调度器保证预留的最小资源 CPU: 按权重分配时间片 内存: 驱逐优先级依据 Limit(限制) 运行时资源使用上限 CPU: 超过则节流(Throttle) 内存: 超过则 OOM Kill 可相等 或 Limit > Request 实际使用量(Usage) 介于 0 与 Limit 之间波动 升级时临时资源预留 = 旧 Pod Request + 新 Pod Request 合理设置 Request 是优化临时资源预留的关键

2.6 典型配置示例

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app
    image: nginx:latest
    resources:
      requests:
        cpu: "500m"        # 0.5 核,调度保证
        memory: "256Mi"    # 256 MiB,内存预留
      limits:
        cpu: "1000m"       # 1 核,CPU 上限
        memory: "512Mi"    # 512 MiB,内存硬限制
最佳实践:对于生产环境,建议始终同时设置 Request 和 Limit。对于 CPU 密集型业务,Limit 可设为 Request 的 1.5~2 倍,允许突发;对于内存敏感型业务,建议 Limit = Request,避免 OOM 导致频繁重启。