kubebuilder创建k8s operator项目的方法

kubebuilder init --domain example.com --repo github.com/example/crd-demo 这个命令用于初始化一个基于 kubebuilder 的 Kubernetes Operator 项目。kubebuilder 是一个用于构建 Kubernetes API、控制器(Controller)和自定义资源(CRD)的框架。

命令作用解析

  • kubebuilder init

    初始化一个新的 kubebuilder 项目,生成必要的项目结构、配置文件和 Makefile 等。

  • --domain example.com

    指定 CRD(自定义资源定义)的域名,通常用于定义 API 组。例如,如果你创建一个 MyResource 资源,并将其 API 组设置为 apps.example.com,Kubernetes 最终会注册 MyResource 资源为 myresources.apps.example.com

  • --repo github.com/example/crd-demo

    指定 Go 模块路径,通常是 GitHub 仓库路径,方便后续管理和导入依赖。kubebuilder 会使用它来初始化 go.mod,并在 main.go 中引用正确的包名。


执行后生成的项目结构

运行上述命令后,会生成如下项目结构:

csharp 复制代码
crd-demo/
├── PROJECT                   # Kubebuilder 项目元数据
├── go.mod                    # Go 模块定义
├── go.sum                    # Go 依赖管理
├── main.go                    # 入口文件
├── Makefile                   # 方便编译、运行、打包 CRD 的 Makefile
├── config/                    # 存放 Kubernetes 相关的 CRD 和 RBAC 配置
│   ├── default/
│   ├── manager/
│   ├── rbac/
│   ├── webhook/
│   ├── certmanager/
│   ├── crd/
│   └── kustomization.yaml
└── internal/                  # 内部逻辑

此时,项目已经初始化成功,但尚未定义 CRD 和控制器。


示例

我们可以进一步创建一个名为 Foo 的自定义资源:

1. 生成 API 和 Controller

运行:

sh 复制代码
kubebuilder create api --group apps --version v1 --kind Foo

这将:

  1. api/v1/ 目录下生成 foo_types.go,用于定义 Foo 资源的结构。
  2. controllers/ 目录下生成 foo_controller.go,用于实现 Foo 资源的控制器逻辑。

生成的部分结构如下:

bash 复制代码
crd-demo/
├── api/v1/
│   ├── foo_types.go          # Foo 资源的结构体定义
│   ├── groupversion_info.go  # 版本信息
│   ├── zz_generated.deepcopy.go  # 代码自动生成的 deepcopy 函数
├── controllers/
│   ├── foo_controller.go     # Foo 控制器逻辑

2. 定义 CRD

打开 api/v1/foo_types.go,定义 Foo 资源的结构:

go 复制代码
// FooSpec 定义了 Foo 资源的期望状态
type FooSpec struct {
    Replicas int `json:"replicas,omitempty"`
}

// FooStatus 定义了 Foo 资源的实际状态
type FooStatus struct {
    AvailableReplicas int `json:"availableReplicas,omitempty"`
}

// Foo 是 Kubernetes API 中的自定义资源
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
type Foo struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec   FooSpec   `json:"spec,omitempty"`
    Status FooStatus `json:"status,omitempty"`
}

运行 make manifests 生成 CRD YAML。

3. 实现控制器

编辑 controllers/foo_controller.go 处理 Foo 资源的业务逻辑。

4. 部署

  • 运行 make install 安装 CRD。
  • 运行 make run 启动控制器。

总结

  1. kubebuilder init 初始化 Operator 项目。
  2. kubebuilder create api 生成 CRD 和 Controller。
  3. 编写 types.go 定义 CRD 结构。
  4. 编写 controller.go 处理逻辑。
  5. 通过 make 生成 CRD 并运行控制器。

这样,我们就完成了一个 Kubernetes Operator 项目的基础搭建。🚀

相关推荐
梦想很大很大8 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰13 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘16 小时前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤17 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt111 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉7 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想