别把 Kyverno 只放进安全部门:它更像 Kubernetes 的平台原语

2026-08-19 37 预计阅读时间: 1 分钟
来源: cncf.io AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

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 升级为平台原语,并不意味着所有规则都应该集中到一个策略仓库,更不意味着每一条偏好都值得阻断发布。策略需要明确区分三种状态:

  1. 观察:使用 Audit 或报告机制了解现状,评估违反数量和修复成本。
  2. 提示:通过文档、开发者门户或 CI 检查提前反馈,让团队在部署前修复。
  3. 阻断:只对风险清晰、例外可管理、修复路径明确的规则使用 Enforce

还要特别注意错误消息质量。Deployment rejected 对开发者几乎没有帮助;指出缺少哪个字段、为什么需要它、应该填什么格式,才能缩短排障时间。对跨团队共享的策略,例外机制、版本管理和回滚流程也必须提前设计。

一份组织落地清单

可以用下面的问题判断 Kyverno 是否已经从“安全工具”走向“平台能力”:

  • 策略是否有平台、安全和应用团队共同参与的评审机制?
  • 每条阻断规则是否都有负责人、例外流程和回滚方案?
  • 新策略是否先以审计模式运行,并记录实际影响?
  • 开发者能否在 CI 或提交阶段看到同样的验证结果?
  • 策略错误消息是否明确告诉使用者如何修复?
  • Kyverno 控制器是否纳入平台级监控、升级和容量管理?
  • 组织是否把策略维护成本计入平台预算,而不只计入一次性的安全采购?

Kyverno 可以承担安全策略,但它的价值不应被安全部门的组织边界限制。更稳妥的定位是:它是 Kubernetes 平台上执行组织规则的一种基础能力。安全团队提供重要规则,平台团队提供运行底座,应用团队参与设计和修复,最终才能让策略既能降低风险,也能改善集群的一致性和开发体验。


相关推荐