当前位置: 首页 > news >正文

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: truebackground: truerules:- exclude:all:- resources:namespaces:- quicksilver- appsvrmatch:all:- resources:kinds:- networking.istio.io/v1beta1/DestinationRulemutate:patchStrategicMerge:spec:+(trafficPolicy):outlierDetection:baseEjectionTime: 60sconsecutive5xxErrors: 0consecutiveLocalOriginFailures: 10interval: 10smaxEjectionPercent: 80splitExternalLocalOriginErrors: truename: general-namespace-add-workload-dr-outlier-detection

自动修正测试环境pod资源

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

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:name: ebc-default-cpu-resources
spec:background: truerules:- name: default-cpu-resourcesmatch:any:- resources:kinds:- Podnamespaces:- ebc-aladdinsite- ebc-bpmexclude:any:- resources:kinds:- Podselector:matchLabels:app: nacos- resources:kinds:- Podselector:matchLabels:app.kubernetes.io/name: ebc-ldapmutate:patchStrategicMerge:spec:containers:- (name): "*"resources:requests:cpu: "100m"memory: "500Mi"limits:cpu: "2000m"memory: "4000Mi"- name: set-resources-init-containersmatch:any:- resources:kinds:- Podnamespaces:- ebc-aladdinsite- ebc-bpmpreconditions:all:- key: "{{ request.object.spec.initContainers || '' }}"operator: NotEqualsvalue: ""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: enforcerules:- name: set-cpu-memory-limitsmatch:resources:kinds:- Deploymentnamespaces:- test-kyverno mutate:patchesJson6902:- op: addpath: /spec/template/spec/containers/0/resourcesvalue: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: enforcerules:- name: check-pod-labelsmatch:resources:kinds:- Podnamespaces:- test-kyvernovalidate: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-deploymentnamespace: test-kyvernolabels:app: test2# environment: prod
spec:replicas: 1selector:matchLabels:app: test2# environment: prodtemplate:metadata:creationTimestamp: nulllabels:app: test2# environment: prodspec:containers:- name: test2image: nginx:1.23ports:- containerPort: 80protocol: TCPresources: {}$ 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: enforcerules:- name: check-image-registrymatch:resources:kinds:- Podnamespaces:- 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-deploymentnamespace: test-kyvernolabels:app: test2
spec:replicas: 1selector:matchLabels:app: test2template:metadata:labels:app: test2spec:containers:- name: test2image: nginx:1.23# image: my-allowed-registry.com/nginx:1.23ports:- containerPort: 80protocol: TCPresources: {}$ 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: enforcerules:- name: check-privilegedmatch:resources:kinds:- Podnamespaces:- 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-deploymentnamespace: test-kyvernolabels:app: test2
spec:replicas: 1selector:matchLabels:app: test2template:metadata:labels:app: test2spec:containers:- name: test2image: nginx:1.23ports:- containerPort: 80protocol: TCPresources: {}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/

相关文章:

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

k8s笔记29--使用kyverno提高运维效率 介绍原理安装应用场景自动修正测试环境pod资源强制 Pod 标签限制容器镜像来源禁止特权容器其它潜在场景 注意事项说明 介绍 Kyverno是一个云原生的策略引擎,它最初是为k8s构建的,现在也可以在k8s集群之外用作统一的…...

Life Long Learning(李宏毅)机器学习 2023 Spring HW14 (Boss Baseline)

1. 终身学习简介 神经网络的典型应用场景是,我们有一个固定的数据集,在其上训练并获得模型参数,然后将模型应用于特定任务而无需进一步更改模型参数。 然而,在许多实际工程应用中,常见的情况是系统可以不断地获取新数据,例如 Web 应用程序中的新用户数据或自动驾驶中的…...

libc.so.6不兼容

1、查看电脑所有libc.so.6 daviddavid-Shangqi-X4270:~/MySoft/ubuntusoft$ locate libc.so.6 /home/david/MySoft/ubuntusoft/EXEApp/libc.so.6 /home/david/MySoft/ubuntusoft/EXEApp_TEST/libc.so.6 /home/david/MySoft/ubuntusoft/RTMG_APP/libc.so.6 /home/david/MySoft/…...

树的模拟实现

一.链式前向星 所谓链式前向星,就是用链表的方式实现树。其中的链表是用数组模拟实现的链表。 首先我们需要创建一个足够大的数组h,作为所有结点的哨兵位。创建两个足够大的数组e和ne,一个作为数据域,一个作为指针域。创建一个变…...

AsyncOperation.allowSceneActivation导致异步加载卡死

