参考资料: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实战之云编码平台——⑤项目完成、部署
 

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

更新中...

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