什么是Kubebuilder

Kubebuilder是一个用Go原因构建Kubernetes APIs的框架,通过使用KubeBuilder,用户可以遵循一套简单的编程框架,使用CRD构建API、Controllers和Admission WebHooks,实现对k8s的扩展。

Kubebuilder中的主要组件包含Manager、Cache、Client与Finalizers。其中,Manager组件主要实现管理外层,负责初始化Controller、Cache、Client的工作,Cache组件负责生成ShareInformer,Watch关注的GVK下的GVR的变化(增、删、改),以触发Controller的Reconcile逻辑;Client组件在工作中实现对资源进行CURD操作,CURD操作封装到Client中进行,其中的写操作(增、删、改)直接访问APIServer,读操作(查)对接的是本地的Cache;Finzlizers组件主要用于处理Kubernetes资源的预删除逻辑,保障资源被删除后能够从Cache中读取到,清理相关的其它资源。

Kubebuilder架构

Kubebuilder这种脚手架中间,将Kubernetes的可扩展能力CRD进行了简化封装,如下图所示,kubebuilder总体上将它设计的资源所属位置划分为四大块:User Defined、API Scaffolds、Controller Runtime、Kubernetes集群。

Kubebuilder Scaffolds是实现这个脚手架最核心的逻辑,它借助APIScaffolder对象模块,实现了CRD的Template和Controller的核心代码块。

在Controller Rumetime模块中,Kubebuilder构建出来的CRD会注册到Scheme模块,它提供了Kinds与对应的Go Type的映射,即给定了Go Type,就能够知道它的GKV(Group Kind Version),这也是Kubernetes所有资源的注册模块。举例来说,我们给定了一个Scheme, “demo1.example.org/v1” .Demo{}, 这个Go Type映射到demo1.example.org/v1的Demo GVk,从kubernetes的APIServer获取的部分JSON内容如下

{
"apiVersion": "demo1.example.org/v1",
"kind": "Demo",
"metadata": {
}
}

通过这个Go Type,能够正确地获取Group Kind Version的信息,从而提供给Controller,获取期望的状态,即协调的逻辑。而在Controller Runtime中Controller最依赖的除了Scheme之外,还包括Manager的初始化、安装和启动工作。Manager的初始化依赖Controller Runtime库初始化Manager对象,包括Client、Cache等模块的生成工作。然后Client就可以实现对CRD的创建、删除、更新、查询等过程,而查询的逻辑是通过本地的Cache模块实现的。这里的Cache负责监听CRD的变化,它是通过监听Scheme,从而收集所有与Controller有关的Group Kind Version资源,并创建对应的监听器,从而实现当监听到Kubernetes集群中的CRD发生变化触发Controller的协调进程Reconcile工作。

初次之外,Kubebuilder工具生成的内容还包括Finalizer,它用于处理kubernetes资源的预删除逻辑,保障资源被删除后能够从Cache中读取到,清理相关的其它资源,OwnerReference用于清理资源时,对于任何一个资源,若它的OwnerReference字段值为待删除对象,则这个对象也会被清理,支持对象的变更,也会触发Owner对象的Controller对的协调过程;Index用于提供资源的缓存,提升客户端资源的查询效率。

Kubebuilder简介与架构的更多相关文章

  1. FastDFS简介和架构图(内容来自于阅读fastdfs官方文档的总结)

    一.FastDFS简介 1. FastDFS是一个轻量级的开源分布式文件系统 2. FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡 3. FastDFS实现了软件 ...

  2. SpringCloud系列一:SpringCloud的简介和架构

    一.SpringCloud简介 SpringCloud就是一套分布式服务治理的框架,既然它是一套服务治理的框架,那么它本身不会提供具体功能性的操作,更专注于服务之间的通讯.熔断.监控等.因此就需要很多 ...

  3. OpenVPN简介及架构详解

    OpenVPN简介 1 简介    VPN(Virtual Private Network)直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道. OpenVPN无疑是Linux ...

  4. Kafka(一)Kafka的简介与架构

    一.简介 1.1 概述 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/ng ...

  5. nginx 练习(将游戏图片部署到NFS+LNMP架构简介+uwsgi架构简介)

    nginx(将游戏图片部署到NFS) 练习 一.首先去NFS这里创建挂载点 1.先在NFS的opt下面创建文件夹存放图片 [root@linux opt]# mkdir /opt/img 2.然后将此 ...

  6. Java异常(一) Java异常简介及其架构

    概要 本章对Java中的异常进行介绍.内容包括:Java异常简介Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.html ...

  7. (一)Shiro笔记——简介、 架构分析

    1. Shiro是什么 Apache Shiro是一个强大灵活的开源安全框架,可以完全处理身份验证,授权,企业会话管理和加密. Apache Shiro的首要目标是易于使用和理解. 安全有时可能非常复 ...

  8. Android Sensor详解(1)简介与架构【转】

    本文转载自:https://blog.csdn.net/u013983194/article/details/53244686 最近在学习有关如何porting sensor的东西,仅借此机会写博客来 ...

  9. Hadoop简介及架构

    狭义上来说,hadoop就是单独指代hadoop这个软件, 广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件 2.hadoop的历史版本介绍 0.x系列版本:hadoop当中最早的一 ...

随机推荐

  1. 《手写Mybatis》第4章:Mapper XML的解析和注册使用

    作者:小傅哥 系列:https://bugstack.cn/md/spring/develop-mybatis/2022-03-20-%E7%AC%AC1%E7%AB%A0%EF%BC%9A%E5%B ...

  2. Python 中的鸭子类型和猴子补丁

    原文链接: Python 中的鸭子类型和猴子补丁 大家好,我是老王. Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这 ...

  3. python 包之 redis 数据库操作教程

    一.安装 redis 是一个 Key-Value 数据库 Value 支持 string(字符串),list(列表),set(集合),zset(有序集合),hash(哈希类型)等类型 pip inst ...

  4. Apache Doris ODBC外表数据库主流版本及其ODBC版本对应关系

    本文是在CentOS 7.9下测试通过 使用的Doris是:0.15.0 unixODBC版本是:2.3.1 1.PostgreSQL 以下是PostgreSQL数据库版本和PostgreSQL OD ...

  5. SQL注入绕过总结

    花括号绕过 select{x password}from{database.user} union select 1,{x 2},3 特征字符大小写绕过 UniOn SEleCt 1,2,3 MYSQ ...

  6. macOS 安装 Nebula Graph 看这篇就够了

    本文首发于 Nebula Graph Community 公众号 背景 刚学习图数据的内容,当前网上充斥大量的安装文档,参差不齐,部署起来令人十分头疼. 现整理一份比较完整的安装文档,供大家学习参考, ...

  7. 集合篇-ConcurrentHashMap

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. jdk1.7和jdk1.8中ConcurrentHashMap的区别? ...

  8. windodws pyusb hub端口对应连接的usb设备

    源码: 1 #!/usr/bin/python 2 import sys 3 import usb.core 4 # find USB devices 5 dev = usb.core.find(fi ...

  9. 在GO中调用C源代码#基础篇1

    开坑说明 最近在编写客户端程序或与其他部门做功能集成时多次碰到了跨语言的sdk集成,虽说方案很多诸如rpc啊,管道啊,文件io啊,unix socket啊之类的不要太多,但最完美的基础方式还是让程序与 ...

  10. 【多线程】观测线程状态 getState()

    观测线程状态 getState() Thread.State(查看JDK帮助文档) 线程状态.线程可以处于以下状态之一: [NEW] 尚未启动的线程处于此状态. [RUNNABLE] 在Java虚拟机 ...