KubeBuilder起步
KubeBuilder是用于开发CRD(自定义资源)以及控制器的框架工具,我们只需要按照框架的规则,可以大大提高开发K8s Operator的效率
安装
本文使用的kubebuilder的版本为3.11.1
其前置依赖有
- go version v1.20.0+
- docker version 17.03+.
- kubectl version v1.11.3+.
- Access to a Kubernetes v1.11.3+ cluster.
更多安装的细节,可以参考 官网
建议这里花点功夫,按照官方的要求,安装好指定的组件,以免后续在使用过程中出现一些奇怪的问题
快速入门
创建项目基本框架
1 |
|
由于现在基本都使用go modules了,所以这里需要指定 –repo ,来设置模块的名称
创建API资源
在k8s有很多api资源,我们可以通过命令来查看,会看到api资源有分组、版本以及类型等信息
1 |
|
这里我们通过kubebuilder创建我们的api资源信息,这个时候会帮我们生成一些文件
1 |
|
根据系统帮我们生成的结构体去生成摘要信息,如果我们重新定义或者修改了结构体,也需要重新生成摘要
1 |
|
结构体
输出文件
调试
将刚创建自定义资源部署到k8s中,并且跑一个脚手架生成的guestbook对象
1 |
|
我们可以通过以下命令查看部署的自定义资源
1 |
|
发布
我们刚刚只是在本地调试,这个时候controller并没有真正部署到k8s
生成controller的镜像,并推送到指定的镜像仓库,这里我使用的是阿里云的镜像仓库
1 |
|
部署controller
make deploy IMG=registry.cn-hangzhou.aliyuncs.com/default_images/guestbook:v1
卸载
1 |
|
实现Controller的逻辑
如下图所示,我们需要在Reconcile 这个函数中实现controller的逻辑
在上方的函数中,我们想创建一个镜像为nginx的pod
注意这里需要在函数的上方添加以下一段注释,以赋予对于pod的操作权限
//+kubebuilder:rbac:groups=*,resources=pods,verbs=get;list;watch;create;update;patch;delete
kubebuilder会根据这个注释生成相应的rbac权限
打包发布我们改造后的controller
1 |
|
发布过后,我们创建一个对象,测试一下,可以观察到controller帮我们创建了一个nginx pod
1 |
|
更多controller的执行信息,可以通过执行kubectl logs 【controller自身pod】 来查看,例如
1 |
|