2、资源模型基础:Kubernetes资源模型(Pod、Node、Namespace、ResourceQuota、LimitRange)的深入解析
Kubernetes 的资源模型是集群容量评估与配额规划的基石。理解 Pod、Node、Namespace、ResourceQuota 和 LimitRange 这五个核心原语之间的层级关系与交互机制,是进行精确容量规划的前提。本章将逐一拆解这些原语的定义、关键参数及最佳实践。
2.1 资源模型层级总览
Kubernetes 的资源管理遵循从物理到逻辑、从集群到工作负载的层级结构。下图展示了核心资源对象之间的逻辑关系与资源流动方向。
2.2 Pod:最小调度与资源消费单元
Pod 是 Kubernetes 中可创建和部署的最小计算单元,也是资源请求(requests)与限制(limits)的直接载体。每个 Pod 包含一个或多个容器,共享网络栈和存储卷。
2.2.1 资源声明:requests 与 limits
每个容器在 Pod 规范中必须(或强烈建议)声明以下两类资源参数:
| 参数 | 含义 | 调度影响 | 过载行为 |
|---|---|---|---|
| requests | 容器保证获得的最小资源量 | 调度器依据 Node 剩余可分配资源与 Pod requests 之和进行决策 | Node 必须满足 requests,否则 Pod 处于 Pending 状态 |
| limits | 容器允许使用的资源上限 | 不影响调度决策(仅影响运行时) | CPU 限流(throttle);内存超限触发 OOM Kill |
容量规划关键指标: 集群总容量 = Σ(Node Allocatable)。Pod 的
requests 总和决定了集群的“已分配容量”,而 limits 总和决定了潜在的“突发容量”。规划时需关注 requests 的利用率,而非 limits。
2.2.2 资源单位与换算
- CPU: 单位
m(毫核)。1 核 = 1000m。例如500m表示 0.5 个 CPU 核心。 - 内存: 单位
Mi(Mebibyte)、Gi(Gibibyte)。1 Gi = 1024 Mi。例如512Mi或2Gi。 - 临时存储(Ephemeral Storage): 单位同内存,用于日志、容器可写层等。
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "500m" # 保证 0.5 核
memory: "256Mi" # 保证 256 MiB
limits:
cpu: "1000m" # 上限 1 核
memory: "512Mi" # 上限 512 MiB
2.3 Node:集群资源池的物理边界
Node 是集群中的工作节点(物理机或虚拟机),其资源总量决定了集群的容量上限。Node 的资源并非全部可分配给 Pod,需要扣除系统预留和 kubelet 预留。
2.3.1 Node Allocatable 计算模型
Node 的可分配资源(Allocatable)是 Pod 实际能使用的资源上限,计算公式如下:
Allocatable = Node Capacity - System Reserved - Kubelet Reserved - Eviction Threshold
| 资源项 | 说明 | 典型值建议 |
|---|---|---|
| Node Capacity | 节点物理总资源(CPU/内存/磁盘) | 由硬件决定 |
| System Reserved | 操作系统、systemd、sshd 等系统进程预留 | CPU: 5%~10%;内存: 1~4 Gi |
| Kubelet Reserved | kubelet、容器运行时、CNI 等组件预留 | CPU: 5%;内存: 1~2 Gi |
| Eviction Threshold | 节点压力驱逐的硬/软阈值 | 内存: 100Mi~500Mi;磁盘: 5%~10% |
实践建议: 在大规模集群中,建议将
--system-reserved 和 --kubelet-reserved 显式配置在 kubelet 参数中,避免默认值过低导致节点在压力下不稳定。
2.4 Namespace:逻辑隔离与多租户边界
Namespace 提供集群内的逻辑隔离机制,是资源配额(ResourceQuota)和范围限制(LimitRange)的作用域。每个 Namespace 拥有独立的资源统计和策略控制。
- 资源隔离: 不同 Namespace 中的 Pod 默认无法直接通过 Service 名称通信(需跨 Namespace 访问)。
- 配额绑定: ResourceQuota 和 LimitRange 必须绑定到特定 Namespace 才能生效。
- 容量规划视角: 每个 Namespace 的
requests总和不应超过集群总 Allocatable 的合理比例,避免单个 Namespace 耗尽集群资源。
2.5 ResourceQuota:硬性资源上限
ResourceQuota 为 Namespace 设置聚合资源使用的硬性上限,防止资源被单个团队或应用过度占用。
2.5.1 核心配额维度
| 配额类型 | 示例 | 作用范围 |
|---|---|---|
| 计算资源 | requests.cpu, requests.memory, limits.cpu, limits.memory |
Namespace 内所有 Pod 的 requests/limits 总和 |
| 存储资源 | requests.storage, persistentvolumeclaims |
PVC 总量与个数 |
| 对象数量 | pods, services, configmaps, secrets |
Namespace 内各类对象的最大数量 |
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "20" # 所有 Pod requests.cpu 总和 ≤ 20 核
requests.memory: "40Gi" # 所有 Pod requests.memory 总和 ≤ 40 Gi
limits.cpu: "40" # 所有 Pod limits.cpu 总和 ≤ 40 核
limits.memory: "80Gi" # 所有 Pod limits.memory 总和 ≤ 80 Gi
pods: "50" # Pod 总数 ≤ 50 个
persistentvolumeclaims: "10"
注意: 如果 Namespace 设置了 ResourceQuota,则该 Namespace 内的所有 Pod 必须显式声明
requests 和 limits,否则创建 Pod 会被拒绝。这是初学者最容易忽略的陷阱。
2.6 LimitRange:默认值与边界约束
LimitRange 在 Namespace 级别为 Pod 或容器设置默认资源请求/限制,以及最小/最大约束。它解决了两个核心问题:
- 默认值注入: 当 Pod 未显式声明资源时,LimitRange 自动注入默认的 requests 和 limits。
- 边界约束: 限制单个 Pod/容器能申请的最大或最小资源,防止异常 Pod 占用过多资源。
2.6.1 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: # 未指定 limits 时的默认值
cpu: "500m"
memory: "512Mi"
defaultRequest: # 未指定 requests 时的默认值
cpu: "200m"
memory: "256Mi"
type: Container
2.6.2 ResourceQuota 与 LimitRange 协同工作流
下图展示了当 Pod 创建时,ResourceQuota 和 LimitRange 如何协同进行校验与注入:
2.7 资源模型关键对比总结
| 资源对象 | 作用域 | 核心功能 | 对容量规划的影响 |
|---|---|---|---|
| Pod | 集群(调度到 Node) | 声明 requests/limits,定义资源消费 | 直接决定集群资源分配率 |
| Node | 集群 | 提供 Allocatable 资源池 | 决定集群容量上限 |
| Namespace | 集群 | 逻辑隔离,配额作用域 | 划分容量预算单元 |
| ResourceQuota | Namespace | 设置聚合资源硬上限 | 防止资源超卖,保障公平性 |
| LimitRange | Namespace | 设置默认值与边界约束 | 规范 Pod 资源声明,避免异常 |
容量规划黄金法则: 在规划 ResourceQuota 时,建议将 Namespace 的
requests 配额总和控制在集群总 Allocatable 的 70%~80%,预留 20%~30% 用于系统弹性、突发流量和节点故障迁移。