go语言快速入门自定义包 go 自定义包( 四 )


这里我们将创建一个名为 AppService 的 CRD 资源对象,然后定义如下的资源清单进行应用部署:
通过这里的自定义的 AppService 资源对象去创建副本数为2的 Pod,然后通过 nodePort=30002 的端口去暴露服务,接下来我们就来一步一步的实现我们这里的这个简单的 Operator 应用 。
开发环境
环境需求
要开发 Operator 自然 Kubernetes 集群是少不了的 , 还需要 Golang 的环境,这里的安装就不多说了,然后还需要一个 Go 语言的依赖管理工具包:dep,由于 Operator SDK 是使用的 dep 该工具包,所以需要我们提前安装好,可以查看资料:,另外一个需要说明的是,由于 dep 去安装的时候需要去谷歌的网站拉取很多代码,所以正常情况下的话是会失败的 , 需要做什么工作大家应该清楚吧?要科学 。
安装 operator-sdk
operator sdk 安装方法非常多,我们可以直接在 github 上面下载需要使用的版本,然后放置到 PATH 环境下面即可 , 当然也可以将源码 clone 到本地手动编译安装即可,如果你是 Mac , 当然还可以使用常用的 brew 工具进行安装:
我们这里使用的 sdk 版本是v0.7.0,其他安装方法可以参考文档:
演示
创建新项目
环境准备好了,接下来就可以使用 operator-sdk 直接创建一个新的项目了,命令格式为:operator-sdk new
按照上面我们预先定义的 CRD 资源清单,我们这里可以这样创建:
到这里一个全新的 Operator 项目就新建完成了 。
项目结构
使用operator-sdk new命令创建新的 Operator 项目后 , 项目目录就包含了很多生成的文件夹和文件 。
我们主要需要编写的是 pkg 目录下面的 api 定义以及对应的 controller 实现 。
添加 API
接下来为我们的自定义资源添加一个新的 API , 按照上面我们预定义的资源清单文件,在 Operator 相关根目录下面执行如下命令:
添加完成后,我们可以看到类似于下面的这样项目结构:
添加控制器
上面我们添加自定义的 API , 接下来可以添加对应的自定义 API 的具体实现 Controller,同样在项目根目录下面执行如下命令:
这样整个 Operator 项目的脚手架就已经搭建完成了,接下来就是具体的实现了 。
自定义 API
打开源文件pkg/apis/app/v1/appservice_types.go,需要我们根据我们的需求去自定义结构体 AppServiceSpec,我们最上面预定义的资源清单中就有 size、image、ports 这些属性,所有我们需要用到的属性都需要在这个结构体中进行定义:
代码中会涉及到一些包名的导入,由于包名较多,所以我们会使用一些别名进行区分 , 主要的包含下面几个:
这里的 resources、envs、ports 的定义都是直接引用的"k8s.io/api/core/v1"中定义的结构体 , 而且需要注意的是我们这里使用的是ServicePort,而不是像传统的 Pod 中定义的 ContanerPort,这是因为我们的资源清单中不仅要描述容器的 Port,还要描述 Service 的 Port 。
然后一个比较重要的结构体AppServiceStatus用来描述资源的状态 , 当然我们可以根据需要去自定义状态的描述,我这里就偷懒直接使用 Deployment 的状态了:
定义完成后,在项目根目录下面执行如下命令:
改命令是用来根据我们自定义的 API 描述来自动生成一些代码,目录pkg/apis/app/v1/下面以zz_generated开头的文件就是自动生成的代码,里面的内容并不需要我们去手动编写 。
实现业务逻辑
NewDeploy 方法实现如下:
newService 对应的方法实现如下:
这样我们就实现了 AppService 这种资源对象的业务逻辑 。

推荐阅读