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 项目的基础搭建。🚀

相关推荐
不会写DN3 小时前
Gin 实战入门:从环境搭建到企业级常用特性全解析
go·gin
下次一定x11 小时前
深度解析 Kratos 客户端服务发现与负载均衡:从 Dial 入口到 gRPC 全链路落地(下篇)
后端·go
乐茵lin17 小时前
大厂都在问:如何解决map的并发安全问题?三种方法让你对答如流
开发语言·go·编程·map·并发安全·底层源码·sync.map
不会写DN1 天前
GORM 实战入门:从环境搭建到企业级常用特性全解析
sql·mysql·go·gin
F1FJJ2 天前
Shield CLI 的 PostgreSQL 插件 v0.5.0 发布:数据库导出 + 协作增强,ER 图全新体验
网络·数据库·docker·postgresql·go
liangbm34 天前
AI-ViewNote:把网课和会议视频自动卷成结构化笔记
ai·typescript·go·软件构建·开源软件·react·桌面软件
我叫黑大帅4 天前
Gin 实战入门:从环境搭建到企业级常用特性全解析
后端·面试·go
我叫黑大帅4 天前
Gin 日志体系详解
后端·面试·go
F1FJJ4 天前
Shield CLI v0.3.3 新增 PostgreSQL 插件:浏览器里管理 PG 数据库
网络·网络协议·docker·postgresql·容器·go
mCell4 天前
【万字长文】从 AI SDK 到 mini-opencode:一次很巧的 Go Agent 架构实践
架构·go·agent