k8s kubebuilder系列开发 — 理解和剖析 Kubebuilder
原文转自:微信公众号
云原生CTO
欢迎阅读 Kubernetes Operator Dev
的 N
部分系列的第二部分。
如果你想从理论上了解operator
是什么以及它们是如何工作的,请参阅第一部分。
在这一部分,我们将探索如何使用Kubebuilder
来简化operator
的编写。所以,我们让我们let's go
!
Kubebuilder: https://github.com/kubernetes-sigs/kubebuilder
Kubebuilder是什么?
编写Kubernetes operator
涉及到处理Kubernetes API
,如创建、观察、列出对象等。为了解决这个问题,您可以使用像client-go
和controller-runtime
这样的抽象库在Kubernetes
集群上执行CRUD
操作。但是,即使从头开始使用它们来编写一个成熟的operator
,最终也会涉及大量的复杂性、学习曲线和样板代码来处理。
因此,为了避免这种麻烦,有多种sdk
可以帮助我们简化和加快编写operator
的过程。其中一个是Kubebuilder
。
client-go: https://github.com/kubernetes/client-go
controller-runtime: https://github.com/kubernetes-sigs/controller-runtime
Kubebuilder
是一个由controller-runtime
支持的出色SDK
,它可以帮助您轻松快速地在 Go
中编写Kubernetes operator
,方法是处理多种忙碌的事情,例如以组织良好的方式引导大量样板代码,设置有用的 Makefile make
,目标是构建、运行和部署operator
、构建 CRD
、设置相关的 Dockefile
、RBAC
、涉及部署operator
的多个 YAML
等等。
在这篇文章中,我们将看到它的实际应用。
但在继续之前!
我希望尽可能保持本系列文章的示例性和相关性。为了确保这一点,我将以项目优先的方式解释所有概念和主题。在此过程中,我们将深入到operator
的开发中,这样你们就可以理解Kubernetes operator
开发的所有概念以便你们能够从绝对实用的角度理解和关联 Kubernetes operator dev
的所有概念。最后,一旦我们完成了本系列文章,我们最终会得到一个成熟的 Kubernetes operator
,它是从我们经历的所有概念中逐步诞生的产物
因此,让我与大家分享我们将要构建的operator
,最后,它会是什么样子
PostgresWriter
我们将在本系列文章中构建的operator
名为一个“PostgresWriter
”的自定义资源。这个想法很简单。比方说,我们在世界的某个角落有一个Postgres DB
。
与“postgresqlwriter
”资源相关的清单如下:
每当将这样的清单应用/创建到 Kubernetes
集群时,我们的operator
将捕获该事件并执行以下三件事:
- 解析
spec
传入的“Postgres_writer”资源的创建和识别
table,name,age和country`。 - 以<传入
postgres-writer
资源的命名空间>/<传入postgres-writer
资源的名称>的格式(default/sample-student
在本例中)形成与上述传入“postgres-writer
”资源对应的唯一id
。
因为在 Kubernetes
中,对于某个资源类型(在我们的例子中是 PostgresWriter
),命名空间/名称组合在整个集群中始终是唯一的。在我们的 Postgres
数据库中插入一个新行,spec.table
并相应地使用 spec.name,spec.age
和spec.country
字段,主键将是我们形成的上述唯一 id
(命名空间/传入资源的名称)。
operator
和自定义资源的高级流程
我们的operator
在行动中稍微深入的流程
此外,每当PostgresWriter
要删除上述资源时,我们的operator
都会DELETE
相应地从 PostgresDB
中删除与该资源对应的行,以保持 PostgresDB
的行和PostgresWriter
集群上存在的资源彼此一致。
对于上面的例子,如果我们kubectl delete
使用上面的sample-studentPostgresWriter
资源,那么我们的operater
将因此删除与 id
对应的行default/sample-student
。这将确保对于PostgresWriter
我们集群中的每个资源,在我们的 PostgresDB
中只有一行,不多也不少。
所以,让我们潜入吧!
安装 Kubebuilder
为了设置我们的项目/operator
,我们需要 Kubebuilder
。为此,我们需要安装它 请在您的计算机上安装 Go
。现在,在终端中运行以下几行来安装 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/
引导我们的operator
让我们首先为我们的项目/operator
创建一个目录并进入其中。
mkdir -p postgres-writer-operator
cd postgres-writer-operator
现在是Kubebuilder
的神奇部分。运行以下命令来引导我们的项目。
kubebuilder init \
--domain yash.com \
--repo github.com/yashvardhan-kukreja/postgres-writer-operator \
--project-name postgres-writer-operator \
--license apache2 \
--skip-go-version-check
![](https://files.mdnice.com/user/4493/7a40bb27-0197-4187-b0e9-e31cba583119.gif)
随意更改--repo``--domain
根据您的意愿:)
此命令定义与我们的项目相关的基本通用文件并设置基本依赖项。基本上,它只是一些与您的项目相关的元信息。
但是,这还不够,因为正如我在我们的operator
的描述中提到的,我们的operator
将监视一个名为PostgresWriter
的自定义资源。由于它是一个自定义资源,我们必须定义它的 CRD
,编写等效的 Go
代码,将它附加到我们的operator
,我们将运行另一个神奇的命令来为我们引导它:)
kubebuilder create api \
--group demo \
--version v1 \
--kind PostgresWriter \
--resource true \
--controller true \
--namespaced true
上面的命令将引导所有与PostgresWritercustom
资源相关的所需文件和代码,并将其附加到我们的operator
中,使我们可以轻松开始编写我们喜爱的operator
。但像group,controller,namespaces,api这些可怕的术语是什么?
请不要担心,让我一步一步,或者逐字逐句地解释这个命令
kubebuilder
——这是我们使用的引导工具。
create api
——这意味着在我们的项目中执行创建(引导)自定义资源的操作。但是为什么叫它“创建api”而不是“创建operator
”呢?
这是因为Kubernetes
本身就是一个API
驱动的工具,即使通过创建/部署一个operator
,我们也只是向Kubernetes
添加了一些新的API
端点。这就是为什么Kubernetes
认为我们在“创建api
”。
--group demo --version v1 --kind PostgresWriter
——Kubernetes
中的每种资源type/kind
都通过其 group-version-kind
(或 GVK
)的组合进行唯一标识。因此,Kubernetes API
以分层的方式组织资源,而且,GVK
旨在以有组织的方式在 Kubernetes API
中放置和集成资源。
要在Kubernetes
中识别任何资源的GVK
,只需查看其YAML
中的apiVersion
和kind
字段。例如,对于Kubernetes
中的Deployment
资源,apiVersion
是apps/v1
,表示它属于apps
组,它的Kind类型是Deployment
,它的版本是v1
。
在我们的例子中,如果你看下面与我们的PostgresWriterresource
对应的样例YAML
,组是demo.yash.com
(命令中的" group
"参数+ " domain
"参数),kind
是PostgresWriter
,version
是v1
--resource true—
——通过这个,我们告诉 Kubebuilder
我们正在尝试构建一个自定义资源 PostgresWriter
,并且我们希望一些样板代码和文件也围绕我们的自定义资源进行 boostrapped
。
--controller true
—— 通过这种方式,我们告诉 Kubebuilder
我们希望我们的operator
监视我们的PostgresWriter
资源并通过controller
协调它来对它采取行动。这将使 Kubebuilder
引导一些围绕“Reconcile
()”方法(协调循环)的样板代码,以及使用我们项目的controller runtime
管理器设置我们的operator
/controller
的方法。
--namespaced true
——通过这种方式,我们告诉 Kubebuilder
考虑PostgresWriter
将其用作命名空间资源,这与 ClusterRoles、ClusterRoleBindings
等集群范围的资源不同。
有了上述所有参数和信息,Kubebuilder
将引导基本 CRD、RBAC、Makefile、Reconciliation Loop
周围的代码等等。
剖析项目目录结构
现在,您可能会被执行我在上一节中提到的简单命令生成的这么多文件吓坏了。
但别担心,让我剧透一下,我们只需要处理两个文件:controllers/postgreswriter_controller.go
和api/v1/postgreswriter_types.go
。写出整个operator
。
许多其他东西大多是自动生成的,你不需要弄乱它们。
然而,我仍然很乐意以一种超级快速和简洁的方式向你们解释一些在我们的项目中自动生成的重要文件。这是因为,将来您可能会遇到一些特殊情况或一些错误,您可能需要手动调整这些文件。这就是这些知识对您有用的地方。另外,当您下次引导operator
时,您会知道自己在处理什么,这总是很酷
所以,让我们剖析一下目录结构的重要部分。我会自上而下:
api/v1/*.go
——此目录包含与定义我们的PostgresWriter
资源相关的所有文件。我们将相应地编辑postgreswriter_types.go
并定义type PostgresWriter struct
我们希望我们的PostgresWriter
资源具有的结构/模式。由于api/v1/postgreswriter_types.go
仅包含我们自定义资源的确切定义(通过各种结构),kubebuilder
将PostgresWriter
仅基于此文件生成CRD
。
bin/*
——它只是包含了像其他一些工具的二进制文件controller-gen
,并kustomize
将于自举代码的某些部分和部署我们的操作是必需的。
config/*
—— 此目录包含围绕我们的operator
和自定义资源的所有 YAML
相关内容。YAML
清单类似于roles
、rolebindings
、CRD
、示例演示 YAML
等,都位于此目录下。
controllers/*
——这是将包含我们的operator
的源代码的地方,即我们operator
的协调循环背后的逻辑/代码,关于观察PostgresWriter
资源和将我们的operator
与“管理器”(稍后定义)连接的东西将在这里编程.
main.go
——这是我们运行operator
的项目的入口点。这是我们的operator
被实例化并附加到我们的“管理器”并执行的地方。
“
Manager
”是包装一个或多个控制器/operator
并将它们注册到Kubernetes
集群的组件。在我们的例子中,它只是包装和注册一个operator
/控制器,即PostgresWriter
。所以基本上,流程是:定义operator
/控制器,将其附加/与管理器一起设置并执行管理器。“定义operator
/控制器”和“定义与管理器一起设置的方法”在controllers/postgreswriter_controller.go
文件中完成(分别查看Reconcile
和SetupWithManager
方法)。实例化oeprator
,用管理器设置它并执行管理器在main.go
hack/*
——此目录旨在存储基本的shell
脚本或任何其他类型的“hacky”
脚本,以自动化我们oeprator
周围的任何类型的操作。例如,运行某些检查背后的脚本、递归格式化/linting
代码的脚本、安装和设置必备工具的脚本等都将放置在这里。
Makefile
——此文件包含make
围绕构建和部署我们的operator
的所有相关目标以及其他内容,例如引导 CRD
、实用程序代码(如带有控制器生成的 DeepCopy
方法等)。
Dockerfile
—— 该文件包含 Dockerfile
脚本/指令,用于将我们的管理器(附有我们的operator
并指示运行它)打包到一个 docker
镜像中,该镜像可以稍后部署在Kubernetes
集群上。
差不多就是这样!
下一步是什么?
在下一部分中,我们将从对operator
进行编程开始。我们将controllers/postgreswriter_controller.go
深入了解其中引导的 Go
代码,我们将对其进行编辑以编程我们的operator
的协调循环,即该Reconcile
()文件中的方法。我们还将围绕 Postgres
设置所有方法和客户端,以使我们的operator
与我们的 PostgresDB
对话。最后,我们还将在本地执行我们的operator
并第一次看到它的运行情况
尾注!
非常感谢您到达这里。我希望您理解了这篇文章,并对 Kubebuilder
是什么以及它为何如此有用有了一个很好的了解。
我建议你再读一遍这篇文章,因为我能理解你是否仍然对这么多信息和行话感到困惑。但相信我,一切都会变得更容易。
5.3 参考资料
参考地址 [1]
参考资料
[1]
参考地址: https://yash-kukreja-98.medium.com/develop-on-kubernetes-series-operator-dev-understanding-and-dissecting-kubebuilder-4321d3ecd7d6
k8s kubebuilder系列开发 — 理解和剖析 Kubebuilder相关推荐
- k8s kubebuilder系列开发 — 编写自定义资源和Reconciliation循环
原文转自公众号云原生CTO 这是 Kubernetes Operator Dev N 部分系列的第三部分.在本文中,我们将深入探讨如何编写自定义资源和operator/控制器的reconciliati ...
- Kubernetes系列之理解K8s Service的几种模式
原文地址:Kubernetes系列之理解K8s Service的几种模式 今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0 ...
- 【致敬未来的攻城狮计划】— 连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下(文字上的初理解)
系列文章目录 系列文章目录 前言 一.瑞萨MCU(CPK_RA2E1是瑞萨RA系列开发板)是什么? 首先引入是什么? 他的优势在哪? 瑞萨CPK_RA2E1 对标stm32 相似之处和不同之处? 瑞萨 ...
- 知识图谱开发实战案例剖析_我从剖析Web开发人员路线图中学到的知识
知识图谱开发实战案例剖析 by Nicole Archambault 妮可·阿坎巴特(Nicole Archambault) 我从剖析Web开发人员路线图中学到的知识 (What I learned ...
- BAT解密:互联网技术发展之路(5)- 开发层技术剖析
BAT解密:互联网技术发展之路(5)- 开发层技术剖析 1. 开发框架 在系列文章的第2篇"BAT解密:互联网技术发展之路(2)- 业务如何驱动技术发展"中我们深入分析了互联网业务 ...
- 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习,来自STM32神舟系列开发板设计师的总结)
转载: 来源:www.armjishu.com 作者:jesse 我的另一篇文章:<STM32嵌入式入门必看之文章-----介绍非常详细!(学STM32的理由!!!!)>http://ww ...
- 拆轮子系列--RxJava理解(一)--Map解析
本系列文章如下: 拆轮子系列--RxJava前奏篇 拆轮子系列--RxJava理解(一)--Map解析 拆轮子系列--RxJava理解(二)--subscribeOn 拆轮子系列--RxJava理解( ...
- 智能对话机器人开发实战案例剖析(2)
一.前言 本文是<智能对话机器人开发实战案例剖析>系列的第2篇:智能对话机器人分类标准,旨在对智能对话系统的进行一个系统性的介绍.相关内容已同步录制成视频课程,发布在网易云课堂. 二.正文 ...
- 【STM32F103ZE】TOF250(TTL)基于STM32系列开发板的运用
目录 @[TOC](目录) 一.前言 二.硬件准备 二.软件准备 三.硬件接线图 四.例程源码 五.烧录说明 5.1 烧录接线示意图 5.2 烧录动态图 六.结果输出 一.前言 此片文章主要介绍如果通 ...
最新文章
- 厉害了!LeetCode 解题笔记终于在GitHub开源了!
- 一场B站服务端开发面试之旅
- python的语言是什么歌_用python对歌词进行语言分析
- 【javascript】异步编年史,从“纯回调”到Promise
- 高等数学上-赵立军-北京大学出版社-题解-练习2.3
- HTML5促使本地应用向Web迁移
- Deal with relational data using libFM with blocks
- 浏览器的资源并发亲试
- 也谈压缩感知(compressive sensing)
- Quartus17下使用Modelsim10进行仿真
- python 输入中文_【提醒】Python新手开发人员注意事项:不要误输入中文标点符号...
- Linux系统提高编辑效率的vim工具重要知识
- java二级考试怎么考_2018年全国计算机二级Java考试考什么内容
- Android 集成微信h5支付
- Node.js--下载、安装、配置
- 转博答辩ppt_如何高质量的完成一个论文答辩ppt?
- Hyperledger Fabric 网络环境的一点理解
- python123回文素数_平方回文素数
- Python 图形化界面设计
- 上海气象局 mysql_PHP通过气象局开放API查询指定城市(区县)天气
热门文章
- java如何打logo,利用java给网站图片打上文本或图片logo
- 震惊!评审专家将论文拒稿后修改发表
- 【深度学习】高效使用Pytorch的6个技巧:为你的训练Pipeline提供强大动力
- 卷积神经网络之 - VGGNet
- 李宏毅-ELMO、BERT、GPT视频笔记
- 手把手教你入门和实践特征工程 的全方位万字笔记,附代码下载
- 统计学习方法第十一章作业:随机条件场—概率计算问题、IIS/GD学习算法、维特比预测算法 代码实现
- 2 年来,每个人最该感谢的,是坚持学习、用心分享的自己
- 互联网1分钟 |1129
- SGU 294 He's Circles (polay计数)