K8S策略引擎Kyverno
Kyverno是专为k8s设计的策略引擎,有以下特性,- policy作为k8s原生资源,不需额外语言支持,面向yaml编程即可- 可以校验,修改或者生成任何资源- 可以审计镜像来源和元数据- 可以使用label和通配符来选择资源- 可以通过admission controls阻止不符合规范的资源,并给出报告信息- 可以在应用到集群前进行测试
·
1 Kyverno
Kyverno是专为k8s设计的策略引擎,有以下特性,
- policy作为k8s原生资源,不需额外语言支持,面向yaml编程即可
- 可以校验,修改或者生成任何资源
- 可以审计镜像来源和元数据
- 可以使用label和通配符来选择资源
- 可以通过admission controls阻止不符合规范的资源,并给出报告信息
- 可以在应用到集群前进行测试
2 部署Kyverno
直接用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
3 Kyverno策略
策略可以定义为集群范围(ClusterPolicy),也可以定义在某个namespace内(Policy)。
支持match(必要)和exclude(可选)两个匹配方式,支持validate, mutate, generate, 和verifyImages四种审计声明,并且一条规则只能包含其中一种声明。
4 创建规则
我们以禁止创建不带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
5 查看审计报告
应用策略规则后,我们就可以查看下整个集群的审计情况,
[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
参考文档:
- https://github.com/kyverno/kyverno
- https://kyverno.io/docs/introduction/
- https://htmlpreview.github.io/?https://github.com/kyverno/kyverno/blob/main/docs/crd/v1/index.html#kyverno.io/v1.ClusterPolicy
- https://github.com/kyverno/policies
更多推荐
已为社区贡献25条内容
所有评论(0)