内容

  • 暂不涉及相关概念的解释以及源码
  • 如何使用kubebuilder创建一个operator项目
  • 如何使用kind构建本地测试k8s环境
  • 如何使用kubebuilder部署一个operator

os环境

mac arm

amd环境略有不同,后面会指出

过程

  1. 搭建本地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
  1. 搭建本地docker环境
brew instal docker

启动国内镜像加速

针对安装了Docker for Mac的用户,在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧输入栏编辑 json 文件。将

https://wv8z9ud0.mirror.aliyuncs.com加到"registry-mirrors"的数组里,点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。

  1. 使用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
  1. 部署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/
  1. 使用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””

  1. 查看生成的框架目录结构
.
├── 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 清单类似于rolesrolebindingsCRD、示例演示 YAML 等,都位于此目录下。
  • controllers/* 实现operator处理逻辑的地方
  • main.go 入口,把controller 实例化并附加到manager执行
  • hack/* 基本的shell脚本或任何其他类型的“hacky”脚本,以自动化我们oeprator周围的任何类型的操作。例如,运行某些检查背后的脚本、递归格式化/linting代码的脚本、安装和设置必备工具的脚本等都将放置在这里
  • 围绕构建和部署我们的operator的所有相关目标以及其他内容,例如引导 CRD、实用程序代码(如带有控制器生成的 DeepCopy 方法等)。
  1. 本地测试以及打包发布

本地测试:

#部署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
  1. 卸载
#删除crd
make uninstall
#删除controller
make undeploy
Logo

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

更多推荐