kubebuilder 入门

834 阅读1分钟

参考文档:

环境:

  • 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文件; image.png

创建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.go
  • controllers/guestbook_controller.go; 此时我们可以看到config/samples/luke.demo.com_v1_guestbook.yaml 中的内容: image.png

将CRD安装到k8s cluster

  • 确保当前环境可以很方便的访问到k8s,如执行kubectl cluster-info 查看k8s集群信息;
    • ~/.kube/config 或者
    • $KUBECONFIG 必须是有效的;
  • 执行make install命令, 成功后, k8s cluster就认识 Kind:Guestbookgroup: 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执行的具体内容: image.png

  1. manifests: 根据注释来看,manifests通过controller-gen工具自动生成 webhook、clusterrole、CRD定义等信息;
  2. kustomize: 是一个工具,make会将该工具自动拉取到bin/kustomize位置;
  3. deploy:
  • 首先通过kustomize修改了 镜像信息;
  • 我们现在来看下$(KUSTOMIZE) build config/default得到的结果是啥? image.png image.png image.png