k8s编程operator——(4) kubebuilder controller-runtime

news2024/11/18 3:32:45

文章目录

    • 1、KubeBuilder使用
      • 1.1 下载
      • 1.2 使用
    • 2、controller-runtime

参考资料:https://book.kubebuilder.io/

k8s编程operator系列:
k8s编程operator——(1) client-go基础部分
k8s编程operator——(2) client-go中的informer
k8s编程operator——(3) 自定义资源CRD
k8s编程operator——(4) kubebuilder & controller-runtime
 

1、KubeBuilder使用

1.1 下载

需要的条件

  • go version:v1.19+
  • docker version:version 17.03+
  • kubectl version:version v1.11.3+
  • k8s cluster:v1.11.3+

安装kubebuilder:

# download kubebuilder and install locally.
curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/

 

1.2 使用

1、创建工程

# 创建一个文件夹
mkdir kubebuilder-demo
cd kubuilder-demo

# 初始化工程
kubebuilder init

# 或者使用下面命令来指定domain,如果不指定,默认的domain就是my.domain
kubebuilder init --domain <domain>

使用kubebuilder init命令初始化后,kubebuilder会为我们生成一套工程模板,并下载依赖,kubebuilder生成的模板中的代码是依赖于controller-runtime来实现的。初始化,后它会提示我们来创建一个api:

在这里插入图片描述

我们首先看使用kubebuilder为我们生成了哪些文件:

config文件夹:里面是一系列的yaml文件

Dockerfile:构建该程序Docker镜像的Dockerfile

Makefile:在Makefile中有很多有用的命令,比如生成我们的CRD的yaml文件;生成RBAC文件生成DeepCopy等方法实现构建项目构建Docker镜像安装CRD到我们的集群中从集群中卸载CRD部署我们的controller到集群中等

在这里插入图片描述

使用make help可以查看Makefile给我们提供了哪些命令:

在这里插入图片描述

 

2、创建api

# 创建api,需要指定 GVK
kubebuilder create api --group test.com --version v1 --kind Foo

使用kubebuilder create api命令,会提示我们是否创建Resource以及Controller,最后提示我们下个步骤是make manifests

在这里插入图片描述

然后我们来查看一下,这个步骤生成了哪些文件:

如下图,create api命令生成了我们的工程代码文件。

  • api目录:这个目录中是我们的自定义资源的go类型以及类型注册
  • bin目录:bin目录下是kubebuilder使用的用于生成自定义资源的go类型以及CRD、RBAC等yaml文件的程序
  • crd目录:CRD的yaml文件
  • sample目录:创建自定义资源(CR)的yaml文件
  • controllers目录:我们要实现的controller
  • main.go:main文件

在这里插入图片描述

使用kubebuilder -h命令可以查看kubebuilder的使用帮助信息:

kubebuilder使用插件的形式来生成我们的工程模板,有多种插件,默认使用的是go.kubebuilder.io/v3,在使用时使用默认的即可。

在这里插入图片描述

下图为bukebuilder中的源码,可以看到其使用了插件的设计。

在这里插入图片描述

在插件中定义了我们的工程代码的模板,然后根据我们使用kubebuilder时的参数选项对模板进行渲染来生成我们的工程文件。

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

在我们工程的bin目录下有一个controller-gen的可执行文件,kubebuilder用它来生成我们的工具代码以及kubernetes的yaml文件。

 

3.修改types文件中的字段

接下来我们就可以修改types.go文件中的自定义资源的go类型来添加我们需要的字段。

比如我们可以给FooSpec添加下面三个字段。

在这里插入图片描述

在修改完types文件后,需要执行make manifests命令来生成CRD的yaml文件

# 重新生成CRD
make manifests

执行命令后,在crd/base文件夹下根据我们的Type生成了CRD的yaml文件:

在这里插入图片描述

 

4、安装CRD

使用下面的命令来安装CRD到我们的集群中

make install

但是在执行这一步的时候可能会报错:
在这里插入图片描述

执行这个命令需要使用kustomize,我们可以先把它下载到bin目录在执行这个命令

# 下载kustomize
make kustomize

如果下载不下来,那么你需要一个科学上网。

如果没有报错,可以不下载。下载下来之后,重新执行make install

但是如果实在下不下来,那么可以自己来安装CRD:

kubectl apply -f ./config/crd/bases/test.com.my.domain_foos.yaml

