云原生之深入解析Kubernetes策略引擎对比:OPA/Gatekeeper与Kyverno

一、前言

① Kubernetes 策略

  • Kubernetes 的 Pod Security Policy,正如其名字所暗示的,仅是针对 Pod 工作的,是一种用来验证和控制 Pod 及其属性的机制。
  • 另外 PSP 只能屏蔽非法 Pod 的创建,无法执行任何补救/纠正措施。而 Gatekeeper 和 Kyverno 的作用范围就不是局限在 Pod 上,并且也有更多更深入的功能,而不只是简单的验证功能。
  • 策略引擎是一种能对整个 Kubernetes 环境进行全局控制的方法。

② Gatekeeper 简介

  • Gatekeeper 是一个由 Google、微软等多个公司合作推出的开源项目,后来捐赠给了 CNCF,现已经历了三次迭代。Gatekeeper 是通用策略引擎 Open Policy Agent(OPA)的 Kubernetes 专用实现。由于 Open Policy Agent 与 Gatekeeper 之间的关系,该项目经常被写成“OPA Gatekeeper”来表明这层关系。Gatekeeper 实现了请求验证功能,最近还加入了变异能力。
  • OPA 的一个主要特征是依赖于使用一种叫做 Rego 的专用编程语言,这种语言被用来实现策略决策的必要逻辑。通过 Rego,OPA 能够广泛适用于包括 Kubernetes 在内的多种不同的软件,实现高层次的逻辑操作。

③ Kyverno 简介

  • Kyverno 是来自 Nirmata 的开源项目,后来也捐赠给了 CNCF。和 Gatekeeper 一样,Kyverno 也是一个具有验证和变异能力的 Kubernetes 策略引擎,但是它还有生成资源的功能,最近还加入了 API 对象查询的能力。
  • 与 Gatekeeper 不同,Kyverno 原本就是为 Kubernetes 编写的。和 Gatekeeper 相比,Kyverno 除了对象生成功能之外,还无需专用语言即可编写策略,从实现语言的角度上来看,Kyverno 的模型更为简洁。

二、对比

  • 如下的三个表格对两个项目的特征和质量进行分类,并试图以最客观的方式进行对比,这些维度分别是:
    • 特征/功能维度用于描述技术属性;
    • 社区/生态系统维度用于描述落地情况和组织属性;
    • 杂项。

在这里插入图片描述
在这里插入图片描述

  • 注:
    • 无精确定义,Gatekeeper 看起来比 Kyverno 采用数量更多,但是并没有具体数字。
    • 无客观标准,Gatekeeper 历史更长,社区认可度可能更高。

在这里插入图片描述

  • 注:并没有统一的评判标准,这里的评价基于 Gatekeeper 的功能,而不是 Rego。

三、分析

① Gatekeeper 的优势

  • 能够表达非常复杂的策略;
  • 社区更为成熟;
  • 支持多副本模式,更好的可用性和伸缩性。

② Gatekeeper 的劣势

  • 需要编程语言支持,该语言的学习曲线较为陡峭,可能会产生大量技术债,并延长交付时间;
  • 变异能力还处在萌芽期;
  • 没有生成能力,意味着它的主要应用场景就在验证方面;
  • 策略复杂冗长,需要多个对象协同实现。

③ Kyverno 的优势

  • Kubernetes 风格的策略表达方式,非常易于编写;
  • 成熟的变异能力;
  • 独特的生成和同步能力,扩展了应用场景;
  • 快速交付,场景丰富。

④ Kyverno 的劣势

  • 受到语言能力的限制,难以实现复杂策略;
  • 较为年轻,社区接受度不高;
  • API 对象查询能力还很初级;
  • 没有高可用能力(还在路线图阶段)。

