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

参考文档:

  1. https://github.com/kyverno/kyverno
  2. https://kyverno.io/docs/introduction/
  3. https://htmlpreview.github.io/?https://github.com/kyverno/kyverno/blob/main/docs/crd/v1/index.html#kyverno.io/v1.ClusterPolicy
  4. https://github.com/kyverno/policies
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