Kyverno 是一款专为 Kubernetes 设计的策略引擎,相比 OPA 学习曲线平缓很多。它的"清理"(Cleanup)策略可以直接根据 Apply 操作批量清理违反规则的旧资源,常用于资源治理"熵增"问题。

背景:集群熵增

生产集群跑一段时间后,会有很多残留资源:Deployment 的 selector 不一致、Pod 没有声明 resource limit、Service 指向不存在的 Pod。这些"坏"资源会导致调度异常、监控告警噪音。

部署 Kyverno

推荐用 helm 安装,3 分钟内可以看到 Pod 全部 Running:

helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
helm install kyverno kyverno/kyverno \
  -n kyverno --create-namespace \
  --set backgroundController.enabled=true

编写清理策略

我们用一个实际例子:要求所有 Pod 必须声明 memory limit,否则自动删除并打 audit 事件。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-memory-limit
spec:
  validationFailureAction: Audit
  rules:
  - name: check-memory-limit
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "Pod 必须声明 memory limit"
      pattern:
        spec:
          containers:
          - resources:
              limits:
                memory: "?*"
    exclude:
      any:
      - resources:
          namespaces:
          - kube-system
想一键清扫所有已违反策略的历史资源?在 apply 完成后执行 kyverno apply policy.yaml --resource your-resource.yaml 即可触发 sweep。

结语

清理策略只是 Kyverno 的 1/4 玩法。下一篇会讲如何使用 Mutating 策略给所有 Pod 自动注入 sidecar,省去手动改 manifest 的麻烦。