背景
在Kubernetes中,希望通过CRD的方式定义业务资源,并通过Watch这些CR Object来做出相应的业务操作,也就是K8S Operator的实现,但是从零开始实现K8S Operator,是一件非常繁杂和困难的事情,好在当前社区提供了丰富的Operator实现框架,最热门的当属kubebuilder,本文也是对kubebuilder进行实践。
本文将参考官方文档在Ubuntu18.04进行实践
本文档对应的代码地址
Installation
- 1.kubebuilder安装
os=$(go env GOOS)
arch=$(go env GOARCH)
# download kubebuilder and extract it to tmp
curl -L https://go.kubebuilder.io/dl/2.3.1/${os}/${arch} | tar -xz -C /tmp/
# move to a long-term location and put it on your path
# (you'll need to set the KUBEBUILDER_ASSETS env var if you put it somewhere else)
sudo mv /tmp/kubebuilder_2.3.1_${os}_${arch} /usr/local/kubebuilder
export PATH=$PATH:/usr/local/kubebuilder/bin
-
2.kustomize安装
从官方链接下载对应的压缩包,并解压提取其中的二进制文件,并将该文件复制到PATH目录下。 -
3.Go环境安装
sudo apt install golang
export PATH=$PATH:/usr/local/go/bin
export GOPROXY="https://goproxy.cn"
export GO111MODULE="on"
Create a Project
mkdir $GOPATH/src/example
cd $GOPATH/src/example
kubebuilder init --domain mycrd.com
linclaus@linclaus-Virtual-Machine:operator-test$ kubebuilder init --domain mycrd.com
Writing scaffold for you to edit...
Get controller runtime:
$ go get sigs.k8s.io/controller-runtime@v0.5.0
Update go.mod:
$ go mod tidy
Running make:
$ make
go: creating new go.mod: module tmp
go: found sigs.k8s.io/controller-tools/cmd/controller-gen in sigs.k8s.io/controller-tools v0.2.5
/home/linclaus/work/moebius/golang/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
go build -o bin/manager main.go
Next: define a resource with:
$ kubebuilder create api
执行上诉命令后,将会生成包含Operator基本框架的文件集合
.
├── bin
│ └── manager
├── config
│ ├── certmanager
│ │ ├── certificate.yaml
│ │ ├── kustomization.yaml
│ │ └── kustomizeconfig.yaml
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ ├── manager_webhook_patch.yaml
│ │ └── webhookcainjection_patch.yaml
│ ├── manager
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ ├── rbac
│ │ ├── auth_proxy_client_clusterrole.yaml
│ │ ├── auth_proxy_role_binding.yaml
│ │ ├── auth_proxy_role.yaml
│ │ ├── auth_proxy_service.yaml
│ │ ├── kustomization.yaml
│ │ ├── leader_electi