Kubernetes 资源管理基础:Pod 资源请求与限制、QoS 类别、资源配额与 LimitRange
在 Kubernetes 集群中,资源管理是保障应用稳定性与集群效率的核心。本章将系统讲解 Pod 级别的资源请求与限制、由此衍生的 QoS 类别,以及命名空间级别的 ResourceQuota 和 LimitRange 机制。理解这些概念是后续通过 OPA Gatekeeper 实现自动化容量巡检的前提。
2.1 Pod 资源请求与限制
每个容器在 Pod 定义中都可以声明两类资源参数:requests(请求)和 limits(限制)。
- Requests:调度器保证的最小资源量,用于节点选择与资源预留。
- Limits:容器可以使用的资源上限,防止单个容器耗尽节点资源。
Kubernetes 目前主要管理两种可压缩资源(CPU)和一种不可压缩资源(内存)。
| 资源类型 | Requests 语义 | Limits 语义 | 超限行为 |
|---|---|---|---|
| CPU | 调度保证,CFS 配额分配 | CPU 时间上限(CFS 周期) | 限流(throttle),不会杀死容器 |
| Memory | 调度保证,节点内存预留 | 容器 cgroup memory.max | OOM Kill(如果超过 limits) |
| Ephemeral Storage | 调度保证,节点磁盘预留 | 本地临时存储上限 | Pod 驱逐(如果超过 limits) |
最佳实践:生产环境中建议始终设置 requests 与 limits。对于 CPU,可设置 requests = limits 避免 CPU 竞争抖动;对于内存,建议 limits 略高于 requests 以应对突发,但不可超过节点容量。
以下是一个包含资源声明的 Pod 示例:
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app
image: nginx:1.25
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "1000m"
2.2 QoS 类别:服务质量分级
Kubernetes 根据 Pod 中所有容器的资源请求与限制设置,自动为每个 Pod 分配一个 QoS(Quality of Service)类别。该类别决定了节点资源紧张时 Pod 被驱逐的优先级。
QoS 类别分为三种:
| QoS 类别 | 判定条件 | 驱逐优先级 | 典型场景 |
|---|---|---|---|
| Guaranteed | 所有容器 requests == limits(CPU 和内存) | 最低(最不易被驱逐) | 关键业务、数据库、有状态服务 |
| Burstable | 至少一个容器 requests < limits,且未满足 Guaranteed | 中等 | Web 服务、批处理任务 |
| BestEffort | 所有容器均未设置 requests 和 limits | 最高(最先被驱逐) | 开发测试、非关键辅助任务 |
容量规划要点:BestEffort Pod 在节点内存压力下会被优先杀死,且无法保证 CPU 时间。在容量规划中,应严格控制 BestEffort Pod 的数量,避免关键业务受到影响。
下图展示了 QoS 类别的判定流程与驱逐优先级关系:
2.3 ResourceQuota:命名空间资源配额
ResourceQuota 是命名空间级别的资源总量限制机制。它能够限制一个命名空间内所有 Pod 的资源请求总和与限制总和,防止单个团队或项目过度占用集群资源。
一个典型的 ResourceQuota 示例:
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
persistentvolumeclaims: "5"
pods: "20"
ResourceQuota 支持的主要资源维度:
| 资源字段 | 含义 | 示例值 |
|---|---|---|
requests.cpu |
所有 Pod CPU 请求总和上限 | "4"(4 核) |
requests.memory |
所有 Pod 内存请求总和上限 | "8Gi" |
limits.cpu |
所有 Pod CPU 限制总和上限 | "8" |
limits.memory |
所有 Pod 内存限制总和上限 | "16Gi" |
pods |
命名空间中 Pod 总数上限 | "20" |
persistentvolumeclaims |
PVC 数量上限 | "5" |
count/deployments.apps |
特定资源对象数量上限 | "10" |
容量规划关联:ResourceQuota 是容量规划的“硬边界”。在 OPA Gatekeeper 巡检中,我们可以检查 ResourceQuota 的配置是否与集群实际容量匹配,以及是否所有命名空间都已配置合理的配额。
2.4 LimitRange:容器资源默认值与约束
LimitRange 在命名空间级别为容器设置资源请求与限制的默认值以及最小/最大值约束。它解决了两个问题:
- 为未显式设置资源的 Pod 提供默认值,避免产生 BestEffort Pod。
- 限制单个容器能申请的资源范围,防止“超大 Pod”挤占配额。
LimitRange 示例:
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: team-a
spec:
limits:
- max:
cpu: "2"
memory: "4Gi"
min:
cpu: "100m"
memory: "128Mi"
default:
cpu: "500m"
memory: "512Mi"
defaultRequest:
cpu: "200m"
memory: "256Mi"
type: Container
LimitRange 关键字段说明:
| 字段 | 作用 | 说明 |
|---|---|---|
max |
容器资源上限 | 单个容器不能超过此值 |
min |
容器资源下限 | 单个容器不能低于此值 |
default |
容器 limits 默认值 | 当容器未设置 limits 时使用 |
defaultRequest |
容器 requests 默认值 | 当容器未设置 requests 时使用 |
下图展示了 ResourceQuota 与 LimitRange 在命名空间中的协同作用:
2.5 资源管理四层模型总结
Kubernetes 的资源管理从 Pod 到集群分为四个层次,每一层解决不同的问题:
| 层次 | 作用范围 | 核心机制 | 容量规划关注点 |
|---|---|---|---|
| 容器级别 | 单个容器 | requests / limits | 避免 BestEffort,合理设置比例 |
| Pod 级别 | Pod 内所有容器 | QoS 类别(自动推导) | 关键业务使用 Guaranteed |
| 命名空间级别 | 命名空间 | ResourceQuota | 总量上限与集群容量匹配 |
| 容器约束级别 | 命名空间 | LimitRange | 默认值与边界约束 |
OPA Gatekeeper 巡检切入点:在后续章节中,我们将利用 Gatekeeper 的 ConstraintTemplate 自动检查:① 所有 Pod 是否设置了 requests/limits;② 是否存在 BestEffort Pod;③ ResourceQuota 是否覆盖了关键资源维度;④ LimitRange 是否配置了合理的默认值。这些巡检规则将直接服务于容量规划。