内容
- 暂不涉及相关概念的解释以及源码
- 如何使用kubebuilder创建一个operator项目
- 如何使用kind构建本地测试k8s环境
- 如何使用kubebuilder部署一个operator
os环境
mac arm
amd环境略有不同,后面会指出
过程
- 搭建本地go环境,最新的版本的kubebuilder需要使用go1.17+,这里使用1.18
推荐使用gvm进行go版本控制,github地址:https://github.com/moovweb/gvm
安装
#mac准备环境
xcode-select --install
brew update
brew install mercurial
#安装
zsh < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
或者单独到github上下载,然后安装
使用gvm进行版本控制
#查看本地go版本,system表示本地原有版本
gvm list
#查看可安装版本
gvm listall
#安装go1.18
gvm install go1.18
#切换1.18为默认版本
gvm use go1.18 --default
#查看当前go版本
go version
- 搭建本地docker环境
brew instal docker
启动国内镜像加速
针对安装了Docker for Mac的用户,在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧输入栏编辑 json 文件。将
https://wv8z9ud0.mirror.aliyuncs.com加到"registry-mirrors"的数组里,点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。
- 使用kind构建本地测试k8s集群,https://github.com/kubernetes-sigs/kind
安装kind
brew install kind
使用kind
#创建一个单节点k8s集群
kind create cluster --name kind
#展示出集群
kind get clusters
#为了与特定集群进行交互,您只需在 kubectl 中将集群名称指定为上下文
kubectl cluster-info --context kind-kind
- 部署kubebuilder,官方文档:https://book.kubebuilder.io/quick-start.html#create-an-api
curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
如果下载慢或者下载不下来,可以直接到https://github.com/kubernetes-sigs/kubebuilder/releases下载指定程序,然后cp到执行文件路径
mv kubebuilder_darwin_arm64 kubebuilder
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
- 使用kubebuilder创建一个项目,包括CRD的GVK(group,version,kind)
mkdir demoperator
#初始化go工程
cd demo-operator && go mod init demo-operator
#arm os架构初始化crd所属domain
kubebuilder init --domain my.domain --plugins="kustomize/v2-alpha,base.go.kubebuilder.io/v3"
#其他比如amd等os架构
kubebuilder init --domain my.domain"
#创建crd 的schema以及controller逻辑
kubebuilder create api --group webapp --version v1 --kind DemeOperator
> y
> y
#创建crd资源清单
make manifests
**注意:**后续的编译打包部署过程中会用到kustomize,对于mac m1 arm架构,kustomize v3不支持,所以需要使用官方插件进行修复https://github.com/kubernetes-sigs/kubebuilder/issues/2566,使用“–plugins=“kustomize/v2-alpha,base.go.kubebuilder.io/v3””
- 查看生成的框架目录结构
.
├── api ## 这里定义了 sample 的结构体 GVK,以及所需的 deepcopy 实现
│ └── v1
│ ├── groupversion_info.go
│ ├── sample_types.go
│ └── zz_generated.deepcopy.go
├── bin
│ └── manager ## controller 编译后的 二进制文件
├── config ## 包含了我们在使用 crd 是可能需要的 yml 文件,包括rbac、controller的deployment 等
│ ├── certmanager
│ ├── crd
│ ├── default
│ ├── manager
│ ├── prometheus
│ ├── rbac
│ ├── samples #crd资源类型的部署yaml
│ └── webhook
├── controllers ## 我们的controller 逻辑就放在这里
│ ├── sample_controller.go
│ └── suite_test.go
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
├── Makefile #编译打包工具
└── PROJECT
详细介绍:
- api/v1/* 用于生成我们自定义资源的GVK,也就是注册到kubernetes的schema
- config/ 此目录包含围绕我们的
operator
和自定义资源的所有YAML
相关内容。YAML
清单类似于roles
、rolebindings
、CRD
、示例演示YAML
等,都位于此目录下。 - controllers/* 实现operator处理逻辑的地方
- main.go 入口,把controller 实例化并附加到manager执行
- hack/* 基本的
shell
脚本或任何其他类型的“hacky”
脚本,以自动化我们oeprator
周围的任何类型的操作。例如,运行某些检查背后的脚本、递归格式化/linting
代码的脚本、安装和设置必备工具的脚本等都将放置在这里 - 围绕构建和部署我们的
operator
的所有相关目标以及其他内容,例如引导CRD
、实用程序代码(如带有控制器生成的DeepCopy
方法等)。
- 本地测试以及打包发布
本地测试:
#部署crd到默认k8s集群,默认~/.kube/config
make install
#运行controller
make run
arm架构可能会出现的报错处理:
Version v3.8.7 does not exist or is not available for darwin/arm64.
make: *** [/Users/xiaozhuang/Documents/project/goProject/deme-operator/bin/kustomize] Error 1
解决方法:使用官方插件修复,“–plugins=“kustomize/v2-alpha,base.go.kubebuilder.io/v3””,上面已经说过
部署crd实例,kubebuilder自动生成了实例yaml config/samples/webapp_v1_guestbook2.yaml
kubectl apply -f config/samples/webapp_v1_demooperator.yaml
到k8s中查看资源创建情况
打包docker并发布
#使用docker登录docker hub获取其他仓库
docker login -u -p
#打包,过程可能会报错,多尝试几次就可以
make docker-build docker-push IMG=peizhilei/demooperator:001
#发布
make deploy IMG=peizhilei/demooperator:001
- 卸载
#删除crd
make uninstall
#删除controller
make undeploy