⑤ 具体分析

  • Kubernetes 是一个声明式的系统:用户向 Kubernetes 提出对状态的要求,Kubernetes 通过各种控制器,去协调观察到的状态,以使其与用户期望的状态一致,这就是云原生平台的核心价值主张。为了实现这一目标,逻辑实现的重任从用户身上转移到了平台本身,每个资源类型都存在一些内部逻辑,这些逻辑就是协调其状态所需的能力。
  • 对于 Gatekeeper 来说,到目前为止最大的弱点是它需要一种叫做 Rego 的专门的编程语言来实现这种逻辑,这种语言在其他地方都无法使用。这是一个现实,因为 OPA 是一个通用的策略引擎。只有通过 Gatekeeper 将其改编成 Kubernetes 形式,才能利用其能力。
  • 实际上,用户负责描述他们希望调和的对象(策略),以及提供必要的逻辑(Rego)来调和它。使用外部 DSL 来管理 Kubernetes 策略,在很多方面都会变得繁琐和复杂,并给项目增加技术债务。作为一种权衡,其明显的优势是可以实现非常强大的策略。毕竟,当一个人需要编写一种编程语言时,他只受限于该语言的能力及其输入。不过,如果可以在其他地方利用 OPA,就可以分摊这种费用。
  • 相比 Gatekeeper 来说,Kyverno 的第一印象就是没有那么复杂的技术需求。因为它是专门为 Kubernetes 构建的,并且用声明式的方法来表达策略,所以它的心理模型与 Kubernetes 对象的描述和协调方式是相同的。执行策略决策所需的逻辑被从用户的负担中移除,成为工具本身的领域。这种模式导致策略的编写方式得到了极大的简化,全面的降低了策略引擎的使用难度。
  • Kyverno 的编译和生成能力,使它从一个简单的准入控制器转变为一个真正的自动化工具。通过结合这三种能力,再加上最近增加的 API 查询能力,Kyverno 能够执行 Gatekeeper 所不能执行的任务,而且还能够消除可能在整个集群和/或组织中分散使用的其他和不同的工具。这种简单性加上它的自动化能力和对其他工具的整合,为新用户以及有经验的用户和操作者带来了巨大的价值。
  • 根据所介绍的信息,Kyverno 应该是应用 Kubernetes 策略的一个比较自然的选择。但如果用户符合下面两个用例中的一种或两种,就更应该选择 Gatekeeper。
    • 有一种需求和具体意图,使用一致的核心工具将策略应用于组织内不同的系统(即,不仅仅是 Kubernetes)。反对意见:根据经验,无论是在云原生社区内部还是外部,大多数组织目前已经在使用其他工具将策略应用于现有系统。这通常是因为这些系统以及为这些系统实施策略的软件在 Kubernetes 以及 OPA 和 Gatekeeper 之前就已经存在。此外,这些现有工具通常不要求使用编程语言来实现其策略。因此,考虑到现有的知识、运营和资本投资,大多数组织不太可能为了实现工具一致性带来的价值,选择放弃这些工具,转而使用技术负担较重的新工具。如果正在寻找一个跨 Kubernetes 和其他系统使用的单一策略引擎,Kyverno 不适合你。
    • 策略的复杂度很高。反对意见:根据经验,大多数 Kubernetes 用户都没有使用包括 PSP 在内的任何策略支持。而 2020 年对在 AWS 上运行容器化工作负载的客户的调查也得到了类似的结果,只有 49% 的客户使用策略。这些用户中的绝大多数都在做的是重复的策略——例如“容器不应该有特权”或“确保所有命名空间都带有给定的标签”或“验证 Pods 没有使用 hostPath 卷”等。“复杂”这个词是相对的,有点主观,但这样的策略表达方式绝对不复杂。Kyverno 允许以最简单的形式编写策略,这反过来又更容易推理和维护。如果要为一个更复杂、更困难的工具支付额外的价格,就应该尽量物尽其用,否则无法获得价值。如果无需实现高度复杂的策略,Gatekeeper 不会带来好处。

四、结论

  • Gatekeeper 和 Kyverno 项目本身都是有价值、有能力的策略引擎,每个项目都有各自的优缺点。最终,用户应该根据自己的需求和限制条件进行评估并做出最明智的决定,但作为一般建议,所有生产用户都应该计划使用策略引擎来保护集群的安全并简化 Kubernetes 管理。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

http与apache

目录 1.http相关概念 2.http请求的完整过程 3.访问浏览器背后的原理过程 4.动态页面与静态页面区别 静态页面: 动态页面: 5.http协议版本 6.http请求方法 7.HTTP协议报文格式 8.http响应状态码 1xx:提示信息 2xx:成功…

【C++11并发】Atomic 笔记

简介 用atomic定义的变量,支持原子操作,即要么全部完成操作,要不全部没有完成,我们是不可能看到中间状态。一般在多线程程序中,可以用atomic来完成数据同步。 标准库为我们主要提供了四类工具 atomic类模板操作atomi…

tomcat启动 页面报错404(3种解决方案)

1.端口号被占用 修改配置文件下的端口号:\apache-tomcat-8.5.57\conf\server.xml 我这里修改端口号为:9999 修改后页面输入:http://localhost:9999/ 2.没有配置环境变量 配置环境变量请查看:保姆级教程 3.查看下 apache-tomca…

SpringBoot Seata 死锁问题排查

现象描述:Spring Boot项目,启动的时候卡住了,一直卡在那里不动,没有报错,也没有日志输出 但是,奇怪的是,本地可以正常启动 好吧,姑且先不深究为什么本地可以启动而部署到服务器上就无…

【Flink系列五】Checkpoint及Barrier原理

