kubebuilder简明教程
一、operator概述
Operator 是 Kubernetes 的扩展软件,它利用 定制资源 管理应用及其组件。 Operator 遵循 Kubernetes 的理念,特别是在控制器 方面[1]
k8s 的是一个高度自动化的系统,其中涵盖了常见应用程序所需的大部分功能,例如服务发现,负载均衡,HPA等等,这些功能是由 k8s 自带的一些控制器实现的,但是需求总是永无止境的,当我们有类似需求但是 k8s 又无法很好的满足的时候我们就可以使用 Operator 和 Custome Resource(自定义资源)来达到类似的效果。
例如常见的需求就有部署一个数据库,节点自动化运维,日志采集组件配置等等
从 Operator 理念的提出到现在已经有了很多工具可以帮助我们快速低成本的开发,其中最常用的就是 CoreOS 开源的 operator-sdk[3]和 k8s sig 小组维护的 kubebuilder[2],我们这个系列选用 kubebuilder。
开始之前我们先了解两个马上就会涉及到的核心概念
GV & GVK & GVR
GV: Api Group & Version API Group 是相关 API 功能的集合 每个 Group 拥有一或多个 Versions GVK: Group Version Kind 每个 GV 都包含 N 个 api 类型,称之为 Kinds,不同 Version 同一个 Kinds 可能不同 GVR: Group Version Resource Resource 是 Kind 的对象标识,一般来 Kind 和 Resource 是 1:1 的,但是有时候存在 1:n 的关系,不过对于 Operator 来说都是 1:1 的关系
举个🌰,我们在 k8s 中的 yaml 文件都有下面这么两行,例如上篇文章我们部署的 nginx deployment
apiVersion: apps/v1 # 这个是 GV,G 是 apps,V 是 v1 kind: Deployment # 这个就是 Kind sepc: # 加上下放的 spec 就是 Resource了 ...
kubebuilder的下载安装
针对centos7操作系统
wget https://github.com/kubernetes-sigs/kubebuilder/releases/download/v3.6.0/kubebuilder_linux_amd64 mv kubebuilder_linux_amd64 /usr/bin/kubebuilder chmod a+x kubebuilder
安装kustomize
wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv4.5.6/kustomize_v4.5.6_linux_amd64.tar.gz tar -zxvf kustomize_v4.5.6_linux_amd64.tar.gz mv kustomize /usr/local/bin/
安装完成之后就能继续进行后续的开发了
项目初始化
先创建一个空文件夹,然后在文件夹内执行下方命令
kubebuilder init --domain=danielhu.cn --repo github.com/mohuishou/blog-code/k8s-operator/02-kubebuilder
–-domain lailin.xyz
我们的项目的域名--repo xxx
是仓库地址,同时也是go mode
中的repo
地址
创建api
kubebuilder create api --group apps --version v1 --kind Application
执行之后我们发现项目结构发生了一些变化
. ├── api │ └── v1 │ ├── application_types.go # 这里是定义 spec 的地方 │ ├── groupversion_info.go # GV 的定义,一般无需修改 │ └── zz_generated.deepcopy.go ├── config │ ├── crd # 自动生成的 crd 文件,不用修改这里,只需要修改了 v1 中的 go 文件之后执行 make generate 即可 │ ├── default │ ├── manager │ ├── prometheus │ ├── rbac │ └── samples # 这里是 crd 示例文件,可以用来部署到集群当中 ├── controllers │ ├── application_controller.go # 在这里实现 controller 的逻辑 │ └── suite_test.go # 这里写测试
CRD实现