Kyverno是专为k8s设计的策略引擎,有以下特性,
直接用helm部署
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
helm install kyverno kyverno/kyverno -n kyverno --create-namespace
查看服务状态,
[root@master kyverno]# kubectl get po -n kyverno
NAME READY STATUS RESTARTS AGE
kyverno-5bfb99b9c9-qwjc2 1/1 Running 0 42s
策略可以定义为集群范围(ClusterPolicy),也可以定义在某个namespace内(Policy)。
支持match(必要)和exclude(可选)两个匹配方式,支持validate, mutate, generate, 和verifyImages四种审计声明,并且一条规则只能包含其中一种声明。

我们以禁止创建不带app.kubernetes.io/name label的pod为例,
kubectl create -f- << EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: enforce
rules:
- name: check-for-labels
match:
any:
- resources:
kinds:
- Pod
validate:
message: "label 'app.kubernetes.io/name' is required"
pattern:
metadata:
labels:
app.kubernetes.io/name: "?*"
EOF
然后创建一个centos pod,看下是否能成功,
[root@master home]# kubectl run -it centos --image=centos:7 -- /bin/bash
Error from server: admission webhook "validate.kyverno.svc-fail" denied the request:
resource Pod/default/centos was blocked due to the following policies
require-labels:
check-for-labels: 'validation error: label ''app.kubernetes.io/name'' is required.
Rule check-for-labels failed at path /metadata/labels/app.kubernetes.io/name/'
可见,我们的操作被deny了。如果我们加上label,pod便可以成功创建
[root@master home]# kubectl run -it centos --image=centos:7 --labels app.kubernetes.io/name=centos -- /bin/bash
If you don't see a command prompt, try pressing enter.
[root@centos /]#
默认情况下Kyverno会插入一个annotation,用于对通过指定controller创建的资源自动生成审计规则,这样避免对所有pod显示声明,可以按需修改
pod-policies.kyverno.io/autogen-controllers=DaemonSet,Deployment,Job,StatefulSet,CronJob
应用策略规则后,我们就可以查看下整个集群的审计情况,
[root@master kyverno]# kubectl get polr -A
NAMESPACE NAME PASS FAIL WARN ERROR SKIP AGE
cert-manager polr-ns-cert-manager 4 0 0 0 0 23m
crt-test polr-ns-crt-test 0 2 0 0 0 23m
default polr-ns-default 0 0 0 0 0 15m
external-dns polr-ns-external-dns 1 0 0 0 0 23m
ingress-nginx polr-ns-ingress-nginx 1 0 0 0 0 23m
istio-system polr-ns-istio-system 1 3 0 0 0 23m
kubernetes-dashboard polr-ns-kubernetes-dashboard 0 2 0 0 0 23m
参考文档: