• 策略引擎Kyverno


    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看服务状态,

    [root@master kyverno]# kubectl get po -n kyverno
    NAME                       READY   STATUS    RESTARTS   AGE
    kyverno-5bfb99b9c9-qwjc2   1/1     Running   0          42s
    
    • 1
    • 2
    • 3

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    然后创建一个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/'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可见,我们的操作被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 /]# 
    
    • 1
    • 2
    • 3

    默认情况下Kyverno会插入一个annotation,用于对通过指定controller创建的资源自动生成审计规则,这样避免对所有pod显示声明,可以按需修改

    pod-policies.kyverno.io/autogen-controllers=DaemonSet,Deployment,Job,StatefulSet,CronJob
    
    • 1

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    参考文档:

    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
  • 相关阅读:
    Redis进行RCE利用总结
    RabbitMQ 知识点解读
    结合CAP理论分析ElasticSearch的分布式实现方式
    FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
    港联证券:上市公司三季报反映经济回暖向好态势
    SpringCloud进阶-消费者模块
    Flask框架创建项目初期总结
    RK3568 kernel阶段播放开机动画方案实现
    HTTP协议
    详解Shiro认证流程
  • 原文地址:https://blog.csdn.net/u010039418/article/details/126355995