2. 资源模型基础:Kubernetes 资源模型
在云原生成本分摊与安全权限测试中,Kubernetes 资源模型是核心基础。只有准确理解 Pod、Node、Namespace 的层级关系,以及 Requests & Limits、ResourceQuota 的约束机制,才能设计出可审计、可追溯的成本分摊策略与权限控制方案。
2.1 核心资源对象:Pod、Node、Namespace
Kubernetes 资源模型以 Pod 为最小调度单元,Node 为物理/虚拟计算节点,Namespace 为逻辑隔离边界。三者构成资源归属与计费的基本链路。
| 资源对象 | 角色 | 成本分摊视角 | 安全权限视角 |
|---|---|---|---|
| Pod | 最小调度与计费单元 | 按 Pod 的 Requests 分摊节点成本 | Pod 身份(ServiceAccount)决定资源访问权限 |
| Node | 计算资源提供者 | 节点总成本 = 实例费用 + 系统开销 | Node 级别 kubelet 鉴权控制节点操作 |
| Namespace | 逻辑隔离边界 | 按 Namespace 聚合 Pod 成本,支持部门级分摊 | RBAC 绑定 Namespace 范围,限制越权访问 |
关键原则:成本分摊链路为
Node → Namespace → Pod,安全权限链路为 Cluster → Namespace → Pod。两条链路在 Namespace 层交汇,形成可审计的管控面。
2.2 资源请求与限制(Requests & Limits)
Requests 是 Pod 启动时预留的“最小保证资源”,Limits 是 Pod 可使用的“资源上限”。两者直接影响调度决策、QoS 等级以及成本计算。
2.2.1 三档 QoS 等级与成本含义
| QoS 等级 | Requests vs Limits | 调度保证 | 成本分摊系数 |
|---|---|---|---|
| Guaranteed | Requests == Limits | 最高,不会被驱逐 | 按 Requests 全额分摊 |
| Burstable | Requests < Limits | 中等,突发时可超用 | 按 Requests 分摊 + 超用部分按比例追加 |
| BestEffort | 未设置 Requests/Limits | 最低,优先被驱逐 | 按实际使用量分摊(波动大) |
安全测试注意:恶意 Pod 可通过设置极低 Requests 但极高 Limits 的方式抢占节点资源,导致同节点其他 Pod 被驱逐。ResourceQuota 和 LimitRange 必须配合使用,防止此类“资源饥饿”攻击。
2.2.2 典型资源声明示例
apiVersion: v1
kind: Pod
metadata:
name: cost-demo-pod
namespace: finance
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "500m" # 0.5 核
memory: "256Mi"
limits:
cpu: "1000m" # 1 核
memory: "512Mi"
该 Pod 属于 Burstable 等级,成本分摊时基础部分按 0.5 核 + 256Mi 计算,突发部分按实际超用量额外计费。
2.3 资源配额(ResourceQuota)
ResourceQuota 是 Namespace 级别的资源总量约束,防止单个 Namespace 过度消耗集群资源。在成本分摊模型中,ResourceQuota 定义了“预算上限”,超出部分可触发告警或拒绝调度。
2.3.1 ResourceQuota 核心字段
| 字段 | 作用 | 成本分摊影响 |
|---|---|---|
requests.cpu |
Namespace 内所有 Pod 的 CPU Requests 总和上限 | 限制部门可申请的 CPU 总量,防止超支 |
requests.memory |
Namespace 内所有 Pod 的内存 Requests 总和上限 | 控制内存成本上限 |
limits.cpu |
Namespace 内所有 Pod 的 CPU Limits 总和上限 | 限制突发资源使用,避免成本失控 |
limits.memory |
Namespace 内所有 Pod 的内存 Limits 总和上限 | 防止内存泄漏导致成本飙升 |
count/pods |
Namespace 内 Pod 数量上限 | 间接控制管理开销与调度压力 |
2.3.2 ResourceQuota 配置示例
apiVersion: v1
kind: ResourceQuota
metadata:
name: finance-quota
namespace: finance
spec:
hard:
requests.cpu: "10" # 总计 10 核
requests.memory: "20Gi"
limits.cpu: "20" # 允许突发至 20 核
limits.memory: "40Gi"
count/pods: "50"
实践建议:在成本分摊系统中,将 ResourceQuota 的
hard 值与部门预算绑定。当 Namespace 资源使用量达到 Quota 的 80% 时触发预警,100% 时拒绝新 Pod 创建,实现“预算即配额”的自动化管控。
2.4 资源模型关系图
下图展示了 Kubernetes 资源模型的核心层级与成本分摊路径:
2.5 资源模型与成本分摊的映射关系
将上述资源模型映射到成本分摊系统,需要建立以下关键映射表:
| Kubernetes 对象 | 成本分摊维度 | 安全测试关注点 |
|---|---|---|
| Node | 计算资源池,按实例规格计费 | 节点鉴权、kubelet 端口暴露 |
| Namespace | 部门/项目成本中心 | RBAC 绑定、ResourceQuota 绕过 |
| Pod | 最小计费单元,按 Requests 分摊 | 特权容器、资源耗尽攻击 |
| ResourceQuota | 预算上限,超限告警/拒绝 | Quota 配置篡改、配额耗尽 |
| LimitRange | Pod 级别资源默认值/约束 | 默认值绕过、最小/最大限制逃逸 |