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

相关推荐
DemonAvenger2 小时前
Go GOGC环境变量调优与实战案例
性能优化·架构·go
DemonAvenger5 小时前
Go sync.Pool 最佳实践:复用对象降低 GC 压力的技术文章
性能优化·架构·go
程序员爱钓鱼5 小时前
Go 并发编程基础:select 多路复用
后端·google·go
程序员麻辣烫6 小时前
Go的优雅退出
后端·go
zhuyasen7 小时前
深度定制 protoc-gen-go:实现结构体字段命名风格控制
后端·go·protobuf
油腻中年李大鹅1 天前
使用scheduler-plugins实现自定义调度器
kubernetes·go
DemonAvenger1 天前
减少内存分配:Go中值类型与指针类型的选择
性能优化·架构·go
Piper蛋窝1 天前
我所理解的 Go 的 `panic` / `defer` / `recover` 异常处理机制
后端·go
叹一曲当时只道是寻常1 天前
AI书签管理工具开发全记录(十三):TUI基本框架搭建
ui·go
岁忧1 天前
(nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)
java·c++·算法·leetcode·职场和发展·go