2. 核心概念解析:资源配额、限制范围、QoS 等级与命名空间隔离策略
在 Kubernetes 集群中实施策略即代码(Policy as Code)资源配额模型之前,必须深入理解四个核心的底层概念:资源配额(Resource Quota)、限制范围(LimitRange)、服务质量(QoS)等级以及命名空间(Namespace)隔离策略。这四个概念共同构成了资源治理的基石,决定了 CI/CD 流水线中 Pod 的调度行为与资源保障。
2.1 资源配额(Resource Quota)
Resource Quota 是 Kubernetes 中用于限制命名空间级别资源消耗总量的策略对象。它通过硬性上限来防止单个团队或流水线任务过度占用集群资源,从而保障多租户环境下的公平性。
以下是一个典型的 Resource Quota YAML 定义,适用于 CI/CD 流水线的“构建”命名空间:
apiVersion: v1
kind: ResourceQuota
metadata:
name: ci-build-quota
namespace: ci-pipeline
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
persistentvolumeclaims: "5"
pods: "20"
services: "10"
在策略即代码模型中,Resource Quota 通常由 OPA/Gatekeeper 或 Kyverno 策略动态生成,而非手动编写。流水线触发时,策略引擎会根据项目标签自动计算并注入配额。
2.2 限制范围(LimitRange)
LimitRange 在命名空间级别为 Pod 和容器设置默认的资源请求/限制,以及最小/最大约束。它解决了 Resource Quota 无法覆盖的“单个 Pod 资源规格”问题,防止流水线中某个微服务容器申请过大的资源。
| 参数 | 说明 | CI/CD 场景示例 |
|---|---|---|
| default | 容器未指定资源限制时的默认值 | 构建容器默认限制 512Mi 内存 |
| defaultRequest | 容器未指定资源请求时的默认值 | 构建容器默认请求 256Mi 内存 |
| max | 容器资源限制的上限 | 单个测试容器内存上限 4Gi |
| min | 容器资源请求的下限 | Sidecar 容器最小 CPU 请求 50m |
2.3 服务质量(QoS)等级
Kubernetes 根据 Pod 中容器的资源请求(requests)和限制(limits)配置,自动将 Pod 划分为三种 QoS 等级。这一等级直接决定了节点资源紧张时 Pod 被驱逐的优先级。
2.4 命名空间(Namespace)隔离策略
命名空间是 Kubernetes 实现多租户隔离的基本单元。在策略即代码资源配额模型中,命名空间不仅是逻辑隔离边界,更是策略的绑定目标。每个 CI/CD 流水线阶段(构建、测试、预发布)应使用独立的命名空间。
隔离策略通常包含以下三个维度:
- 资源隔离: 每个命名空间绑定独立的 Resource Quota 和 LimitRange,防止流水线间资源争抢。
- 网络隔离: 通过 NetworkPolicy 限制命名空间之间的流量,例如禁止测试命名空间访问生产数据库。
- 策略绑定: 使用命名空间标签(如
tier: ci)作为 OPA/Gatekeeper 策略的匹配条件,实现策略的自动生效。
data.namespace.labels 作为输入,动态生成 Resource Quota 和 LimitRange。例如,当命名空间标签包含 tier: ci 时,自动注入构建专用的配额模板。
2.5 四者协同关系
Resource Quota、LimitRange、QoS 等级和 Namespace 并非孤立存在,它们在策略即代码模型中形成层层递进的约束链:
| 层级 | 控制对象 | 策略示例 |
|---|---|---|
| Namespace | 隔离边界与策略绑定 | 标签 tier: ci 触发配额策略 |
| Resource Quota | 命名空间总资源上限 | CPU 限制不超过 8 核 |
| LimitRange | 单个 Pod/容器资源范围 | 容器内存限制在 256Mi ~ 4Gi |
| QoS 等级 | Pod 驱逐优先级 | 强制 Burstable 以上等级 |
在 CI/CD 流水线中,策略引擎首先根据命名空间标签选择适用的配额模板,然后验证 Pod 的资源声明是否同时满足 LimitRange 的边界和 QoS 等级要求,最后汇总检查是否超出 Resource Quota 的总量。任何一环失败,流水线都将被拒绝进入调度队列。