§ 0x01 kubebuilder是什么? kubebuilder以下简称kb,是k8s社区编写CRD的工具。它可以自动化生成CRD工程代码,提高编写operator的效率。官网的示例CronJob对于初学者来说太复杂了,我试了下,基本的代码可以运行起来。
§ 0x02 与sdk-operator的区别是什么? 应该是sdk-operator比较先出现,kubebuilder是后来者。极客时间上学习k8s时,张磊还没有提及kubebuilder。两者没有什么本质区别,不过看知乎中的说法,两者社区有融合的趋势。新手还是学习kubebuilder比较好。
https://www.zhihu.com/question/290497164
§ 0x03 安装 除了官网的kubebuilder,还有其他的工具controller-gen, kustomize需要安装,官网的文档里没有说安装方法。
3.1 kubebuilder
按照官网文档的命令,安装比较简单。https://book.kubebuilder.io/quick-start.html
安装完成,通过如下命令确认安装成功。
$ kubebuilder version<<<
Version: main.version{KubeBuilderVersion:"3.1.0", KubernetesVendor:"unknown", GitCommit:"92e0349ca7334a0a8e5e499da4fb077eb524e94a", BuildDate:"2021-05-29T05:57:53+01:00", GoOs:"darwin", GoArch:"amd64"}
一定要使用比较新的kubbuilder版本。
3.2 安装controller-gen
【GoGo|kubebuilder 上手体验】controller-gen是用来生成控制器代码的工具。
可以去github仓库中找到安装方法。go get + go install即可安装。mac下面可以直接使用
brew install controller-gen
安装。3.3 安装kustomize
kustomize是用来生成CRD定义的工具。安装方法参考controller-gen。
基本的工具安装完成后,还需要一个k8s集群,1.16+的。并且本地配置好有kubectl。
§ 0x04 创建一个hello工程 4.1 初始化一个go的工程目录。
执行如下命令。
mkdir -pv hello
go mod init example.com/hello
4.2 初始化kubebuilder工程
执行如下命令。
kubebuilder init --domain example.com --license apache2 --owner "lin lin"
完成后,会生成Makefile和main.go等工程框架。
创建一个API。
kubebuilder create api --group me --version v1 --kind Case
$ kubebuilder create api --group me --version v1 --kind Case
Create Resource [y/n]
y
Create Controller [y/n]
y
有两个交互提示,都选y。
执行过程中有报错,提示一个go的依赖未找到,可以通过手动go get方式拉取。
至此工程已经初始化完成了。
4.2 安装
执行
make install
,即可自动把CRD安装到k8s集群中。通过kubectl get crd
确认安装结果。4.3 编写资源定义yaml,创建资源
创建如下的定义。符合定义的API GVK要素。在招待
make run ENABLE_WEBHOOKS=false
之后,执行kubectl apply -f case.yaml,创建资源,可以在终端上看到operator的Reconcil循环中有监测到资源的变动。
apiVersion: me.example.com/v1
kind: Case
metadata:
name: hello
spec:
foo: "world"
2021-08-04T20:37:37.617+0800INFOcontroller-runtime.metricsmetrics server is starting to listen{"addr": ":8080"}
2021-08-04T20:37:37.617+0800INFOsetupstarting manager
2021-08-04T20:37:37.618+0800INFOcontroller-runtime.managerstarting metrics server {"path": "/metrics"}
2021-08-04T20:37:37.619+0800INFOcontroller-runtime.controllerStarting EventSource{"controller": "case", "source": "kind source: /, Kind="}
2021-08-04T20:37:37.719+0800INFOcontroller-runtime.controllerStarting Controller{"controller": "case"}
2021-08-04T20:37:37.719+0800INFOcontroller-runtime.controllerStarting workers{"controller": "case", "worker count": 1}
2021-08-04T20:37:37.976+0800DEBUGcontroller-runtime.controllerSuccessfully Reconciled {"controller": "case", "request": "default/hello"}
2021-08-04T20:37:48.188+0800DEBUGcontroller-runtime.controllerSuccessfully Reconciled {"controller": "case", "request": "default/hello"}
至此整个示例完成了。由于没有编写任何代码,所以Reconcil中只能看到有事件,具体是添加还是删除,还是扩容都还不知道。这是下一步的工作。下一步就是扩展api/v1的CR的完整定义,并在Reconcil循环中进行真正的业务逻辑了。
§ 0x05 总结
- kubebuilder真的比较方便。生成的工程结构也清晰;
- 新手至少能跑通hello-world还是比较重要的,之前按照网上的自定义控制器流程,怎么着都跑不通,很受挫。
推荐阅读
- linux|ubuntu20.04安装微信和QQ,腾讯会议,以及一些其他实用软件
- 【Go进阶—基础特性】错误
- kubenetes-常用命令
- Golang 远程调试工具Delve 安装使用
- kubernetes|kubernetes secret私密凭据
- kubernetes|@kubernetes(k8s) 应用配置管理(ConfigMap、subPath、Secret)
- Go 语言之父介绍泛型(增添三个新的主要内容)
- java|云原生爱好者周刊(服务网格的困境与破局)
- 运维|云原生爱好者周刊(VMware Tanzu 社区版发布,无任何限制!)