2. Kubernetes 资源模型:Pod、Node、Namespace、Resource Quota、LimitRange 基础概念

在云原生成本分摊模型中,Kubernetes 的资源模型是成本核算与分摊的基石。只有准确理解 Pod、Node、Namespace、Resource Quota 和 LimitRange 这五个核心概念,才能将基础设施成本精确映射到业务单元。本节将逐一剖析这些概念,并揭示它们在成本分摊架构中的关键作用。

2.1 核心资源对象概览

下表从成本分摊视角,对比了五个核心资源对象的定义、作用域与分摊价值:

资源对象 作用域 成本分摊角色 关键属性
Pod 集群内最小调度单元 成本核算的最小粒度 CPU/Memory 请求与限制
Node 集群中的物理/虚拟节点 资源池与账单来源 实例规格、单价、标签
Namespace 虚拟集群隔离单元 成本分摊的一级维度 环境、团队、项目标签
Resource Quota Namespace 级别 预算控制与上限约束 CPU/Memory/存储总量
LimitRange Namespace 级别 默认资源规格与边界 Pod/Container 默认值

2.2 Pod:最小调度单元与成本原子

Pod 是 Kubernetes 中可创建和部署的最小计算单元,也是成本分摊的原子粒度。一个 Pod 可以包含一个或多个容器,共享网络栈和存储卷。在成本模型中,Pod 的 requests 和 limits 直接决定了其资源消耗量。

成本分摊关键点:Pod 的 requests 是预留资源,即使未完全使用也需计入成本;limits 是上限,超出部分可能被 throttled 或 OOMKilled。建议以 requests 作为成本核算基准,以 limits 作为风险控制上限。

apiVersion: v1
kind: Pod
metadata:
  name: cost-demo-pod
  namespace: team-alpha
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "256Mi"
        cpu: "250m"
      limits:
        memory: "512Mi"
        cpu: "500m"

2.3 Node:资源池与账单源头

Node 是集群中的工作节点,可以是云服务器或物理机。云厂商的账单通常按 Node 实例规格和运行时长计费。成本分摊的核心任务就是将 Node 的总费用,按比例分配给其上的 Pod。

  • 节点单价:云厂商按实例类型(如 m5.large、c6i.xlarge)定价。
  • 可分配资源:Node 总资源减去系统预留(kubelet、OS 等)后的可用资源。
  • 分摊公式:Pod 成本 = (Pod 请求资源 / Node 可分配资源) × Node 单价 × 运行时长。

最佳实践:为 Node 打上 node-type、region、instance-family 等标签,便于在成本报表中按维度聚合分析。

2.4 Namespace:虚拟集群与成本中心

Namespace 是 Kubernetes 实现多租户隔离的机制。在成本分摊架构中,Namespace 通常映射为成本中心或业务单元。通过将不同团队、项目或环境的资源部署到不同 Namespace,可以实现成本的一级归集。

apiVersion: v1
kind: Namespace
metadata:
  name: team-alpha
  labels:
    cost-center: "alpha-team"
    environment: "production"

注意:Namespace 本身不消耗计算资源,但它是资源配额和默认限制的生效边界。错误的 Namespace 设计会导致成本归属混乱。

2.5 Resource Quota:预算上限与成本控制

Resource Quota 用于限制 Namespace 内资源总量的上限,是成本控制的第一道防线。通过设置 CPU、内存、存储和对象数量的配额,可以防止单个团队过度消耗集群资源,从而避免成本失控。

配额类型 示例值 成本控制作用
requests.cpu 10 限制 CPU 预留总量
requests.memory 20Gi 限制内存预留总量
limits.cpu 20 限制 CPU 突发上限
limits.memory 40Gi 限制内存突发上限
persistentvolumeclaims 10 限制存储卷数量
apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-alpha-quota
  namespace: team-alpha
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"
    persistentvolumeclaims: "10"

2.6 LimitRange:默认规格与资源边界

LimitRange 为 Namespace 内的 Pod 或容器设置默认的资源请求/限制,以及最小/最大边界。它确保每个 Pod 都有明确的资源声明,避免因未设置资源规格而导致成本核算缺失或资源争抢。

  • 默认值:当 Pod 未显式设置 requests 或 limits 时,自动注入。
  • 边界约束:强制 Pod 的资源规格在合理范围内,防止单个 Pod 占用过多资源。
  • 成本影响:默认值直接决定未显式声明资源的 Pod 的成本基数。
apiVersion: v1
kind: LimitRange
metadata:
  name: team-alpha-limits
  namespace: team-alpha
spec:
  limits:
  - max:
      cpu: "2"
      memory: "4Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "250m"
      memory: "256Mi"
    type: Container

2.7 资源模型与成本分摊关系图

下图展示了从云账单到 Pod 成本分摊的完整链路,以及各资源对象在其中的位置:

Kubernetes 资源模型与成本分摊链路 Kubernetes 资源模型与成本分摊链路 云厂商账单(Node 级别) Node 资源池(可分配资源) Namespace 隔离(成本中心 / 业务单元) Resource Quota(预算上限) LimitRange(默认规格与边界) Pod(成本原子:requests / limits) 成本分摊公式:Pod 成本 = (Pod 请求资源 / Node 可分配资源) × Node 单价 × 运行时长

2.8 成本分摊实践建议

架构落地要点:

  1. Namespace 设计:按团队/项目/环境创建 Namespace,并绑定成本中心标签。
  2. Resource Quota 配置:为每个 Namespace 设置合理的资源上限,防止预算超支。
  3. LimitRange 强制:确保每个 Pod 都有明确的资源声明,避免“无主”资源消耗。
  4. Node 标签标准化:统一 Node 标签体系,便于成本按实例类型、区域等维度聚合。
  5. Pod 资源审计:定期检查 Pod 的 requests 与 limits 比例,优化资源利用率。