2. Kubernetes 资源模型深度回顾:Pod、Container、Namespace、ResourceQuota、LimitRange 的核心概念与工作原理

在集群升级过程中,资源配额校准是避免节点过载、保障工作负载稳定性的关键前置动作。要精准校准配额,必须深入理解 Kubernetes 资源模型的底层设计。本章从 Pod、Container、Namespace、ResourceQuota、LimitRange 五个核心对象出发,梳理其概念、工作原理及在升级场景中的影响。

2.1 资源模型基础:Pod 与 Container

Pod 是 Kubernetes 中最小的调度与资源分配单元,一个 Pod 内可包含一个或多个 Container。所有 Container 共享 Pod 的网络栈、存储卷和资源上下文。

2.1.1 Container 资源声明:Requests 与 Limits

每个 Container 在 spec 中通过 resources.requests 和 resources.limits 声明所需资源。Requests 用于调度决策,Limits 用于运行时约束。

字段 语义 调度影响 运行时行为
requests.cpu 保证的最小 CPU 份额 节点剩余可分配 CPU ≥ 所有 Pod requests 之和 CFS 配额保障,低于 requests 时可能被压缩
requests.memory 保证的最小内存量 节点剩余可分配内存 ≥ 所有 Pod requests 之和 内存不可压缩,超过 requests 但低于 limits 时仍可运行
limits.cpu CPU 使用上限 不影响调度(仅用于运行时限制) CFS 周期内最多使用 limits 量,超限则节流
limits.memory 内存使用硬上限 不影响调度 超过 limits 触发 OOM Kill
升级校准要点: 升级前必须检查所有运行中 Pod 的 requests 与 limits 设置。常见问题包括:requests 设置过高导致节点碎片化、limits 未设置导致内存泄漏时无保护、requests 与 limits 差距过大引发 CPU 节流。

2.1.2 Pod 的资源聚合与 QoS 等级

Pod 的资源总量等于其所有 Container 资源声明之和。Kubelet 根据 Pod 内所有 Container 的 requests 与 limits 设置,将 Pod 归入以下 QoS 等级:

  • Guaranteed:每个 Container 都设置了 requests 和 limits,且 requests == limits(CPU 和内存均满足)。
  • Burstable:至少有一个 Container 设置了 requests 或 limits,但不满足 Guaranteed 条件。
  • BestEffort:没有任何 Container 设置 requests 和 limits。

QoS 等级直接影响节点资源不足时的驱逐顺序:BestEffort 最先被驱逐,Burstable 次之,Guaranteed 最后。

升级建议: 核心控制面组件(如 kube-apiserver、etcd)应配置为 Guaranteed 等级,避免升级过程中因资源竞争被驱逐。对于 Burstable 工作负载,升级前应评估其内存使用峰值是否接近 limits,防止升级期间触发 OOM。

2.2 资源隔离边界:Namespace

Namespace 是 Kubernetes 实现多租户资源隔离的逻辑边界。不同 Namespace 中的资源名称可以重复,但资源配额、网络策略、RBAC 等策略作用域限定在 Namespace 内。

在升级场景中,Namespace 的作用体现在:

  • 资源统计范围:ResourceQuota 和 LimitRange 均绑定到特定 Namespace。
  • 升级灰度隔离:可将测试 Namespace 先升级,验证资源模型兼容性后再升级生产 Namespace。
  • 资源回收边界:删除 Namespace 会级联删除其下所有资源,升级前应清理废弃 Namespace 以释放配额。
Namespace 资源隔离与配额作用域 Namespace: production ResourceQuota: cpu=32, memory=128Gi, pods=100 LimitRange: min/max/default CPU & Memory Pod: web-1 req: 0.5C/1Gi Pod: web-2 req: 0.5C/1Gi Pod: batch-1 req: 2C/4Gi Namespace: staging ResourceQuota: cpu=8, memory=32Gi, pods=20 LimitRange: min/max/default CPU & Memory Pod: test-1 req: 0.25C/512Mi Pod: test-2 req: 0.25C/512Mi

2.3 资源配额控制:ResourceQuota

ResourceQuota 是 Namespace 级别的资源总量限制器,防止单个 Namespace 耗尽集群资源。它支持对以下维度进行配额:

  • 计算资源:requests.cpu、requests.memory、limits.cpu、limits.memory
  • 存储资源:requests.storage、persistentvolumeclaims
  • 对象数量:pods、services、configmaps、secrets 等

