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

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

初始化

bash 复制代码
# 初始化一个新项目
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 生成清单

bash 复制代码
make manifests

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

bash 复制代码
make install
bash 复制代码
$ k get crd |grep jimmysong.io
guestbooks.webapp.jimmysong.io

启动控制器

bash 复制代码
make run
bash 复制代码
/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

bash 复制代码
make uninstall

构建CRD镜像并部署进k8s

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

bash 复制代码
make docker-build docker-push IMG=<some-registry>/<project-name>:tag

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

bash 复制代码
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 变得更简单

相关推荐
Linux运维老纪7 小时前
DNS缓存详解(DNS Cache Detailed Explanation)
计算机网络·缓存·云原生·容器·kubernetes·云计算·运维开发
元气满满的热码式16 小时前
K8S部署DevOps自动化运维平台
运维·kubernetes·devops
IT艺术家-rookie20 小时前
k8s--部署k8s集群--控制平面节点
容器·kubernetes
Elastic 中国社区官方博客21 小时前
使用 Ollama 和 Kibana 在本地为 RAG 测试 DeepSeek R1
大数据·数据库·人工智能·elasticsearch·ai·云原生·全文检索
Linux运维老纪1 天前
windows部署deepseek之方法(The Method of Deploying DeepSeek on Windows)
linux·人工智能·分布式·云原生·运维开发·devops
Elastic 中国社区官方博客2 天前
Elastic Cloud Serverless 获得主要合规认证
大数据·数据库·elasticsearch·搜索引擎·云原生·serverless·全文检索
超级阿飞2 天前
在K8s中部署动态nfs存储provisioner
云原生·容器·kubernetes·nfs
赵渝强老师2 天前
【赵渝强老师】K8s中Pod探针的TCPSocketAction
云原生·容器·kubernetes
努力的小T2 天前
Linux二进制部署K8s集群的平滑升级教程
linux·运维·服务器·云原生·容器·kubernetes·云计算
2的n次方_3 天前
Eureka 服务注册和服务发现的使用
spring boot·spring cloud·云原生·eureka·服务发现