第五篇:《策略即代码:OPA、Kyverno 与 Gatekeeper 实战》

📅 2026/8/18 12:07:58
第五篇:《策略即代码:OPA、Kyverno 与 Gatekeeper 实战》
在云原生环境中安全策略的执行不能依赖于人工检查——集群每天可能有数十次部署人工审核无法覆盖所有变更。策略即代码Policy as Code 将安全与合规策略以声明式的方式定义为代码并通过自动化机制在部署时强制执行。CNCF Kubernetes Policy Working Group 在 2025 年发布了 “Shift Down Security” 白皮书强调将安全嵌入 Kubernetes 平台本身而非事后附加。本文从策略即代码的核心理念讲起深入对比两大主流策略引擎 OPA/Gatekeeper 和 Kyverno并通过 Kyverno 的完整实战展示如何编写策略、在 CI/CD 中验证策略、以及在集群准入层强制执行策略帮你构建“不安全不部署”的自动化安全门禁。一、策略即代码核心理念与价值策略即代码Policy as Code 是指将安全、合规和治理策略以声明式的方式定义为代码存储在版本控制系统中并通过自动化机制在软件交付的各个阶段强制执行。核心价值策略执行的三个层级CI 阶段左移 在 PR 和构建阶段验证资源清单是否符合策略在部署前发现问题。准入控制阶段核心 在 Kubernetes API 层面拦截不合规的资源创建/更新请求。审计阶段右移 定期扫描集群中已存在的资源发现配置漂移和违规资源。二、策略引擎对比OPA/Gatekeeper vs Kyverno选型建议如果团队熟悉 Rego 或需要极其复杂的策略逻辑如跨资源关联检查选择 OPA/Gatekeeper。如果团队希望用 YAML 编写策略降低学习成本选择 Kyverno。三、Kyverno 实战编写与部署策略Kyverno 是 Kubernetes 原生的策略引擎使用 YAML 定义策略无需学习新语言。3.1 安装 Kyverno# 使用 Helm 安装helm repoaddkyverno https://kyverno.github.io/kyverno/ helm repo update helminstallkyverno kyverno/kyverno--namespacekyverno --create-namespace验证安装kubectl get pods-nkyverno3.2 场景一强制镜像来源可信以下策略拒绝所有来自非白名单仓库的镜像apiVersion:kyverno.io/v1kind:ClusterPolicymetadata:name:restrict-image-registriesspec:validationFailureAction:Enforce# Enforce阻断, Audit仅审计rules:-name:allow-trusted-registriesmatch:any:-resources:kinds:-Podvalidate:message:镜像必须来自可信仓库pattern:spec:containers:-image:trusted-registry.io/*效果任何使用非 trusted-registry.io 镜像的 Pod 将被拒绝创建。3.3 场景二强制资源配额以下策略要求所有 Pod 必须设置 CPU 和内存的 requests 和 limitsapiVersion:kyverno.io/v1kind:ClusterPolicymetadata:name:require-resource-limitsspec:validationFailureAction:Enforcerules:-name:validate-resourcesmatch:any:-resources:kinds:-Podvalidate:message:所有 Pod 必须设置 CPU 和内存的 requests 和 limitspattern:spec:containers:-resources:requests:memory:?*cpu:?*limits:memory:?*cpu:?*“?*” 表示字段必须存在且非空。3.4 场景三禁止特权容器apiVersion:kyverno.io/v1kind:ClusterPolicymetadata:name:disallow-privileged-containersspec:validationFailureAction:Enforcerules:-name:no-privilegedmatch:any:-resources:kinds:-Podvalidate:message:禁止使用特权容器pattern:spec:containers:-securityContext:privileged:false3.5 场景四强制标签规范apiVersion:kyverno.io/v1kind:ClusterPolicymetadata:name:require-labelsspec:validationFailureAction:Enforcerules:-name:check-team-labelmatch:any:-resources:kinds:-Pod-Service-Deploymentvalidate:message:所有资源必须包含 team 标签pattern:metadata:labels:team:?*四、CI 阶段策略验证左移使用 Kyverno CLI 可以在 CI 阶段验证资源清单在部署前发现策略违规。4.1 安装 Kyverno CLIcurl-Lhttps://github.com/kyverno/kyverno/releases/latest/download/kyverno-cli_linux_amd64.tar.gz|tarxzsudomvkyverno /usr/local/bin/4.2 在 CI 中验证 YAML# 验证单个文件kyverno apply /path/to/resource.yaml--policy/path/to/policies/# 验证目录下所有 YAMLkyverno apply /path/to/manifests/--policy/path/to/policies/GitHub Actions 集成-name:Validate Kubernetes manifests with Kyvernouses:kyverno/action-kyverno-cliv1with:command:apply /path/to/manifests/--policy /path/to/policies/如果任何资源违反策略Kyverno CLI 将返回非零退出码阻断流水线。五、OPA/Gatekeeper 快速入门对于需要更复杂策略逻辑的场景OPA Gatekeeper 提供了更强大的表达能力。5.1 安装 Gatekeeperkubectl apply-fhttps://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/deploy/gatekeeper.yaml5.2 编写 Rego 策略以下策略使用 Rego 语言强制所有 Pod 必须设置资源限制regopackage k8srequiredresourcesviolation[{“msg”: msg}] {container : input.review.object.spec.containers[_]not container.resourcesmsg : sprintf(“容器 %v 未设置 resources”, [container.name])}5.3 部署策略apiVersion:constraints.gatekeeper.sh/v1beta1kind:K8sRequiredResourcesmetadata:name:require-resourcesspec:match:kinds:-apiGroups:[]kinds:[Pod]六、策略即代码的完整工作流text┌─────────────────────────────────────────────────────────────────────┐│ 策略即代码完整工作流 ││ ││ 1. 策略定义 ││ └── 将策略 YAML 提交到 Git 仓库如 policies/ ││ ││ 2. CI 阶段验证左移 ││ ├── PR 触发 Kyverno CLI 验证资源清单 ││ └── 违规则阻断合并 ││ ││ 3. 策略部署 ││ ├── CI 自动将策略应用到集群kubectl apply -f policies/ ││ └── 策略变更通过 Git 审计 ││ ││ 4. 准入控制执行 ││ ├── 所有资源创建/更新请求经过 Kyverno/OPA 检查 ││ └── 违规请求被拒绝Enforce 模式 ││ ││ 5. 定期审计 ││ └── 扫描集群中已存在的资源发现配置漂移 │└─────────────────────────────────────────────────────────────────────┘七、小结策略即代码 将安全与合规策略声明式定义并自动化执行实现“安全左移 准入控制 持续审计”的完整闭环。Kyverno 使用 YAML 定义策略学习曲线平缓适合 Kubernetes 原生团队OPA/Gatekeeper 使用 Rego 语言灵活性更高适合复杂策略场景。策略分层CI 阶段验证 → 准入控制执行 → 定期审计发现漂移。CI 集成使用 Kyverno CLI 在 CI 中验证资源清单将策略检查左移到开发阶段。