环境准备
kubebuilder 没有编译好的 window 安装包,所以选择 linux(mac也可以)
go 安装
- 选择要安装的软件包
点击访问 下载相关 tar 包,解压
执行tar解压到/usr/loacl目录下(官方推荐),得到go文件夹等tar -C /usr/local/ -zxvf go1.17.3.linux-amd64.tar.gz
添加相关环境变量
vi /etc/profile # 在最后一行添加 export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin export GO111MODULE=on # 保存退出后source一下 source /etc/profile go version
kubebuilder
安装
# download kubebuilder and install locally.
curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
初始化
初始化工程脚手架,并创建一个 guestbook 资源,指定好对应的 gvk(group、version、kind)
mkdir -p projects/guestbook
cd projects/guestbook
kubebuilder init --domain my.domain --repo my.domain/guestbook
kubebuilder create api --group webapp --version v1 --kind Guestbook
工程目录说明:
├── api # 自定义资源的声明
│ └── v1
│ ├── groupversion_info.go
│ ├── guestbook_types.go
│ └── zz_generated.deepcopy.go
├── bin # 一些工具包
│ └── controller-gen
├── config # 利用 kustomization 生成部署到 k8s 的 yaml 文件
│ ├── crd
│ │ ├── kustomization.yaml
│ │ ├── kustomizeconfig.yaml
│ │ └── patches
│ │ ├── cainjection_in_guestbooks.yaml
│ │ └── webhook_in_guestbooks.yaml
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager
│ │ ├── controller_manager_config.yaml
│ │ ├── 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
│ │ ├── guestbook_editor_role.yaml
│ │ ├── guestbook_viewer_role.yaml
│ │ ├── kustomization.yaml
│ │ ├── leader_election_role_binding.yaml
│ │ ├── leader_election_role.yaml
│ │ ├── role_binding.yaml
│ │ └── service_account.yaml
│ └── samples
│ └── webapp_v1_guestbook.yaml
├── controllers # 控制器,监听资源变化的入口
│ ├── guestbook_controller.go
│ └── suite_test.go
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
├── Makefile
└── PROJECT
使用
详细的一些动作封装在 makefile 里面
# 安装 crd 到集群中
make install
# 如果 api 中定义的资源有变化,要重新生成 yaml
make manifests
# 部署 guestbook
kubectl apply -f config/samples .
# 在本地启动
go run ./main.go
# 将当前代码打包成镜像
make docker-build
# 镜像推送
make docker-push
# 将 controller 部署到 k8s 集群
make deploy
Reconcile 监听资源的变化
在 controllers/guestbook_controller.go/Reconcile
方法里面定义资源变化时候的一些动作事件,该方法是异步的,不会因为你代码的阻塞影响到资源的变动。
func (r *GuestbookReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := log.FromContext(ctx)
// TODO(user): your logic here
guestbook := &webappv1.Guestbook{}
if err := r.Get(ctx, req.NamespacedName, guestbook); err != nil {
log.Error(err, "unable to fetch guestbook")
return ctrl.Result{}, client.IgnoreNotFound(err)
}
return ctrl.Result{}, nil
}
调试
- idea 本地启动服务
查看自己部署的 guestbook 资源
$ kubectl get guestbook NAME AGE guestbook-sample 4d4h
修改,捕获变化
kubectl edit guestbook/guestbook-sample
发表评论 取消回复