参考资料:
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
k8s编程operator实战之云编码平台——①架构设计
k8s编程operator实战之云编码平台——②controller初步实现
k8s编程operator实战之云编码平台——③Code-Server Pod访问实现
k8s编程operator实战之云编码平台——④web后端实现
k8s编程operator实战之云编码平台——⑤项目完成、部署
需要的条件
:
安装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、创建工程
# 创建一个文件夹
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目录
:我们要实现的controllermain.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文件等。
更新中...