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

相关推荐
我是前端小学生1 小时前
面试官:在go语言中,主协程如何等待其余协程完毕再操作?
go
关山月2 小时前
学习Go语言:循环和条件语句
go
我是前端小学生2 小时前
面试官:在go语言中,使用for select时,如果通道已经关闭会怎么样?如果只有一个case呢?
go
我是前端小学生2 小时前
面试官:在go语言中,在 for range 循环中对切片(slice)使用append操作,会造成无限循环吗?
go
三块钱07949 小时前
【原创】通过S3接口将海量文件索引导入elasticsearch
大数据·elasticsearch·搜索引擎·go
一个热爱生活的普通人19 小时前
JWT认证:在gin服务中构建安全的API接口
后端·go·gin
洛卡卡了21 小时前
Gin 框架学习实录 · 第4篇:参数校验、结构体拆分与控制器职责解耦
go
洛卡卡了21 小时前
Gin 框架学习实录 · 第3篇:集成 GORM + MySQL,实现注册用户入库
go
Pandaconda1 天前
【新人系列】Golang 入门(七):闭包详解
开发语言·经验分享·笔记·后端·golang·go·闭包
forever231 天前
kubebuilder创建k8s operator项目(下)
go