环境准备

kubebuilder 没有编译好的 window 安装包,所以选择 linux(mac也可以)

go 安装

  1. 选择要安装的软件包
    点击访问
  2. 下载相关 tar 包,解压
    执行tar解压到/usr/loacl目录下(官方推荐),得到go文件夹等

    tar -C /usr/local/ -zxvf go1.17.3.linux-amd64.tar.gz
  3. 添加相关环境变量

    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
}

调试

  1. idea 本地启动服务
  2. 查看自己部署的 guestbook 资源

    $ kubectl get guestbook
    NAME               AGE
    guestbook-sample   4d4h
  3. 修改,捕获变化

     kubectl edit guestbook/guestbook-sample

    image.png

点赞(2) 打赏

Comment list 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部