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 的麻烦。