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 |
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 最后。
2.2 资源隔离边界:Namespace
Namespace 是 Kubernetes 实现多租户资源隔离的逻辑边界。不同 Namespace 中的资源名称可以重复,但资源配额、网络策略、RBAC 等策略作用域限定在 Namespace 内。
在升级场景中,Namespace 的作用体现在:
- 资源统计范围:ResourceQuota 和 LimitRange 均绑定到特定 Namespace。
- 升级灰度隔离:可将测试 Namespace 先升级,验证资源模型兼容性后再升级生产 Namespace。
- 资源回收边界:删除 Namespace 会级联删除其下所有资源,升级前应清理废弃 Namespace 以释放配额。
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)会执行以下校验:
- 计算当前 Namespace 内所有 Pod 的资源请求总和(包括新 Pod)。
- 将总和与 ResourceQuota 中声明的硬限制(hard)进行比较。
- 如果超出任一配额维度,拒绝创建并返回错误。
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 创建时通过准入控制器执行以下操作:
- 默认值注入:如果 Container 未设置 requests 或 limits,LimitRange 的 default 和 defaultRequest 字段会填充缺失值。
- 边界校验:检查每个 Container 的 requests 和 limits 是否在 min 与 max 范围内。
- 比例校验:如果设置了 maxLimitRequestRatio,校验 limits/requests 比值是否超过阈值。
kubectl describe limitrange -n <ns> 验证注入结果。
2.5 资源模型交互流程
以下 SVG 展示了从 Pod 创建到资源校验的完整流程,涵盖 LimitRange 注入与 ResourceQuota 校验两个关键阶段:
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 驱逐。