参考文档:
环境:
- centos 7.9
- golang 1.16.6
- docker 20.10.7
- minikube version: v1.22.0
安装kuberbuilder
curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
kubebuilder version
创建项目
cd $GOPATH/src
mkdir guestbook-kubebuilder && cd guestbook-kubebuilder
kubebuilder init --domain demo.com --repo guestbook-kubebuilder
kubebuilder参数:
--domain: Group的域名,默认值my.domain, 如:ucloud/redis-cluster-operator中,group是redis.kun,group域名是kun;--repo: 指定项目 go module 名字,创建之后可以看go.mod文件;
创建api
API: group/version, 如luke.demo.com/v1;
Kind: CRD, 如: GuestBook;
命令:
kubebuilder create api --group luke --version v1 --kind Guestbook
如果Create Resource [y/n]选择y, Create Controller [y/n]选择y。那么就会创建下面两个文件:
api/v1/guestbook_types.gocontrollers/guestbook_controller.go; 此时我们可以看到config/samples/luke.demo.com_v1_guestbook.yaml中的内容:
将CRD安装到k8s cluster
- 确保当前环境可以很方便的访问到k8s,如执行
kubectl cluster-info查看k8s集群信息;~/.kube/config或者$KUBECONFIG必须是有效的;
- 执行
make install命令, 成功后, k8s cluster就认识Kind:Guestbook、group: luke.demo.com的资源类型了。
本地运行Controller 且 apply一个CR(Guestbook)实例
该命令会让controller在终端前台运行。
正常情况下,controller运行起来后,如果自定义对象Kind:Guestbook执行create、delete、update操作,crontroller都会受到事件,负责调度了。
make run
申请一个CR(Kind:Guestbook)实例:
kubectl apply -f config/samples/
删除方式: kubectl delete -f config/samples/
Controller部署到k8s中
- 打包镜像 并 push 镜像:
make docker-build docker-push IMG=<some-registry>/<project-name>:tag
例如: make docker-build docker-push IMG=examplehub.com/test/guestbook-controller:latest
- 将controller以Deployment的方式部署到k8s中:
make deploy IMG=<some-registry>/<project-name>:tag
我们可以来看一下,make deploy执行的具体内容:
- manifests: 根据注释来看,
manifests通过controller-gen工具自动生成 webhook、clusterrole、CRD定义等信息; - kustomize: 是一个工具,make会将该工具自动拉取到
bin/kustomize位置; - deploy:
- 首先通过
kustomize修改了 镜像信息; - 我们现在来看下
$(KUSTOMIZE) build config/default得到的结果是啥?