安装完成后,使用kubectl来查看:

kubectl get crd

在这里插入图片描述

 

5、启动我们的程序

在启动程序前,修改一下我们的controller:

在foo_controller.go中有一个Reconcile方法,我们的主要逻辑就在这里实现,在这就简单打印一下:

func (r *FooReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
	log := log.FromContext(ctx)

	// TODO(user): your logic here
	obj := testcomv1.Foo{}
	err := r.Client.Get(context.Background(), req.NamespacedName, &obj)
	if err != nil {
		log.Error(err, "get foo")
		return ctrl.Result{Requeue: true, RequeueAfter: time.Second * 10}, err
	}
	fmt.Println("foo name:", obj.Name)

	return ctrl.Result{}, nil
}

然后,使用下面命令来启动程序

make run

如下图所示,程序已经启动起来,但是由于我们的自定义资源中还没有对象,因此没有收到信息:

在这里插入图片描述

 

6、创建自定义资源对象

使用下面的命令来创建自定义资源对象:

[root@master kubebuilder-demo]# kubectl create -f config/samples/
foo.test.com.my.domain/foo-sample created

在创建自定义资源对象后,我们的程序就收到了信息:

在这里插入图片描述

 

到此,一个简单的kubebuilder使用就介绍完了,使用kubebuilder可以生成我们的controller的工程模板代码,这些代码依赖controller-runtime这个库,在后面将会介绍。同时还会生成一系列工具,使用工具可以生成Docker镜像、CRD的yaml文件、RBAC的yaml文件等。

 

2、controller-runtime

更新中...

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PostgreSQL的wal_buffers】

1、什么是wal buffer? wal buffer是预写日志(wal)缓冲区 2、wal buffer的作用是什么 用于还未写入磁盘的 WAL 数据的共享内存。 每次变更事务提交时候,需要将变更事务日志落盘&#xff0c;在PG中为了提高性能&#xff0c;并非采用实时flush到磁盘,而是在PG中提供XLog Buff…

DFS学习

一、DFS 1、简介 最初听到DFS还以为是深度优先遍历&#xff0c;实际上是分布式文件存储服务(Distributed file system)。 FastDFS是一套分布式文件存储服务&#xff0c;Titans将FastDFS提供的接口进行了封装&#xff0c;屏蔽了一些无需关注的操作细节&#xff0c;让用户可以更…

Java基础:Lambda表达式

1. 函数式编程思想概述 在数学中&#xff0c;函数就是有输入量、输出量的一套计算方案&#xff0c;也就是“拿什么东西做什么事情”。相对而言&#xff0c;面向对象过分强调“必须通过对象的形式来做事情”&#xff0c;而函数式思想则尽量忽略面向对象的复杂语法——强调做什么…

《Fluent Python》笔记 | 函数对象和装饰器

在Python中函数是对象&#xff0c;本质是function类的实例。同样函数对象也是“一等对象”&#xff0c;即满足以下条件&#xff1a; 在运行时创建能赋值给变量或数据结构中的元素能作为参数传给函数能作为函数的返回结果 函数对象的__doc__属性用于生成对象的帮助文本。 接受…

【避坑指南】快准狠!一键采购电子元器件(文末优惠券)

在采购元器件的过程中&#xff0c;经常会出现一些或这或那的情况&#xff0c;比如遇到假货问题、不具备专业知识、工作经验不够丰富、采购型号错误等等&#xff0c;因此采购下单如赌注&#xff0c;每个订单都下得心惊肉跳。 那么有哪些坑是可以避开的&#xff0c;又有什么方法可…

AI大模型加持,生成式搜索来了!

梦晨 发自 凹非寺量子位 | 公众号 QbitAI最近有两件事&#xff0c;让搜索引擎重回聚光灯下。百度发布“文心百中”&#xff0c;用AI大模型技术驱动的产业级搜索系统。构建企业内部搜索引擎的人力成本减少90%以上&#xff0c;同时只需要极低数据。几乎同一时间&#xff0c;OpenA…

算法---DFS和BFS

一 : 什么是DFS和BFS? 转载自 : 什么是DFS和BFS? 简介&#xff1a; 深度优先遍历&#xff08;Depth First Search, 简称 DFS&#xff09; 与广度优先遍历&#xff08;Breath First Search&#xff09;是图论中两种非常重要的算法&#xff0c;生产上广泛用于拓扑排序&#xf…

