2. 策略即代码(Policy as Code)基础:定义、核心原则与价值
在云原生架构中,环境配置与资源配额管理正从人工审批、静态配置向自动化、可编程演进。策略即代码(Policy as Code, PaC) 是将基础设施与安全策略以代码形式声明、版本化并自动执行的方法论。它使团队能够像管理应用代码一样管理策略,确保环境一致性、合规性与可审计性。
2.1 定义:什么是策略即代码?
策略即代码是将组织中的治理规则、安全约束、资源配额等策略,使用高级声明式语言(如 Rego、HCL、CUE)或通用编程语言(如 Python、Go)编写为可执行代码,并通过自动化引擎在资源创建、变更、运行时进行实时评估与强制执行。
核心转变: 从“人工检查 + 事后审计” → “代码定义 + 事前/事中阻断”。
| 维度 | 传统策略管理 | 策略即代码 |
|---|---|---|
| 表达方式 | 文档、邮件、Wiki | 代码文件(.rego, .hcl, .cue) |
| 存储 | 共享文件夹、知识库 | Git 仓库(版本化) |
| 执行时机 | 人工审核、定期巡检 | CI/CD 流水线、API 网关、准入控制器 |
| 变更影响 | 不可追溯、依赖个人经验 | 可回滚、可审计、可测试 |
| 一致性 | 因环境而异 | 跨环境统一 |
2.2 核心原则
策略即代码的实践建立在三大核心原则之上,三者缺一不可,共同构成可治理、可重复的策略管理体系。
2.2.1 声明式(Declarative)
策略只描述“期望状态”(What),而非“如何执行”(How)。例如:“所有生产环境的容器 CPU 限制不得超过 4 核”,而不是“写一个脚本检查每个 Pod 的 spec.containers[].resources.limits.cpu”。声明式策略天然具备幂等性,与底层平台解耦。
# 示例:OPA/Rego 声明式策略片段
package kubernetes.admission
deny[msg] {
input.request.operation == "CREATE"
container := input.request.object.spec.containers[_]
container.resources.limits.cpu > 4
msg := sprintf("容器 %v 的 CPU 限制超过 4 核", [container.name])
}
2.2.2 版本化(Versioned)
策略代码与应用程序代码一同纳入 Git 版本控制。每一次策略变更都产生明确的提交记录、作者、时间戳和变更说明。版本化带来的关键能力包括:
- 审计追溯: 谁在何时修改了哪条策略?
- 回滚: 策略误判导致阻断时,可快速恢复到上一个稳定版本。
- 分支策略: 开发环境使用宽松策略,生产环境使用严格策略,通过 Git 分支管理。
- Code Review: 策略变更必须经过 Pull Request 评审,避免单点失误。
2.2.3 自动化(Automated)
策略的评估、执行与反馈完全由机器驱动,无需人工介入。自动化体现在三个层面:
- 集成测试: 策略代码提交后,自动运行单元测试与集成测试,验证策略逻辑正确性。
- 准入控制: 在 Kubernetes 资源创建/更新时,由 Admission Controller 实时调用策略引擎,拒绝违规请求。
- 持续合规: 定时或事件驱动地扫描运行中资源,发现漂移或违规后自动告警或修复。
实践提示: 自动化不是“一次性配置”,而是需要与 CI/CD 流水线深度集成。建议在 Pipeline 中设置“策略检查”阶段,阻断不合规的部署。
2.3 策略即代码的核心价值
引入策略即代码后,组织在效率、安全、合规三个维度获得显著收益。以下通过一张架构图展示其价值闭环:
2.4 价值总结
| 价值维度 | 具体收益 | 典型场景 |
|---|---|---|
| 效率提升 | 策略变更分钟级生效;减少人工审核等待;跨环境复用策略库 | 新环境上线时,直接复用 Git 仓库中的策略代码 |
| 安全加固 | 阻止高危配置(如特权容器、HostPath 挂载);强制加密传输 | Kubernetes 准入控制器拒绝 privileged: true 的 Pod |
| 合规审计 | 每次策略评估记录日志;满足 SOC2、PCI-DSS 等合规要求 | 审计员直接查看 Git 提交历史,无需询问“谁改过策略” |
| 团队协作 | 开发、安全、运维共用同一套策略语言;减少沟通摩擦 | 安全团队提交 PR,运维团队 Review 后合并 |
常见误区: 策略即代码不是“把文档翻译成代码”就结束了。如果策略代码没有经过测试、没有集成到 CI/CD、没有版本管理,它只是另一种形式的“静态文档”。真正的价值在于 自动化执行 与 持续治理。
2.5 策略即代码在资源配额模型中的定位
在本课程后续章节中,策略即代码将作为资源配额模型的核心“控制面”。具体而言:
- 定义配额边界: 使用声明式策略描述每个命名空间、每个团队的最大 CPU/内存/存储量。
- 动态调整: 结合环境标签(dev/staging/prod)自动应用不同配额策略。
- 违规告警: 当资源使用接近配额上限时,策略引擎自动触发告警或扩容审批流程。
下图展示了策略即代码在资源配额模型中的执行流程: