k8s笔记29--使用kyverno提高运维效率

k8s笔记29--使用kyverno提高运维效率

  • 介绍
  • 原理
  • 安装
  • 应用场景
    • 自动修正测试环境pod资源
    • 强制 Pod 标签
    • 限制容器镜像来源
    • 禁止特权容器
    • 其它潜在场景
  • 注意事项
  • 说明

介绍

Kyverno是一个云原生的策略引擎,它最初是为k8s构建的,现在也可以在k8s集群之外用作统一的策略语言。其允许平台工程师自动化安全、合规和关于验证的最佳实践,并为相关团队提供安全的自助服务。
在 K8S的复杂生态系统中,确保集群资源的合规性和安全性是一项极具挑战的任务。Kyverno 作为一个强大的k8s策略引擎,为我们提供了一种有效的解决方案。本文将深入探讨 Kyverno 的核心原理、经典案例以及使用过程中的注意事项。

原理

Kyverno 通过 Kubernetes 的准入控制器(Admission Controller)机制来实现策略的执行。当用户向 Kubernetes API Server 提交资源创建、更新或删除请求时,准入控制器会拦截这些请求,并将其发送给 Kyverno 进行策略检查。
Kyverno 的策略以自定义资源定义(CRD)的形式存在,用户可以通过编写 YAML 文件来定义各种策略规则。这些规则可以基于资源的类型、名称、标签选择器等属性进行匹配,并执行相应的操作,如拒绝请求、修改资源或添加注释等。
例如,我们可以定义一个策略,要求所有新建的 Pod 必须包含特定的标签。当用户尝试创建一个不包含该标签的 Pod 时,Kyverno 会根据策略规则拒绝这个请求,从而确保集群中所有 Pod 都符合我们的标签规范。

kyverno逻辑架构图:
https://kyverno.io/docs/introduction/how-kyverno-works/
在这里插入图片描述
策略和规则的运行方式:
https://kyverno.io/docs/kyverno-policies/
如下图所示,一个Policy可以包含多个Rule,每个规则必须包含一个Match(Exclude可选)和validate,mutate,generate,verifyImages等选项之一。
策略可以定义为集群层面的ClusterPolicy,也可以定义为命名空间层面的Policy。
在这里插入图片描述

安装

安装文档:https://kyverno.io/docs/installation/
可以直接通过yaml的方式安装,也可以通过helm的方式安装
yaml安装方法:

kubectl create -f https://github.com/kyverno/kyverno/releases/download/v1.13.0/install.yaml

helm安装方法:

单机版本:
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
helm install kyverno kyverno/kyverno -n kyverno --create-namespace

高可用版本:
helm install kyverno kyverno/kyverno -n kyverno --create-namespace \
--set admissionController.replicas=3 \
--set backgroundController.replicas=3 \
--set cleanupController.replicas=3 \
--set reportsController.replicas=3

安装成功会有如下4个running的deploy

$ kubectl -n kyverno get deploy
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
kyverno-admission-controller    1/1     1            1           24d
kyverno-background-controller   1/1     1            1           24d
kyverno-cleanup-controller      1/1     1            1           24d
kyverno-reports-controller      1/1     1            1           24d

注意:不同版本的kyverno支持的k8s版本有限,安装前可以在官方文档查看版本支持信息

应用场景

自动添加DR的outlierDetection
火山迁移期间,新建DR的时候会默认添加outlierDetection,确保优先网格内服务的稳定性
使用一下策略后,新建DR,如果没有trafficPolicy属性则会自动补充策略中的内容。
策略内容

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: general-namespace-add-workload-dr-outlier-detection
spec:
  admission: true
  background: true
  rules:
  - exclude:
      all:
      - resources:
          namespaces:
          - quicksilver
          - appsvr
    match:
      all:
      - resources:
          kinds:
          - networking.istio.io/v1beta1/DestinationRule
    mutate:
      patchStrategicMerge:
        spec:
          +(trafficPolicy):
            outlierDetection:
              baseEjectionTime: 60s
              consecutive5xxErrors: 0
              consecutiveLocalOriginFailures: 10
              interval: 10s
              maxEjectionPercent: 80
              splitExternalLocalOriginErrors: true
    name: general-namespace-add-workload-dr-outlier-detection

