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 变得更简单

相关推荐
lisanmengmeng14 小时前
cephfs 在k8s挂载文档
云原生·容器·kubernetes
会算数的⑨19 小时前
K8S 学习笔记——核心概念与工作机制(二)
笔记·学习·kubernetes
运维成长记19 小时前
关于k8s和harbor脚本安装的一系列操作
云原生·容器·kubernetes
王九思19 小时前
云原生HashiCorp Vault加密
云原生
-dcr20 小时前
52.kubernetes基础
运维·云原生·kubernetes
Leon-zy20 小时前
Redis7.4.5集群部署3主3从
redis·分布式·缓存·云原生
牛奶咖啡1320 小时前
Prometheus+Grafana构建云原生分布式监控系统(一)
云原生·devops·分布式系统·sre·监控方法论·需监控哪些指标·监控与可观测性
HehuaTang1 天前
requests 调大并对齐 limits 提升POD高负载场景下性能
java·docker·kubernetes
忍冬行者1 天前
Elasticsearch 超大日志流量集群搭建(网关 + 独立 Master + 独立 Data 纯生产架构,角色完全分离,百万级日志吞吐)
大数据·elasticsearch·云原生·架构·云计算
Curvatureflight1 天前
API网关设计与实现:从单体到微服务的过渡
微服务·云原生·架构