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

client-go controller-runtime kubebuilder

背景

这半年一直做k8s相关的工作,一直接触client-go controller-runtime kubebuilder,但是很少有文章将这三个的区别说明白,直接用框架是简单,但是出了问题就是黑盒,这不符合我的理念,所以这篇文章从头说起

sample-controller

官方的sample-controller,就是最简单controller,这个项目就用了client-go来实现controller
在这里插入图片描述
这是一张在网上被玩烂的图,特别的好,分为上下两部分,上面就是client-go的informer机制(informer机制网上一大堆我就不说了,一句话总结所谓的 Informer,就是一个自带缓存和索引机制,可以触发 Handler 的客户端库),下面就是实现controller的思路。我主要说下半部分(6)调度event handler,就是调用AddFunction、UpdateFunction、DeleteFunction,这几个方法做了什么事呢?(7)就是将对象的key放到了workqueue工作队列中(8)就是不断的从工作队列读取key(9)就是根据key从indexer中取对象,然后做处理。所以说如果自己写controller就要去实现下半部分。

controller-runtime

在这里插入图片描述
controller-runtime,我的理解就是方便用户去写custom controller的,让用户的关注点只关心写处理逻辑,也就是reconciler,在看一下之前的那一张图(6)(7)(8)都是固定的套路,只有handle object这一步才是处理逻辑,所以controller干的事就是帮用户处理了(6)(7)(8)。congtroller中引入了几个新的概念:
Manager:需要管理器来创建和启动控制器(可以有多个控制器与管理器关联),sample-controller中需要自己controller := NewController和controller.Run,现在manager帮你干了,你只需要写run里面的东西

Reconciler:用户需要关心的地方,也就上图handle object那部分。上图(9)部分

Cache:之前你的代码需要操作informer,现在不需要了,直接操作cache就可以,前面我也说过Informer就是一个自带缓存和索引机制,可以触发 Handler 的客户端库

Controller: 一方面向 Informer 注册 eventHandler,另一方面从队列中获取数据。controller 将从队列中获取数据并执行用户自定义的 Reconciler 功能。上图(6)(7)(8)部分

我把上图用大白话说一下,controller向informer注册event handler(AddFunction、UpdateFunction、DeleteFunction,这些handler就是将对象的key写到工作队列中),cache负责把informer启动起来,让informer list、watch k8s,当有对象发生变化了informer调用之前注册进来的event handler,将对象的key放到work queue工作队列中,controller不断的从work queue工作队列中获取对象的key,然后调用用户自己写的Reconciler程序。Reconciler的逻辑就是拿着key从cache中获取到对象,然后将对象协调成期望的状态。

在这里插入图片描述
上面这张图总结了哪部分是client-go,哪部分是controller-runtime,哪部分是需要用户自己写代码的地方,可以看出来只需要关心绿色的部分,其实也就是之前handle object那部分,剩下的controller-runtime都帮你干了,看着图细想一下,首先是manager的client和cache,你写的哪个控制器都是在和k8s的api进行交互,所以一个是和k8s连接的客户端,一个是k8s对象的缓存数据,controller 负责注册event handler,并且从workqueue中读取对象,最后负责调用用户自己写的reconciler。

kubebuilder

kubebuilder是对controller的进一层封装,我们用代码说话

下面是controller-runtime的main

func main() {mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{})// in a real controller, we'd create a new scheme for thiserr = api.AddToScheme(mgr.GetScheme())if err != nil {setupLog.Error(err, "unable to add scheme")os.Exit(1)}err = ctrl.NewControllerManagedBy(mgr).For(&api.ChaosPod{}).Owns(&corev1.Pod{}).Complete(&reconciler{Client: mgr.GetClient(),scheme: mgr.GetScheme(),})if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {setupLog.Error(err, "problem running manager")os.Exit(1)}
}

下面是kubebuilder的main

func main() {mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme:                 scheme,})if err = (&controller.abcReconciler{Client: mgr.GetClient(),Scheme: mgr.GetScheme(),}).SetupWithManager(mgr); err != nil {setupLog.Error(err, "unable to create controller", "controller", "abcCluster")os.Exit(1)}setupLog.Info("starting manager")if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {setupLog.Error(err, "problem running manager")os.Exit(1)}
}

有没有感觉非常的像,貌似多了一个SetupWithManager,点进去看一下

func (r *abcReconciler) SetupWithManager(mgr ctrl.Manager) error {return ctrl.NewControllerManagedBy(mgr).For(&infrastructurev1alpha1.Abc{}).Complete(r)
}

仔细对比一下,是不是发现就是controller runtime里面的NewControllerManagedBy,我没有再仔细看下去,但是我觉得就是又对controller封装了一下,提供给了开发者更简单的使用方式。

总结

具体的可以边用边看,但是思路一定要理清,不然上来就用kubebuilder出了问题真的不知道发生了什么。

相关文章:

client-go controller-runtime kubebuilder

背景 这半年一直做k8s相关的工作,一直接触client-go controller-runtime kubebuilder,但是很少有文章将这三个的区别说明白,直接用框架是简单,但是出了问题就是黑盒,这不符合我的理念,所以这篇文章从头说起…...

【vue 如何解决响应式丢失】

响应式丢失原因 在 Vue 中,响应式丢失通常是由于以下原因导致的: 1. 使用非响应式对象或属性:在 Vue 中,只有使用 Vue 实例的 data 对象中的属性或使用 Vue.set() 方法添加的属性才是响应式的。如果使用普通对象或属性&#xff…...

Selenium alert 弹窗处理!

页面弹窗有 3 种类型: alert(警告信息)confirm(确认信息)prompt(提示输入) 对于页面出现的 alert 弹窗,Selenium 提供如下方法: 序号方法/属性描述1accept()接受2dismis…...