自动修正测试环境pod资源

测试环境主动限制指定命名空间的服务资源request值,可以显著降低业务request过多空资源

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: ebc-default-cpu-resources
spec:
  background: true
  rules:
    - name: default-cpu-resources
      match:
        any:
        - resources:
            kinds:
              - Pod
            namespaces:
              - ebc-aladdinsite
              - ebc-bpm
      exclude:
        any:
        - resources:
            kinds:
              - Pod
            selector:
              matchLabels:
                app: nacos
        - resources:
            kinds:
              - Pod
            selector:
              matchLabels:
                app.kubernetes.io/name: ebc-ldap
      mutate:
        patchStrategicMerge:
          spec:
            containers:
              - (name): "*"
                resources:
                  requests:
                    cpu: "100m"
                    memory: "500Mi"
                  limits:
                    cpu: "2000m"
                    memory: "4000Mi"
    - name: set-resources-init-containers
      match:
        any:
        - resources:
            kinds:
              - Pod
            namespaces:
              - ebc-aladdinsite
              - ebc-bpm
      preconditions:
        all:
        - key: "{{ request.object.spec.initContainers || '' }}"
          operator: NotEquals
          value: ""
      mutate:
        patchStrategicMerge:
          spec:
            initContainers:
              - (name): "*"
                resources:
                  requests:
                    cpu: "100m"
                    memory: "200Mi"
                  limits:
                    cpu: "1000m"
                    memory: "2000Mi"

也可以通过如下方式设置资源请求和限制

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: test-kyverno-set-resource-limits
spec:
  validationFailureAction: enforce
  rules:
  - name: set-cpu-memory-limits
    match:
      resources:
        kinds:
          - Deployment
        namespaces:
          - test-kyverno 
    mutate:
      patchesJson6902:
      - op: add
        path: /spec/template/spec/containers/0/resources
        value:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"

强制 Pod 标签

确保所有部署到集群中的 Pod 都带有特定的标签,用于资源管理和监控。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: test-kyverno-enforce-pod-labels
spec:
  validationFailureAction: enforce
  rules:
  - name: check-pod-labels
    match:
      resources:
        kinds:
          - Pod
        namespaces:
          - test-kyverno
    validate:
      message: "Pod must have 'environment' and 'app' labels."
      pattern:
        metadata:
          labels:
            environment: "?*"
            app: "?*"

此时创建一个缺少label的deploy就会报错, 加上 environment 标签后就可以正常访创建了

$ vim test-nginx-with-label.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test2-deployment
  namespace: test-kyverno
  labels:
    app: test2
    # environment: prod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test2
      # environment: prod
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: test2
        # environment: prod
    spec:
      containers:
        - name: test2
          image: nginx:1.23
          ports:
            - containerPort: 80
              protocol: TCP
          resources: {}
              
$ kubectl apply -f test-nginx-with-label.yaml 
The Deployment "test2-deployment" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"test2"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

限制容器镜像来源

