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

相关推荐
白总Server6 小时前
Golang领域Beego框架的中间件开发实战
服务器·网络·websocket·网络协议·udp·go·ssl
ん贤14 小时前
GoWeb开发
开发语言·后端·tcp/ip·http·https·go·goweb
纪元A梦1 天前
华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od·go
chxii3 天前
3.2goweb框架GORM
go
42fourtytoo4 天前
从0开始建立Github个人博客(hugo&PaperMod)
运维·服务器·python·go·github
xuhe25 天前
[tldr] GO语言异常处理
go·error
hlsd#7 天前
轻松实现CI/CD: 用Go编写的命令行工具简化Jenkins构建
运维·ci/cd·go·jenkins
Wenhao.8 天前
JWT GenToken&ParseToken
go
xsh2198 天前
Go RPC 服务方法签名的要求
go
我的golang之路果然有问题9 天前
快速了解Go+rpc
开发语言·经验分享·笔记·rpc·golang·go