先看这段代码,有个诡异的问题,不确定是不是bug public class Test : MonoBehaviour {void Start(){StartCoroutine(LoadScene(Ego.LoadingLevel));}IEnumerator LoadScene(string sceneName){LoadingUI.UpdateProgress(0.9f);yield return new WaitForS…...

如何搭建 Vue.js 开源项目的 CI/CD 流水线

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

单通道串口服务器(三格电子)

一、产品介绍 1.1 功能简介 SG-TCP232-110 是一款用来进行串口数据和网口数据转换的设备。解决普通 串口设备在 Internet 上的联网问题。 设备的串口部分提供一个 232 接口和一个 485 接口,两个接口内部连接,同 时只能使用一个口工作。 设 备 的网 口…...

【Excel/WPS】根据平均值,生成两列/多列指定范围的随机数/随机凑出两列数据

原理就是通过随机生成函数和平均值函数。 适用场景:在总体打分后,需要在小项中随机生成小分数 第一列:固定的平均值A2第二列: RANDBETWEEN(A2-10,A210)第三列:根据第二列用平均值函数算除 A2*2-B2这是随机值1的公式&am…...

使用网页版Jupyter Notebook和VScode打开.ipynb文件

目录 正文 1、网页版Jupyter Notebook查看 2、VScode查看 因为总是忘记查看文件的网址,收藏了但分类众多每次都找不到……当个记录吧(/捂脸哭)! 正文 此处以gitub中的某个仓库为例: https://github.com/INM-6/mu…...

记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据

文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据,页面卡死,如何优化??这里使用 分页 虚拟列表(vue-virtual-scroll-list),去模拟一个下拉的内容…...

CDA数据分析师一级经典错题知识点总结(5)

1、数值型缺失值用中位数补充,分类数据用众数补充。 2、偏态系数>1就是高度偏,0.5到1是中度。 3、分布和检验 在 t检验之前进行 F检验的目的是确保 t检验的方差齐性假设成立。如果 F检验结果显示方差不相等,则需要切换到调整后的 t 检验…...

服务器、电脑和移动手机操作系统

一、服务器操作系统 1、Windows Server 开发商是微软公司。友好的用户界面、与微软生态系统的高度集成、提供了广泛的企业级功能(如Active Directory、DNS、DHCP服务等)。适合需要大量运行Microsoft应用和服务的企业环境,如SQL Server等。经…...

深入解析 Flink 与 Spark 的性能差异

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...

如何在 Linux、MacOS 以及 Windows 中打开控制面板

控制面板不仅仅是一系列图标和菜单的集合;它是通往优化个人计算体验的大门。通过它,用户可以轻松调整从外观到性能的各种参数,确保他们的电脑能够完美地适应自己的需求。无论是想要提升系统安全性、管理硬件设备,还是简单地改变桌…...

微信小程序中 隐藏scroll-view 滚动条 网页中隐藏滚动条

在微信小程序中隐藏scroll-view的滚动条可以通过以下几种方法实现: 方法一:使用CSS隐藏滚动条 在小程序的样式文件中(如app.wxss或页面的.wxss文件),添加以下CSS代码来隐藏滚动条: scroll-view ::-webkit…...

Java 实现 Elasticsearch 查询当前索引全部数据

Java 实现 Elasticsearch 查询当前索引全部数据 需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后 需求背景 通常情况下,Elasticsearch 为了提高查询效率,对于不指定分页查询条数的查询语句,默认会返回10条数据。那么这就会有…...

android刷机

android ota和img包下载地址: https://developers.google.com/android/images?hlzh-cn android启动过程 线刷 格式:ota格式 模式:recovery 优点:方便、简单,刷机方法通用,不会破坏手机底层数据&#xff0…...

【25考研】西南交通大学计算机复试重点及经验分享!

一、复试内容 上机考试:考试题型为编程上机考试,使用 C 语言,考试时长包括 15 分钟模拟考试和 120 分钟正式考试,考试内容涵盖顺序结构、选择结构、循环结构、数组、指针、字符串处理、函数、递归、结构体、动态存储、链表等知识点…...

OpenCV相机标定与3D重建(49)将视差图(disparity map)重投影到三维空间中函数reprojectImageTo3D()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将视差图像重投影到3D空间。 cv::reprojectImageTo3D 是 OpenCV 库中的一个函数,用于将视差图(disparity map&#xff09…...

学习HTTP Range

HTTP Range 请求 一种通过指定文件字节范围加载部分数据的技术,广泛用于断点续传、流媒体播放、分布式文件系统的数据分片加载等场景。 请求格式-在请求头中使用 Range 字段指定所需的字节范围 Range: bytes0-1023// bytes0-1023:表示请求文件的第 0 …...

大语言模型训练的数据集从哪里来?

继续上篇文章的内容说说大语言模型预训练的数据集从哪里来以及为什么互联网上的数据已经被耗尽这个说法并不专业,再谈谈大语言模型预训练数据集的优化思路。 1. GPT2使用的数据集是WebText,该数据集大概40GB,由OpenAI创建,主要内…...

Webpack和Vite的区别

一、构建速度方面 webpack默认是将所有模块都统一打包成一个js文件,每次修改都会重写构建整个项目,自上而下串行执行,所以会随着项目规模的增大,导致其构建打包速度会越来越慢 vite只会对修改过的模块进行重构,构建速…...

【再谈设计模式】模板方法模式 - 算法骨架的构建者

一、引言 在软件工程、软件开发过程中,我们经常会遇到一些算法或者业务逻辑具有固定的流程步骤,但其中个别步骤的实现可能会因具体情况而有所不同的情况。模板方法设计模式(Template Method Design Pattern)就为解决这类问题提供了…...

Bytebase 3.1.1 - 可定制的快捷访问首页

🚀 新功能 可定制的快捷访问首页。 支持查询 Redis 集群中所有节点。 赋予项目角色时,过期时间可以定义精确到秒级的时间点。 🔔 重大变更 移除 Database 消息里的实例角色信息。调用 GetInstance 或 ListInstanceRoles 以获取实例角色信息…...

Java阶段四04

第4章-第4节 一、知识点 CSRF、token、JWT 二、目标 理解什么是CSRF攻击以及如何防范 理解什么是token 理解什么是JWT 理解session验证和JWT验证的区别 学会使用JWT 三、内容分析 重点 理解什么是CSRF攻击以及如何防范 理解什么是token 理解什么是JWT 理解session验…...

B2C API安全警示:爬虫之外,潜藏更大风险挑战

在数字化时代,B2C(Business-to-Consumer)电子商务模式已成为企业连接消费者、推动业务增长的重要桥梁。而B2C API(应用程序编程接口)作为企业与消费者之间数据交互的桥梁,其安全性更是至关重要。然而&#…...

OCR文字识别—基于PP-OCR模型实现ONNX C++推理部署

概述 PaddleOCR 是一款基于 PaddlePaddle 深度学习平台的开源 OCR 工具。PP-OCR是PaddleOCR自研的实用的超轻量OCR系统。它是一个两阶段的OCR系统,其中文本检测算法选用DB,文本识别算法选用CRNN,并在检测和识别模块之间添加文本方向分类器&a…...

如何播放视频文件

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节3. 示例代码4. 内容总结我们在上一章回中介绍了"如何获取文件类型"相关的内容,本章回中将介绍如何播放视频.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用的功能,不过Flutter官方…...

MySQL -- 约束

1. 数据库约束 数据库约束时关系型数据库的一个重要功能,主要的作用是保证数据的有效性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正确) 人工检查数据的完整性工作量非常大,在数据库中定义一些约束,那么数据在写入数据库的时候,就会帮我们做一些校验.并且约束一…...

php 使用simplexml_load_string转换xml数据格式失败

本文介绍如何使用php函数解析xml数据为数组。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…...

口碑优化/seo主要做什么工作内容

Kubelet Kubernetes 的初始化系统&#xff08;init system&#xff09; • 从不同源获取 Pod 清单&#xff0c;并按需求启停 Pod 的核心组件&#xff1a; • Pod 清单可从本地文件目录&#xff0c;给定的 HTTPServer 或 KubeAPIServer 等源头获取 • Kubelet 将运行时&#xf…...

天津网站建设维护/百度霸屏培训

typeof 可以判断简单数据类型&#xff0c; 数字返回number 字符串返回string undefined返回undefined null 返回object 布尔值返回Boolean&#xff0c; 函数返回function 数组和对象都会返回object&#xff0c; 因此typeof只可以作为区分简单数据类型的方法 2.instanceof 可以用…...

网站建设销售中遇到的问题/百度左侧排名

本文作者为携程平台UED团队&#xff0c;同时感谢机票、度假、酒店UED团队协同搭建插画系统。对于每一个设计师来说&#xff0c;插画总是让人喜爱又烦恼。喜爱是因为插画具有特殊的表现力、丰富的图形语言、鲜明的个性特征&#xff0c;运用在设计中能让产品更具感染力并打动人心…...

wordpress二维码动态图片大小/域名批量注册查询

在Linux系统中&#xff0c;我们查看、监控系统内存使用情况&#xff0c;一般最常用的命令就是free。free命令其实非常简单&#xff0c;参数也非常简单&#xff0c;但是里面很多知识点未必你都掌握了。下面总结一下我所了解的free命令。如有不足&#xff0c;敬请指出。文章很多知…...

2019建一个什么网站最好/上海seo培训中心

php的重定向&#xff0c;很简单&#xff0c;除去直接打印出重定向的JavaScript代码以外&#xff0c; 使用原生态的php重定向是这样的&#xff1a; <?php header("location: url"); exit; ?>一读到这条语句则会马上跳转到指定的重定向url。当然&#xff0c;P…...

大连最新消息今天/2022年搜索引擎优化指南

其实技术人和大众一样, 只是多了一层要与电脑交流的身份罢了. 而这样的一层应该是使得我们的生活更加的色彩化才是. 于是又注册了这个名为”左手代码”的订阅号. 始于代码, 又不仅仅是代码. 我想这才应该是一个技术人的初心吧. 2014年的那个暑假, 正好是我大学二年级结束, 或许…...