为了保障安全,只允许从特定的镜像仓库拉取容器镜像

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: test-kyverno-restrict-image-registry
spec:
  validationFailureAction: enforce
  rules:
  - name: check-image-registry
    match:
      resources:
        kinds:
          - Pod
        namespaces:
          - test-kyverno 
    validate:
      message: "Only images from 'my-allowed-registry.com' are allowed."
      pattern:
        spec:
          containers:
          - image: my-allowed-registry.com/*

此时创建非my-allowed-registry.com 镜像的pod会报错

$ vim test-nginx-with-image-registry.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test2-deployment
  namespace: test-kyverno
  labels:
    app: test2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test2
  template:
    metadata:
      labels:
        app: test2
    spec:
      containers:
        - name: test2
          image: nginx:1.23
          # image: my-allowed-registry.com/nginx:1.23
          ports:
            - containerPort: 80
              protocol: TCP
          resources: {}

$ kubectl apply -f test-nginx-with-image-registry.yaml 
Error from server: error when creating "test-nginx-with-image-registry.yaml": admission webhook "validate.kyverno.svc-fail" denied the request: 

resource Deployment/test-kyverno/test2-deployment was blocked due to the following policies 

test-kyverno-restrict-image-registry:
  autogen-check-image-registry: 'validation error: Only images from ''my-allowed-registry.com''
    are allowed. rule autogen-check-image-registry failed at path /spec/template/spec/containers/0/image/'

禁止特权容器

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: test-kyverno-prohibit-privileged-containers
spec:
  validationFailureAction: enforce
  rules:
  - name: check-privileged
    match:
      resources:
        kinds:
          - Pod
        namespaces:
          - test-kyverno 
    validate:
      message: "Privileged containers are not allowed."
      pattern:
        spec:
          containers:
          - privileged: false

开启特权就会报错

$ vim test-nginx-with-prohibit-privileged-containers.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test2-deployment
  namespace: test-kyverno
  labels:
    app: test2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test2
  template:
    metadata:
      labels:
        app: test2
    spec:
      containers:
        - name: test2
          image: nginx:1.23
          ports:
            - containerPort: 80
              protocol: TCP
          resources: {}
          securityContext:
            privileged: true

$ kubectl apply -f test-nginx-with-prohibit-privileged-containers.yaml 
Error from server: error when creating "test-nginx-with-prohibit-privileged-containers.yaml": admission webhook "validate.kyverno.svc-fail" denied the request: 

resource Deployment/test-kyverno/test2-deployment was blocked due to the following policies 

test-kyverno-prohibit-privileged-containers:
  autogen-check-privileged: 'validation error: Privileged containers are not allowed.
    rule autogen-check-privileged failed at path /spec/template/spec/containers/0/privileged/'

其它潜在场景

  1. 新建命名空间的时候创建对应的configmap
  2. 新建命名空间的时候创建对应的resource quote
  3. 给deploy添加默认的环境变量
  4. 限制pod默认安全策略

注意事项

  1. 策略优先级
    当存在多个策略时,需要注意策略的优先级设置。Kyverno 按照策略的名称顺序进行匹配和执行,因此需要合理命名策略以确保正确的执行顺序。
  2. 资源匹配规则
    在编写策略时,要仔细定义资源的匹配规则,避免误判或漏判。例如,使用通配符时要确保其范围符合预期。
  3. 测试环境
    在将策略应用到生产环境之前,务必在测试环境中进行全面且充分的测试,确保策略的正确性与有效性,防止因策略错误导致业务中断。
  4. 性能影响
    尽管Kyverno的设计旨在实现高效运行,但大量复杂的策略仍可能对Kubernetes API Server的性能产生一定影响。因此,需要定期评估和优化策略,以保障系统的稳定运行。

说明

环境:
k8s: v1.30.0
kyverno: v1.11.1
参考文档:
https://kyverno.io/docs/introduction/#quick-start-guides
https://github.com/kyverno/kyverno/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/952622.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何理解机器学习中的线性模型 ?

在机器学习中,线性模型是一类重要且基础的模型,它假设目标变量(输出)是输入变量(特征)的线性组合。线性模型的核心思想是通过优化模型的参数,使模型能够捕捉输入与输出之间的线性关系。以下是线…

数据结构初阶---排序

一、排序相关概念与运用 1.排序相关概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的…

树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍

文章目录 1 GPIO编码方式1.1 管脚信息1.2 使用场合1.3 I2C总线1.4 SPI总线2 RPI.GPIO2.1 PWM脉冲宽度调制2.2 静态函数2.2.1 函数setmode()2.2.2 函数setup()2.2.3 函数output()2.2.4 函数input()2.2.5 捕捉引脚的电平改变2.2.5.1 函数wait_for_edge()2.2.5.2 函数event_detect…

学习RocketMQ

1.为什么要用MQ? 消息队列是一种“先进先出”的数据结构 其应用场景主要包含以下4个方面: 1.1 异步解耦​ 最常见的一个场景是用户注册后,需要发送注册邮件和短信通知,以告知用户注册成功。传统的做法有以下两种: …

3DGabor滤波器实现人脸特征提取

import cv2 import numpy as np# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # 相位偏移# 生成 Gabor 滤…

LabVIEW自动扫描与图像清晰度检测

要在LabVIEW中实现通过电机驱动相机进行XY方向扫描,找到物品并获取最清晰的图像,可以采用以下方案: 1. 系统概述 硬件组成:电机驱动的XY扫描平台、工业相机、控制器(如NI的运动控制卡)、计算机。 软件平台…

Vue3(一)

1.Vue3概述 Vue3的API由Vue2的选项式API改为了组合式API。但是,也是Vue2中的选项式API也是兼容的。 2.创建Vue3项目 create-vue 是 Vue 官方新的脚手架工具,底层切换到了 vite。使用create-vue创建项目的步骤如下: 安装 create-vue npm i…

使用wav2vec 2.0进行音位分类任务的研究总结

使用wav2vec 2.0进行音位分类任务的研究总结 原文名称: Using wav2vec 2.0 for phonetic classification tasks: methodological aspects 研究背景 自监督学习在语音中的应用 自监督学习在自动语音识别任务中表现出色,例如说话人识别和验证。变换器模型…

STM32学习(十)

I2C模块内部结构 I2C(Inter-Integrated Circuit)模块是一种由Philips公司开发的二线式串行总线协议,用于短距离通信,允许多个设备共享相同的总线‌。 ‌硬件连接简单‌:I2C通信仅需要两条总线,即SCL&…

深入Android架构(从线程到AIDL)_22 IPC的Proxy-Stub设计模式04

目录 5、 谁来写Proxy及Stub类呢? 如何考虑人的分工 IA接口知识取得的难题 在编程上,有什么技术可以实现这个方法? 范例 5、 谁来写Proxy及Stub类呢? -- 强龙提供AIDL工具,给地头蛇产出Proxy和Stub类 如何考虑人的分工 由框架开发者…

Mysql--运维篇--日志管理(连接层,SQL层,存储引擎层,文件存储层)

MySQL提供了多种日志类型,用于记录不同的活动和事件。这些日志对于数据库的管理、故障排除、性能优化和安全审计非常重要。 一、错误日志 (Error Log) 作用: 记录MySQL服务器启动、运行和停止期间遇到的问题和错误信息。 查看: 默认情况下…

现代谱估计的原理及MATLAB仿真(二)(AR模型法、MVDR法、MUSIC法)

现代谱估计的原理及MATLAB仿真AR参数模型法(参数模型功率谱估计)、MVDR法(最小方差无失真响应法)、MUSIC法(多重信号分类法) 文章目录 前言一、AR参数模型1 原理2 MATLAB仿真 二、MVDR法1 原理2 MATLAB仿真…

搭建docker私有化仓库Harbor

Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…

Linux (CentOS) 安装 Docker 和 Docker Compose

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …

简单说一下 类

类的定义 类是用来对一个实体(对象)进行描述,类就是用来描述这个对象具有一些什么属性。 类的定义格式 //创建类 class ClassName{ field; //简单概述为字段(属性)或者成员变量 method; //简单概述为行为或者是成员方法 } cl…

Windows11环境下设置MySQL8字符集utf8mb4_unicode_ci

1.关闭MySQL8的服务CTRLshiftESC,找到MySQL关闭服务即可 2.找到配置文件路径(msi版本默认) C:\ProgramData\MySQL\MySQL Server 8.0 3.使用管理员权限编辑my.ini文件并保存 # Other default tuning values # MySQL Server Instance Config…

机器学习实战——K-近邻法(K-Nearest Neighbors,KNN)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​ ​​ 在机器学习的广阔领域中,K-近邻法(KNN) 是一种既简单又强大的非参数分类方法。尽管其…

《Opencv》图像的旋转

一、使用numpy库实现 np.rot90(img,-1) 后面的参数为-1时事顺时针旋转,为1时是逆时针旋转。 import cv2 import numpy as np img cv2.imread(./images/kele.png) """方法一""" # 顺时针90度 rot_1 np.rot90(img,-1) # 逆时针90度…

模型 九屏幕分析法

系列文章 分享 模型,了解更多👉 模型_思维模型目录。九屏幕法:全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机,为了全面评估市场潜力和风险,他们…