策略即代码的准入控制与流水线门禁
策略即代码把安全、合规和资源规范写成可测试、可版本化的规则,在 CI 和集群准入两个层面执行。CI 层反馈快,准入层是最后防线;只做其中一层都会漏。
上线顺序必须是 audit → warn → deny,每阶段至少观察一到两周。例外必须有 owner、范围和到期日。
Gatekeeper ConstraintTemplate:
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredresources
spec:
crd:
spec:
names:
kind: K8sRequiredResources
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredresources
violation[{"msg": msg}] {
c := input.review.object.spec.containers[_]
not c.resources.limits.memory
msg := sprintf("container %v missing memory limit", [c.name])
}
对应 Constraint:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredResources
metadata:
name: require-memory-limit
spec:
enforcementAction: deny
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
excludedNamespaces: ["kube-system"]
CI 层检查:
conftest test manifests/ --policy policy/ --output table
conftest verify --policy policy/
kyverno apply policy.yaml --resource deployment.yaml
kyverno test .
推广阶段与退出条件:
| 阶段 | 模式 | 最短观察期 | 进入下一阶段条件 |
|---|---|---|---|
| 1 | audit | 2 周 | 违规类型稳定,无新增误报 |
| 2 | warn | 1 周 | 业务已知晓并完成高风险修复 |
| 3 | deny | 长期 | 例外全部有 owner 和到期日 |
例外规则:
合上页面,先回答,再展开对照。