本章内容 一致性检查点从检查点恢复状态检查点实现算法-barrier保存点Savepoint状态后端(state backend) 本文先设置一个前提,流处理的数据都是可回放的(可以理解成消费的kafka的数据) 一致性检查点(che…

单片机第三季-第四课:STM32下载、MDK和调试器

目录 1,扩展板使用的STM32芯片类型 2,使用普中科技软件下载程序 3,keil介绍 4,JLINK调试器介绍 5,使用普中的调试器进行debug 6,使用Simulator仿真 1,扩展板使用的STM32芯片类型 扩展版…

如何用docker在自己服务器上部署springboot项目

一、将springboot项目打包 1、maven clean项目 2、maven package项目 打包成功之后生成jar文件(在target目录下) 3、为Java创建Dockerfile 引入jdk8的Docker镜像 FROM openjdk:8 为了使运行其余命令时更容易,让我们设置映像的工作目录。这将…

1、初识 llvm源码编译 及virtualbox和ubuntu环境搭建

很久没更新了,最近准备研究逆向和加固,于是跟着看雪hanbing老师学习彻底搞懂ollvm,终于把所有流程跑通了,中间遇到了太多的坑,所以必须记录一下,能避免自己和帮助他人最好。 环境搭建太重要了,…

26、pytest使用allure解读

官方实例 # content of pytest_quick_start_test.py import allurepytestmark [allure.epic("My first epic"), allure.feature("Quick start feature")]allure.id(1) allure.story("Simple story") allure.title("test_allure_simple_te…

LabVIEW使用单板RIO开发远程监控电源信号

LabVIEW使用单板RIO开发远程监控电源信号 设计和构建用于智能电网的本地功耗分析系统,主要服务于领先的电力监控设备设计者和制造商。随着智能电网投资的增加,对于能够有效处理替代电源(如太阳能和风能)间歇性功率水平的技术需求…

vue 提交表单重复点击,重复提交防抖问题

问题:用户点击保存时,可能会多次点击。导致生成重复数据。 目标:多次点击时,1s内只允许提交一次数据。 解决方案: 1.在utils文件夹创建文件preventReClick.js export default {install (Vue) {// 防止按钮重复点击V…

lv11 嵌入式开发 IIC(上) 19

目录 1 IIC总线简介 1.1 串行、半双工(同时只能1收或者1发) 1.2 IIC总线通信过程 2 IIC总线信号实现 2.1 IIC总线寻址方式 2.2 起始信号和停止信号 2.3 字节传送与应答 2.4 同步信号 2.5 典型IIC时序 3 练习 1 IIC总线简介 1.1 串行、半双工&a…

2.5D封装与3D IC封装主流产品介绍

2.5D封装和3D IC封装都是新兴的半导体封装技术,它们都可以实现芯片间的高速、高密度互连,从而提高系统的性能和集成度。但是它们之间也存在一些差异和异同点。 1、3D 结构与 2.5D 有何不同? 首先,2.5D封装和3D IC封装的互连方式有…

Chrome浏览器禁止更新策略

在做爬虫过程中,需要用到Selenium驱动浏览器去做动态爬虫 这里我一般用到的是Chrome谷歌浏览器进行爬虫 但是,目前python和Chrome浏览器适配最好的是110.版本 尽管我用了很多种方法 去取消浏览器自动更新 但是 过一段时间 浏览器总是会自动更新到最新…

Linux Docker 安装Nginx

1.21、查看可用的Nginx版本 访问Nginx镜像库地址:https://hub.docker.com/_/nginx 2、拉取指定版本的Nginx镜像 docker pull nginx:latest #安装最新版 docker pull nginx:1.25.3 #安装指定版本的Nginx 3、查看本地镜像 docker images 4、根据镜像创建并运行…

TCP单聊和UDP群聊

TCP协议单聊 服务端: import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.V…

geemap学习笔记022:如何找出一年中最绿的一天?

前言 这虽然是一个问题,但是解决这个问题之后,就会学习到很多的内容。包括如何计算NDVI、如何进行镶嵌、如何获取影像的时间等等。 1 导入库并显示地图 import ee import geemapee.Initialize() Map geemap.Map() Map2 定义一个感兴趣区(…

新书推荐——《Copilot和ChatGPT编程体验:挑战24个正则表达式难题》

《Copilot和ChatGPT编程体验:挑战24个正则表达式难题》呈现了两方竞争的格局。一方是专业程序员David Q. Mertz,是网络上最受欢迎的正则表达式教程的作者。另一方则是强大的AI编程工具OpenAI ChatGPT和GitHub Copilot。 比赛规则如下:David编…

【Flink系列二】如何计算Job并行度及slots数量

接上文的问题 并行的任务,需要占用多少slot ?一个流处理程序,需要包含多少个任务 首先明确一下概念 slot:TM上分配资源的最小单元,它代表的是资源(比如1G内存,而非线程的概念,好多…

PCL 点云最小二乘法拟合二维圆

文章目录 一、原理概述二、实现代码三、实现效果参考资料一、原理概述 二、实现代码 // 标准文件 #include <iostream>// PCL #include <pcl/io/pcd_io.h>