2、资源模型基础:Kubernetes资源模型(Pod、Node、Namespace、ResourceQuota、LimitRange)的深入解析

Kubernetes 的资源模型是集群容量评估与配额规划的基石。理解 Pod、Node、Namespace、ResourceQuota 和 LimitRange 这五个核心原语之间的层级关系与交互机制,是进行精确容量规划的前提。本章将逐一拆解这些原语的定义、关键参数及最佳实践。

2.1 资源模型层级总览

Kubernetes 的资源管理遵循从物理到逻辑、从集群到工作负载的层级结构。下图展示了核心资源对象之间的逻辑关系与资源流动方向。

Kubernetes 资源模型层级关系 Node(节点) Namespace(命名空间) ResourceQuota(资源配额) LimitRange(范围限制) Pod(最小调度单元) Container(容器) 说明:箭头方向表示资源约束与策略的传递方向。Node 提供物理资源,Namespace 提供逻辑隔离,ResourceQuota/LimitRange 施加策略,Pod 承载容器。

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 或容器设置默认资源请求/限制,以及最小/最大约束。它解决了两个核心问题:

  1. 默认值注入: 当 Pod 未显式声明资源时,LimitRange 自动注入默认的 requests 和 limits。
  2. 边界约束: 限制单个 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 如何协同进行校验与注入:

Pod 创建时的资源校验与注入流程 用户提交 Pod LimitRange 注入 (默认值/边界校验) ResourceQuota 校验 (聚合上限检查) Pod 创建成功 Pod 创建失败(拒绝) 通过?

2.7 资源模型关键对比总结

资源对象 作用域 核心功能 对容量规划的影响
Pod 集群(调度到 Node) 声明 requests/limits,定义资源消费 直接决定集群资源分配率
Node 集群 提供 Allocatable 资源池 决定集群容量上限
Namespace 集群 逻辑隔离,配额作用域 划分容量预算单元
ResourceQuota Namespace 设置聚合资源硬上限 防止资源超卖,保障公平性
LimitRange Namespace 设置默认值与边界约束 规范 Pod 资源声明,避免异常
容量规划黄金法则: 在规划 ResourceQuota 时,建议将 Namespace 的 requests 配额总和控制在集群总 Allocatable 的 70%~80%,预留 20%~30% 用于系统弹性、突发流量和节点故障迁移。