2.3.1 工作原理

当用户在 Namespace 内创建 Pod 时,API Server 的准入控制器(ResourceQuota Admission Controller)会执行以下校验:

  1. 计算当前 Namespace 内所有 Pod 的资源请求总和(包括新 Pod)。
  2. 将总和与 ResourceQuota 中声明的硬限制(hard)进行比较。
  3. 如果超出任一配额维度,拒绝创建并返回错误。
升级风险提示: 如果升级过程中新增了资源字段(如新增 hugepages-2Mi 配额维度),而现有 ResourceQuota 未覆盖该字段,可能导致新版本调度器无法正确计算配额,引发 Pod 创建失败。升级前应使用 kubectl get resourcequota -A -o yaml 导出所有配额,检查字段完整性。

2.3.2 配额作用域(ScopeSelector)

ResourceQuota 支持通过 scopeSelector 对特定 QoS 等级或优先级类的 Pod 进行差异化配额控制:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: production
spec:
  hard:
    requests.cpu: "32"
    requests.memory: "128Gi"
    limits.cpu: "64"
    limits.memory: "256Gi"
  scopeSelector:
    matchExpressions:
      - operator: In
        scopeName: PriorityClass
        values:
          - high-priority

2.4 资源范围约束:LimitRange

LimitRange 是 Namespace 级别的资源声明约束器,用于为未显式设置资源声明的 Pod 提供默认值,并限制单个 Pod/Container 的资源上下界。

2.4.1 核心能力

类型 约束维度 示例
默认值 default / defaultRequest 未设置 limits 的 Container 自动获得 default CPU=500m
最小值 min Container requests.cpu 不得低于 100m
最大值 max Container limits.memory 不得超过 8Gi
比例约束 maxLimitRequestRatio limits.cpu / requests.cpu ≤ 4

2.4.2 工作原理

LimitRange 在 Pod 创建时通过准入控制器执行以下操作:

  1. 默认值注入:如果 Container 未设置 requests 或 limits,LimitRange 的 default 和 defaultRequest 字段会填充缺失值。
  2. 边界校验:检查每个 Container 的 requests 和 limits 是否在 min 与 max 范围内。
  3. 比例校验:如果设置了 maxLimitRequestRatio,校验 limits/requests 比值是否超过阈值。
升级校准关键: 升级后 kubelet 版本变化可能导致默认资源行为改变(例如 CRI 实现更新后默认内存限制不同)。建议在升级前为每个 Namespace 显式配置 LimitRange,避免依赖隐式默认值。升级后使用 kubectl describe limitrange -n <ns> 验证注入结果。

2.5 资源模型交互流程

以下 SVG 展示了从 Pod 创建到资源校验的完整流程,涵盖 LimitRange 注入与 ResourceQuota 校验两个关键阶段:

Pod 创建资源校验流程(LimitRange + ResourceQuota) 用户提交 Pod YAML API Server 接收请求 准入控制器:LimitRange 注入 填充默认值 / 校验 min/max/ratio 准入控制器:ResourceQuota 校验 计算 Namespace 资源总和 vs 硬限制 拒绝创建:返回错误 允许创建:写入 etcd

2.6 升级场景中的资源模型检查清单

在集群升级前,建议按以下清单逐项检查资源模型配置:

检查项 命令/方法 预期结果
所有 Namespace 的 ResourceQuota 完整性 kubectl get resourcequota --all-namespaces 每个生产 Namespace 至少有一个配额对象
LimitRange 默认值覆盖 kubectl get limitrange --all-namespaces -o yaml default 和 defaultRequest 字段已设置
Pod QoS 分布统计 kubectl get pods -A -o json | jq '.items[].status.qosClass' | sort | uniq -c 核心组件为 Guaranteed,无 BestEffort 运行关键业务
资源配额使用率 kubectl describe resourcequota -n <ns> 各维度使用率 ≤ 80%,预留升级缓冲
废弃 Namespace 清理 kubectl get ns --show-labels 无长期未使用的 Namespace 占用配额
自动化校准建议: 将上述检查清单封装为 pre-upgrade-check.sh 脚本,在升级前自动执行并输出报告。对于 ResourceQuota 使用率超过 80% 的 Namespace,应提前扩容节点或调整配额,避免升级过程中因资源不足导致 Pod 驱逐。