软考高级信息系统项目管理师如何备考?

从以下两个方面&#xff1a; 1.首先分析一下高项考试的各个科目&#xff1b; 2.如何备考高项&#xff1f; 高项考试有三个科目&#xff1a; 综合知识&#xff0c;案例分析&#xff0c;和论文。 一、综合知识 信息系统项目管理师上午综合知识科目范围广&#xff0c;知识点非…

【差分进化算法】基于适应度-距离-平衡的自适应引导差分进化 (FDB-AGDE) 算法附matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

java工作流开源框架可以提高工作效率吗?

要想回答这个问题&#xff0c;就需要了解什么是java工作流开源框架&#xff0c;以及java工作流开源框架的主要特点是什么。随着大数据时代的拓展发展&#xff0c;低代码开发平台已经在数字化管理时代中深受欢迎&#xff0c;是做好数据管理和提升企业数字化发展步伐的重要工具。…

医疗机构 IT 管理员保护患者数据和隐私的 3 项必做之事

自疫情开始以来&#xff0c;医疗机构的信息存储与管理正面临着巨大的考验。患者的健康史&#xff0c;包括所有治疗、程序、处方、实验室测试和扫描报告&#xff0c;都以电子健康记录 (EHR) 的形式存储。尽管 EHR 更能提高患者病例的准确性&#xff0c;并帮助医生跟踪患者的医疗…

网络三层交换机部署实验

♥️作者&#xff1a;小刘在C站 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;愿…

排查cpu飚高问题-两种方案

cpu 飚高原因 频繁创建线程 线程内进行频繁计算 模拟代码 SpringBootApplicationEnableSchedulingpublic class CrawlBigDataApplication {public static void main(String[] args) { /*19*/ SpringApplication.run(CrawlBigDataApplication.class, (String[])args)…

【并发编程】Atomic类

一、介绍 在java.util.concurrent.atomic包下atomic一般指原子操作类&#xff0c;主要分为四种类型的原子更新类&#xff1a;原子更新基本类型、原子更新数组类型、原子更新引用和原子更新属性。 二、简单使用 1.AtomicInteger 通过synchronized关键字来保证原子性&#xf…

社交平台数据提取:Social Phone Extractor

Social Phone Extractor是一个功能强大且创新的程序&#xff0c;能够搜索和扫描在 Google / Bing / Yahoo 中索引并与最重要的社交网络&#xff08;如 Linkedin、Facebook、Twitter 和 Instagram&#xff09;相关的个人资料、帖子和文章的页面&#xff0c;然后捕获和推断&#…

ChatGPT介绍世界杯历史与编写足球游戏python程序

ChatGPT聊天机器人最近非常流行&#xff0c;是由OpenAI于本月发布的。花了一点时间注册了一个账号&#xff0c;如有需要帮助注册的可以随时与我交流。注册过程相对有一些复杂。 除了常规的聊天对话功能之外&#xff0c;ChatGPT聊天机器具备强大的文本生成能力&#xff0c;例如博…

【Android】Broadcast广播的使用

一、广播机制概述 通常情况下在学校的每个教室都会装有一个喇叭&#xff0c;这些喇叭是接入到学校广播室的。如果有重要通知&#xff0c;会发送一条广播来告知全校师生。为了便于发送和接收系统级别的消息通知&#xff0c;Android系统也引入了一套类似广播的消息机制。 Android…

股票撤单委托接口是如何操作的?

在交易的过程中&#xff0c;要先通过股票撤单委托接口获取委托单列表的数据&#xff0c;才可以进行撤单的操作&#xff0c;部分的数据会作为参数传递给撤单函数&#xff0c;下面来具体看看股票撤单委托接口是如何操作的&#xff1f; std::cout << " 撤单委托 \n&qu…

025_SSS_BeLFusion: Latent Diffusion for Behavior-Driven Human Motion Prediction

BeLFusion: Latent Diffusion for Behavior-Driven Human Motion Prediction 本文关注的问题是human motion prediction&#xff08;HMP&#xff09;&#xff0c;也就是在给定观测到的人体运动的前提下&#xff0c;预测人体的后续运动。本文的思路是&#xff0c;将人的behavio…

Linux文件服务NFS共享存储服务

作者简介&#xff1a;一名99年软件运维应届毕业生&#xff0c;正在自学云计算课程。宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。创作不易&#xff0c;动动小手…