Kyverno 在很多组织里的归属很明确:安全团队负责推动,安全预算负责采购,安全演示文稿负责介绍。但“安全”只是它最常见的使用场景之一。更准确的理解是:Kyverno 是 Kubernetes 平台上的策略执行原语,能够把组织规则转化为集群中的验证、变更和生成行为。
这个定位变化会直接影响部署方式、责任边界和投入回报。把 Kyverno 当成一个安全工具,往往会让它只覆盖镜像扫描、Pod 安全或合规检查;把它当成平台能力,则可以让应用平台、开发者体验、运维和安全团队共同使用同一套策略机制。
从“安全控制点”扩展为“平台规则引擎”
安全团队关心的规则通常包括:镜像必须来自可信仓库、工作负载不能使用特权模式、资源必须带有负责人标签、生产命名空间必须配置网络策略。这些规则当然适合由 Kyverno 执行。
但平台团队同样会遇到大量重复约束:
- 新建 Deployment 时自动补充默认标签。
- 要求服务设置资源请求和限制。
- 为特定命名空间自动生成 NetworkPolicy 或 ConfigMap。
- 阻止不符合平台规范的对象进入集群。
- 以审计模式观察规则影响,再逐步切换为阻断模式。
这些事情的共同点不是“它们都属于安全”,而是“它们都需要在 Kubernetes 对象生命周期中稳定执行”。Kyverno 的组织归属因此不应只由安全风险决定,还应由谁维护平台约束、谁承担集群运行成本以及谁负责开发者工作流来决定。
归属团队决定了策略能否长期运行
如果 Kyverno 完全归安全团队所有,常见结果是策略关注点集中在风险阻断,而应用平台团队可能缺少参与感。开发者遇到部署失败时,也可能只看到一条安全错误,却不知道如何修改清单。
更可持续的做法是把它视为平台产品的一部分,并划清责任:
- 平台团队维护 Kyverno 控制器、策略仓库、发布流程和集群级默认规则。
- 安全团队定义高风险控制,例如特权容器、镜像来源和敏感能力。
- 应用团队负责修复自身工作负载违反规则的问题,并参与规则评审。
- 运维团队关注策略控制器的可用性、告警、容量和升级。
策略也应该像代码一样拥有明确的负责人、测试和变更记录。否则,规则越多,排障越困难;一条看似合理的策略,可能在全组织范围内阻塞发布。
一个可落地的策略例子
下面的示例假设你希望所有 Deployment 都必须设置 app.kubernetes.io/owner 标签。它属于平台治理规则,也可以服务于安全审计、成本归集和故障响应。示例使用 Enforce,不符合条件的对象会被拒绝;在生产环境启用前,可以先改成 Audit 观察影响。
将内容保存为 require-owner-label.yaml,再应用到集群:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-owner-label
annotations:
policies.kyverno.io/title: Require owner label
policies.kyverno.io/category: Platform Governance
spec:
validationFailureAction: Enforce
background: true
rules:
- name: check-owner-label
match:
any:
- resources:
kinds:
- Deployment
validate:
message: "Deployment must define app.kubernetes.io/owner."
pattern:
metadata:
labels:
app.kubernetes.io/owner: "?*"
可以这样安装或检查策略:
kubectl apply -f require-owner-label.yaml
kubectl get clusterpolicy require-owner-label
kubectl describe clusterpolicy require-owner-label
一个不符合规则的 Deployment 会被拒绝:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
spec:
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo
image: nginx:1.27
应用前,应该补上标签:
metadata:
name: demo
labels:
app.kubernetes.io/owner: team-payments
这个例子没有把 Kyverno 限定为“阻止危险配置”。它把组织信息直接变成集群中的可执行约束,后续可以用于查询资源负责人、分配成本、建立告警路由或辅助事故响应。
平台化时要控制策略的扩张速度
把 Kyverno 升级为平台原语,并不意味着所有规则都应该集中到一个策略仓库,更不意味着每一条偏好都值得阻断发布。策略需要明确区分三种状态:
- 观察:使用
Audit或报告机制了解现状,评估违反数量和修复成本。 - 提示:通过文档、开发者门户或 CI 检查提前反馈,让团队在部署前修复。
- 阻断:只对风险清晰、例外可管理、修复路径明确的规则使用
Enforce。
还要特别注意错误消息质量。Deployment rejected 对开发者几乎没有帮助;指出缺少哪个字段、为什么需要它、应该填什么格式,才能缩短排障时间。对跨团队共享的策略,例外机制、版本管理和回滚流程也必须提前设计。
一份组织落地清单
可以用下面的问题判断 Kyverno 是否已经从“安全工具”走向“平台能力”:
- 策略是否有平台、安全和应用团队共同参与的评审机制?
- 每条阻断规则是否都有负责人、例外流程和回滚方案?
- 新策略是否先以审计模式运行,并记录实际影响?
- 开发者能否在 CI 或提交阶段看到同样的验证结果?
- 策略错误消息是否明确告诉使用者如何修复?
- Kyverno 控制器是否纳入平台级监控、升级和容量管理?
- 组织是否把策略维护成本计入平台预算,而不只计入一次性的安全采购?
Kyverno 可以承担安全策略,但它的价值不应被安全部门的组织边界限制。更稳妥的定位是:它是 Kubernetes 平台上执行组织规则的一种基础能力。安全团队提供重要规则,平台团队提供运行底座,应用团队参与设计和修复,最终才能让策略既能降低风险,也能改善集群的一致性和开发体验。