3. Kubernetes 资源模型:Pod、Node、Namespace、Resource Quota、LimitRange 基础概念
在云原生成本分摊与容量突增场景中,理解 Kubernetes 的资源模型是进行水位预测和成本核算的基石。Kubernetes 的资源管理并非简单的“申请-分配”,而是通过一套层次化的抽象层,将物理/虚拟机的计算资源(CPU、内存)以逻辑单元的形式交付给应用。本章将深入剖析 Pod、Node、Namespace、Resource Quota 和 LimitRange 这五个核心概念,并揭示它们在成本分摊模型中的角色。
3.1 资源抽象层次:从硬件到容器
Kubernetes 的资源模型可以看作一个四层金字塔,每一层都定义了不同的资源粒度和管控边界。理解这个层次结构,有助于我们定位成本分摊的“最小可计量单元”。
3.2 Pod:最小调度与成本核算单元
Pod 是 Kubernetes 中可创建和部署的最小计算单元,也是成本分摊模型中最基础的计量对象。一个 Pod 可以包含一个或多个容器,这些容器共享同一个网络命名空间、存储卷以及资源约束。
3.2.1 Pod 的资源声明:Requests 与 Limits
每个 Pod 中的容器都可以声明两类资源参数,这是 HPA 水位预测和成本计算的直接数据来源:
| 参数 | 含义 | 对调度的影响 | 对成本的影响 |
|---|---|---|---|
| requests | 容器启动时保证的最小资源量 | 调度器依据 requests 选择 Node | 即使 Pod 未使用满,也按 requests 计费(预留成本) |
| limits | 容器允许使用的资源上限 | 超过 limits 时触发 OOMKill 或 CPU 节流 | 影响超卖比例和 Node 利用率 |
3.2.2 Pod 资源声明示例
apiVersion: v1
kind: Pod
metadata:
name: cost-demo-pod
namespace: production
spec:
containers:
- name: app-container
image: nginx:latest
resources:
requests:
cpu: "500m" # 0.5 个 CPU 核心
memory: "256Mi" # 256 Mebibytes
limits:
cpu: "1000m" # 1 个 CPU 核心
memory: "512Mi" # 512 Mebibytes
3.3 Node:资源供给与成本池
Node 是 Kubernetes 集群中的工作节点(物理机或虚拟机),它提供了 Pod 运行所需的 CPU、内存、磁盘和网络资源。在成本模型中,Node 是“成本池”的载体——所有 Node 的总成本(包括计算、存储、网络、管理开销)构成了集群的总拥有成本(TCO)。
- 节点容量(Capacity): Node 可分配的总资源量,例如 4 vCPU、16 GiB 内存。
- 节点可分配资源(Allocatable): 扣除系统组件(kubelet、操作系统)后的可用资源,是调度器实际参考的值。
- 节点利用率: 所有 Pod 的 requests 总和 / Node 的 Allocatable。利用率越高,单位成本越低。
3.4 Namespace:逻辑隔离与成本分摊边界
Namespace 是 Kubernetes 中用于实现多租户资源隔离的逻辑边界。在成本分摊实践中,Namespace 通常映射到不同的业务线、团队、环境(如 dev/staging/prod)或客户项目。
3.5 Resource Quota:资源配额管控
Resource Quota 是作用于 Namespace 级别的资源总量限制策略。它确保单个 Namespace 不会过度消耗集群资源,从而保障多租户场景下的公平性。在成本模型中,Quota 定义了每个业务单元的资源“预算上限”。
3.5.1 常用配额类型
| 资源类型 | 示例 | 说明 |
|---|---|---|
| requests.cpu | 10 | 该 Namespace 下所有 Pod 的 CPU requests 总和不超过 10 核 |
| requests.memory | 20Gi | 该 Namespace 下所有 Pod 的内存 requests 总和不超过 20 GiB |
| limits.cpu | 20 | 该 Namespace 下所有 Pod 的 CPU limits 总和不超过 20 核 |
| limits.memory | 40Gi | 该 Namespace 下所有 Pod 的内存 limits 总和不超过 40 GiB |
| count/pods | 100 | 该 Namespace 下最多允许创建 100 个 Pod |
3.5.2 Resource Quota 配置示例
apiVersion: v1
kind: ResourceQuota
metadata:
name: production-quota
namespace: production
spec:
hard:
requests.cpu: "10"
requests.memory: "20Gi"
limits.cpu: "20"
limits.memory: "40Gi"
count/pods: "100"
count/services: "20"
count/secrets: "50"
3.6 LimitRange:容器级资源约束
LimitRange 是作用于 Namespace 级别的默认资源约束策略,它可以在 Pod 未显式声明资源时提供默认值,并强制容器资源在指定范围内。这对于防止“孤儿 Pod”或“资源黑洞”至关重要。
3.6.1 LimitRange 的核心能力
- 默认值注入: 如果 Pod 未设置 requests/limits,LimitRange 会自动注入默认值。
- 范围限制: 强制每个容器的 requests/limits 必须在 min 和 max 之间。
- 比例约束: 可设置 maxLimitRequestRatio,例如限制 limits/requests 不超过 3:1,防止过度超卖。
3.6.2 LimitRange 配置示例
apiVersion: v1
kind: LimitRange
metadata:
name: production-limits
namespace: production
spec:
limits:
- max:
cpu: "2"
memory: "2Gi"
min:
cpu: "100m"
memory: "64Mi"
default:
cpu: "500m"
memory: "256Mi"
defaultRequest:
cpu: "200m"
memory: "128Mi"
maxLimitRequestRatio:
cpu: "3"
3.7 四者关系与成本分摊映射
将上述四个概念串联起来,可以清晰地看到它们在成本分摊模型中的角色:
| 概念 | 成本分摊角色 | 数据来源 | 对 HPA 水位预测的影响 |
|---|---|---|---|
| Pod | 最小成本核算单元 | Pod 的 requests/limits 字段 | HPA 基于 Pod 的 CPU/内存实际使用率触发扩缩容 |
| Node | 成本池(TCO 载体) | 云厂商账单 / 物理机折旧 | Node 剩余容量决定 HPA 扩容是否成功 |
| Namespace | 成本分摊边界(业务线/环境) | Pod 所属 Namespace 标签 | 不同 Namespace 可配置独立的 HPA 策略 |
| Resource Quota | 成本预算上限 | Quota 的 hard 字段 | HPA 扩容不能超过 Quota 上限,否则扩容失败 |
| LimitRange | 资源使用规范(防止浪费) | LimitRange 的 default/min/max 字段 | 确保 HPA 新创建的 Pod 有合理的资源规格 |