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)

策略的评估、执行与反馈完全由机器驱动,无需人工介入。自动化体现在三个层面:

  1. 集成测试: 策略代码提交后,自动运行单元测试与集成测试,验证策略逻辑正确性。
  2. 准入控制: 在 Kubernetes 资源创建/更新时,由 Admission Controller 实时调用策略引擎,拒绝违规请求。
  3. 持续合规: 定时或事件驱动地扫描运行中资源,发现漂移或违规后自动告警或修复。
实践提示: 自动化不是“一次性配置”,而是需要与 CI/CD 流水线深度集成。建议在 Pipeline 中设置“策略检查”阶段,阻断不合规的部署。

2.3 策略即代码的核心价值

引入策略即代码后,组织在效率、安全、合规三个维度获得显著收益。以下通过一张架构图展示其价值闭环:

策略即代码核心价值闭环 策略即代码 效率提升 自动化评估 · 快速迭代 安全加固 事前阻断 · 最小权限 合规审计 可追溯 · 可证明 声明式 期望状态 · 幂等 版本化 Git 管理 · 回滚 自动化 CI/CD · 准入控制

2.4 价值总结

价值维度 具体收益 典型场景
效率提升 策略变更分钟级生效;减少人工审核等待;跨环境复用策略库 新环境上线时,直接复用 Git 仓库中的策略代码
安全加固 阻止高危配置(如特权容器、HostPath 挂载);强制加密传输 Kubernetes 准入控制器拒绝 privileged: true 的 Pod
合规审计 每次策略评估记录日志;满足 SOC2、PCI-DSS 等合规要求 审计员直接查看 Git 提交历史,无需询问“谁改过策略”
团队协作 开发、安全、运维共用同一套策略语言;减少沟通摩擦 安全团队提交 PR,运维团队 Review 后合并
常见误区: 策略即代码不是“把文档翻译成代码”就结束了。如果策略代码没有经过测试、没有集成到 CI/CD、没有版本管理,它只是另一种形式的“静态文档”。真正的价值在于 自动化执行 与 持续治理。

2.5 策略即代码在资源配额模型中的定位

在本课程后续章节中,策略即代码将作为资源配额模型的核心“控制面”。具体而言:

  • 定义配额边界: 使用声明式策略描述每个命名空间、每个团队的最大 CPU/内存/存储量。
  • 动态调整: 结合环境标签(dev/staging/prod)自动应用不同配额策略。
  • 违规告警: 当资源使用接近配额上限时,策略引擎自动触发告警或扩容审批流程。

下图展示了策略即代码在资源配额模型中的执行流程:

策略即代码在资源配额模型中的执行流程 Git 仓库 策略代码 策略引擎 OPA / Kyverno 准入控制器 Admission Webhook Kubernetes 资源创建/更新 拒绝 / 告警 / 审计日志