有关自动化的脚本思考 python 按键 javascript

start 说来其实挺巧的,去年年中的时候,有一个同组的同事,由于工作流程需要,经常会打开某一网页,填写某些信息,然后上传特定的代码。 他有一次和我闲聊,他吐槽说,他每天的时间会被这…...

CKA认证模块②-K8S企业运维和落地实战-2

CKA认证模块②-K8S企业运维和落地实战-2 K8S常见的存储方案及具体应用场景分析 k8s存储-empty emptyDir类型的Volume是在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容…...

SpectralDiff论文阅读笔记

高光谱图像分类是遥感领域的一个重要问题,在地球科学中有着广泛的应用。近年来,人们提出了大量基于深度学习的HSI分类方法。然而,现有方法处理高维、高冗余和复杂数据的能力有限,这使得捕获数据的光谱空间分布和样本之间的关系具有…...

selenium基本使用、无头浏览器(chrome、FireFox)、搜索标签

selenium基本使用 这个模块:既能发请求,又能解析,还能执行js selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行 JavaScript代码的问题 selenium 会做web方向的自动化测试appnium 会做 app方向的自动化…...

Html 引入element UI + vue3 报错Failed to resolve component: el-button

问题&#xff1a;Html 引入element UI vue3 &#xff0c;el-button效果不出来 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Element --> <!-- <script src"https://unpkg.com/vue2/dist…...

sen2cor安装

Sen2Cor工具安装教程-百度经验 (baidu.com)...

通付盾Web3专题 | SharkTeam:Web3安全实践与创新

在Web3领域&#xff0c;安全漏洞、黑客攻击已愈发成为用户和投资者重点关注的领域。如何保障加密资产的安全&#xff0c;Web3黑暗森林中又有哪些新的攻击模式产生&#xff0c;SharkTeam将从一线进行分享和讨论。 我们先来看一下2023年1月到8月的安全事件数量和损失的数据统计。…...

ARM Linux 基础学习 / Ubuntu 下的包管理 / apt工具

编辑整理 by Staok。 注&#xff1a;在 Github 上的原版文章日后可能会更新&#xff0c;在其它位置发的不会跟进。文章的 Gitee 仓库地址&#xff0c;Gitee 访问更流畅。 Ubuntu 下的包管理 / apt工具 包管理系统的功能和优点大致相同&#xff0c;但打包格式和工具会因平台&a…...

springcloudalibaba入门详细使用教程

目录标题 一、简介二、SpringCloud Alibaba核心组件2-1、Nacos (配置中心与服务注册与发现)2-2、Sentinel (分布式流控)2-3、RocketMQ (消息队列)/RabbitMq/kafka2-4、Seata (分布式事务)2-5、Dubbo (RPC) 三、为什么大家看好 Spring Cloud Alibaba3-1、阿里巴巴强大的技术输出…...

C# DirectoryInfo类的用法

在C#中&#xff0c;DirectoryInfo类是System.IO命名空间中的一个类&#xff0c;用于操作文件夹&#xff08;目录&#xff09;。通过DirectoryInfo类&#xff0c;我们可以方便地创建、删除、移动和枚举文件夹。本文将详细介绍DirectoryInfo类的常用方法和属性&#xff0c;并提供…...

IDEA常用快捷键大全(详解)

如何在IDEA中进行内容全局查找 在idea中进行全局查找&#xff0c;可以使用快捷键“Ctrl Shift F”或者在菜单栏中选择Edit > Find > Find in Path。在弹出的界面中&#xff0c;输入要查找的内容。如果“Ctrl Shift F”这个快捷键无法实现全局查找&#xff0c;可以尝…...

设计模式之解释器模式

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概5000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…...

粉够荣获淘宝联盟区域理事会常务理事,携手共铸淘客新生态

淘宝联盟区域理事会于2021年成立&#xff0c;首届成立成都、广州、武汉&#xff0c;服务近2000个领军淘宝客企业&#xff0c;作为区域生态与官方交流重要枢纽&#xff0c;理事会举办近百场交流分享会&#xff0c;带动淘客跨域跨业态交流成长。 2023年9月7日第二届淘宝联盟理事…...

Python爬虫是否合法?

Python爬虫是否合法的问题颇具争议&#xff0c;主要涉及到使用爬虫的目的、操作方式以及是否侵犯了其他人的权益。本文将介绍Python爬虫的合法性问题&#xff0c;并提供一些相关的法律指导和最佳实践。 1. 什么是Python爬虫&#xff1f; Python爬虫是一种自动化程序&#xff…...

3.2 IDAPro脚本IDC常用函数

IDA Pro内置的IDC脚本语言是一种灵活的、C语言风格的脚本语言&#xff0c;旨在帮助逆向工程师更轻松地进行反汇编和静态分析。IDC脚本语言支持变量、表达式、循环、分支、函数等C语言中的常见语法结构&#xff0c;并且还提供了许多特定于反汇编和静态分析的函数和操作符。由于其…...

用python将csv表格数据做成热力图

python的开发者为处理表格和画图提供了库的支持&#xff0c;使用pandas库可以轻松完成对csv文件的读写操作&#xff0c;使用matplotlib库提供了画热力图的各种方法。实现这个功能首先需要读出csv数&#xff0c;然后设置自定义色条的各种属性如颜色&#xff0c;位置&#xff0c;…...

【程序基础】递归法

算法思想 递归法&#xff0c;其实可以说是一种编程技巧&#xff0c;通过调用自身&#xff0c;防止无限循环而给予递归出口。 思考使用场景 1.一个问题可以拆分成子问题&#xff0c;每个子问题相互独立。 2.数据满足递推关系&#xff0c;或者数据结构满足&#xff0c;例如图&…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...