k8s笔记——kubebuilder实战

kubebuilder

Kubebuilder 是一个基于 CRD 来构建 Kubernetes API 的框架,可以使用 CRD 来构建 API、Controller 和 Admission Webhook。

动机

目前扩展 Kubernetes 的 API 的方式有创建 CRD、使用 Operator SDK 等方式,都需要写很多的样本文件(boilerplate),使用起来十分麻烦。为了能够更方便构建 Kubernetes API 和工具,就需要一款能够事半功倍的工具,与其他 Kubernetes API 扩展方案相比,kubebuilder 更加简单易用,并获得了社区的广泛支持。

工作流程

Kubebuilder 的工作流程如下:

  1. 创建一个新的工程目录
  2. 创建一个或多个资源 API CRD 然后将字段添加到资源
  3. 在控制器中实现协调循环(reconcile loop),watch 额外的资源
  4. 在集群中运行测试(自动安装 CRD 并自动启动控制器)
  5. 更新引导集成测试测试新字段和业务逻辑
  6. 使用用户提供的 Dockerfile 构建和发布容器

设计哲学

Kubebuilder 提供基于简洁的精心设计的示例 godoc 来提供整洁的库抽象。

  • 能使用 go 接口和库,就不使用代码生成
  • 能使用代码生成,就不用使用多于一次的存根初始化
  • 能使用一次存根,就不 fork 和修改 boilerplate
  • 绝不 fork 和修改 boilerplate

开始

环境
go version go1.22.3 linux/amd64
win10+debian11虚拟机
minikube version: v1.33.1
kubenetes version1.28.9

# 安装make
sudo apt-get install make
# 创建项目
mkdir kubebuilder-demo
cd kubebuilder-demo
go mod init gitcode.com/m

初始化

# 初始化一个新项目
kubebuilder init --domain my.domain
# 创建一个 API,按两次y
kubebuilder create api --group webapp --version v1 --kind Guestbook

在这里插入图片描述
在这里插入图片描述
API 创建完成后,在项目根目录下查看目录结构。

.
├── api
│   └── v1
│       ├── groupversion_info.go
│       ├── guestbook_types.go
│       └── zz_generated.deepcopy.go
├── bin
│   └── controller-gen-v0.15.0
├── cmd
│   └── main.go
├── config
│   ├── crd
│   │   ├── kustomization.yaml
│   │   └── kustomizeconfig.yaml
│   ├── default
│   │   ├── kustomization.yaml
│   │   ├── manager_metrics_patch.yaml
│   │   └── metrics_service.yaml
│   ├── manager
│   │   ├── kustomization.yaml
│   │   └── manager.yaml
│   ├── prometheus
│   │   ├── kustomization.yaml
│   │   └── monitor.yaml
│   ├── rbac
│   │   ├── guestbook_editor_role.yaml
│   │   ├── guestbook_viewer_role.yaml
│   │   ├── kustomization.yaml
│   │   ├── leader_election_role_binding.yaml
│   │   ├── leader_election_role.yaml
│   │   ├── role_binding.yaml
│   │   ├── role.yaml
│   │   └── service_account.yaml
│   └── samples
│       ├── kustomization.yaml
│       └── webapp_v1_guestbook.yaml
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│   └── boilerplate.go.txt
├── internal
│   └── controller
│       ├── guestbook_controller.go
│       ├── guestbook_controller_test.go
│       └── suite_test.go
├── Makefile
├── PROJECT
├── README.md
└── test
    ├── e2e
    │   ├── e2e_suite_test.go
    │   └── e2e_test.go
    └── utils
        └── utils.go

17 directories, 37 files

安装 CRD

Generate the manifests 生成清单

make manifests

Install CRDs into the Kubernetes cluster using kubectl apply 使用kubectl apply将CRD安装到Kubernetes集群中

make install

在这里插入图片描述

$ k get crd |grep jimmysong.io
guestbooks.webapp.jimmysong.io

启动控制器

make run

在这里插入图片描述

/home/zzyy/project/kubebuilder-demo2/bin/controller-gen-v0.15.0 rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
/home/zzyy/project/kubebuilder-demo2/bin/controller-gen-v0.15.0 object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
go run ./cmd/main.go
 setup   starting manager
 starting server {"name": "health probe", "addr": "[::]:8081"}
 Starting EventSource    {"controller": "guestbook", "controllerGroup": "webapp.jimmysong.io", "controllerKind": "Guestbook", "source": "kind source: *v1.Guestbook"}
 Starting Controller     {"controller": "guestbook", "controllerGroup": "webapp.jimmysong.io", "controllerKind": "Guestbook"}
 Starting workers        {"controller": "guestbook", "controllerGroup": "webapp.jimmysong.io", "controllerKind": "Guestbook", "worker count": 1}

卸载CRD

make uninstall

构建CRD镜像并部署进k8s

构建镜像并推送至你的镜像仓库

make docker-build docker-push IMG=<some-registry>/<project-name>:tag

指定镜像将controller部署进你的集群

make deploy IMG=<some-registry>/<project-name>:tag

参考资料

kubebuilder 文档 快速入门
K8S中编写自己的CRD及Controller简明指南
使用 kubebuilder 创建 operator 示例
sample-controller
redhat --Kubernetes Deep Dive: Code Generation for CustomResources
深入解析 Kubebuilder:让编写 CRD 变得更简单

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值