2. Kubernetes 资源模型基础:Pod、Node、Namespace、ResourceQuota、LimitRange 概念与关系
在云原生成本分摊模型中,理解 Kubernetes 的资源模型是进行成本核算与分摊的基石。Kubernetes 的资源管理并非简单的“虚拟机 + 进程”模式,而是通过一套层次化的抽象对象来定义、隔离和限制计算资源。本章将深入剖析 Pod、Node、Namespace、ResourceQuota 和 LimitRange 这五个核心概念及其相互关系,为后续的成本标签、计量与分摊模型打下坚实基础。
2.1 核心资源对象:Pod 与 Node
Pod 是 Kubernetes 中最小的可部署计算单元,也是资源分配与调度的基本单位。Node 则是集群中的工作节点,提供实际的 CPU、内存、存储等物理或虚拟资源。
关键理解: Pod 是“资源消费者”,Node 是“资源提供者”。成本分摊的起点,就是将 Pod 的消耗映射到其运行的 Node 上。
2.1.1 Pod:资源消费的最小单元
- 资源请求(Requests): Pod 启动时保证获得的最小资源量,调度器依据此值选择 Node。
- 资源限制(Limits): Pod 运行时允许使用的最大资源量,用于防止资源争抢。
- QoS 等级: 基于 Requests 与 Limits 的配置,Pod 被分为 Guaranteed、Burstable、BestEffort 三类,直接影响调度与驱逐优先级。
2.1.2 Node:集群资源的物理抽象
- 可分配资源(Allocatable): Node 上可供 Pod 使用的实际资源总量(总容量减去系统预留与 kubelet 预留)。
- 资源容量(Capacity): Node 的总硬件资源,如 8 核 CPU、32GB 内存。
- 节点状态: Ready、NotReady 等状态影响 Pod 调度。
成本视角: Node 的成本(如云服务器实例费用)是集群总成本的直接来源。成本分摊的核心公式为:
Pod 成本 = Node 成本 × (Pod 资源请求 / Node 可分配资源)。
2.2 资源隔离与组织:Namespace
Namespace 是 Kubernetes 中用于实现多租户资源隔离的逻辑分组机制。它不提供物理隔离,但为资源配额、访问控制和成本归属提供了边界。
| 特性 | 说明 | 成本分摊意义 |
|---|---|---|
| 资源隔离 | 不同 Namespace 中的 Pod、Service、ConfigMap 等资源相互不可见(默认)。 | 可作为成本中心或业务单元的边界。 |
| 配额管理 | 通过 ResourceQuota 限制 Namespace 级别的总资源消耗。 | 防止单个团队过度使用资源,保障成本可控。 |
| 默认限制 | 通过 LimitRange 设置 Pod 或容器的默认 Requests/Limits。 | 避免未设置资源限制的 Pod 导致成本黑洞。 |
| 标签继承 | Namespace 的标签可被其下的资源继承(需配置)。 | 便于成本标签的自动传播与聚合。 |
常见误区: Namespace 不是安全隔离边界。不要将敏感工作负载仅依赖 Namespace 进行安全隔离,应结合 NetworkPolicy、RBAC 等机制。
2.3 资源控制策略:ResourceQuota 与 LimitRange
ResourceQuota 和 LimitRange 是 Kubernetes 提供的两种资源治理策略,用于在 Namespace 级别控制资源分配行为,是 FinOps 实践中“成本控制”的关键工具。
2.3.1 ResourceQuota:Namespace 资源总预算
ResourceQuota 定义了 Namespace 内所有 Pod 的资源消耗上限,包括 CPU、内存、存储卷数量、Service 数量等。
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "10" # 所有 Pod 的 CPU 请求总和不超过 10 核
requests.memory: "20Gi" # 所有 Pod 的内存请求总和不超过 20 Gi
limits.cpu: "20" # 所有 Pod 的 CPU 限制总和不超过 20 核
limits.memory: "40Gi" # 所有 Pod 的内存限制总和不超过 40 Gi
persistentvolumeclaims: "5" # PVC 数量不超过 5 个
pods: "20" # Pod 数量不超过 20 个
2.3.2 LimitRange:Pod 资源默认值与边界
LimitRange 在 Namespace 级别设置 Pod 或容器的默认 Requests/Limits,以及最小/最大资源约束,防止单个 Pod 过度占用资源。
apiVersion: v1
kind: LimitRange
metadata:
name: team-a-limits
namespace: team-a
spec:
limits:
- max: # 单个容器最大资源限制
cpu: "4"
memory: "8Gi"
min: # 单个容器最小资源请求
cpu: "100m"
memory: "128Mi"
default: # 默认 Limits(如果 Pod 未指定)
cpu: "500m"
memory: "512Mi"
defaultRequest: # 默认 Requests(如果 Pod 未指定)
cpu: "200m"
memory: "256Mi"
type: Container
FinOps 最佳实践: 为每个 Namespace 同时配置 ResourceQuota 和 LimitRange。ResourceQuota 控制总预算,LimitRange 确保单个 Pod 行为合规,两者结合可有效避免成本失控。
2.4 概念关系与成本分摊链路
这五个概念构成了 Kubernetes 资源管理的完整链路:Node 提供物理资源 → Namespace 划分逻辑边界 → ResourceQuota 设定边界预算 → LimitRange 规范单元行为 → Pod 作为最终资源消费者。
2.5 概念对比总结
| 概念 | 作用范围 | 核心功能 | 成本分摊角色 |
|---|---|---|---|
| Node | 集群 | 提供物理/虚拟计算资源 | 成本源头(账单入口) |
| Pod | Node | 运行容器的最小单元 | 成本计量对象(计量粒度) |
| Namespace | 集群 | 逻辑隔离与多租户 | 成本中心(分摊边界) |
| ResourceQuota | Namespace | 限制 Namespace 总资源 | 成本预算控制(上限) |
| LimitRange | Namespace | 设置 Pod 默认资源与边界 | 成本行为规范(默认值) |