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
这将:
- 在
api/v1/
目录下生成foo_types.go
,用于定义Foo
资源的结构。 - 在
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
启动控制器。
总结
kubebuilder init
初始化 Operator 项目。kubebuilder create api
生成 CRD 和 Controller。- 编写
types.go
定义 CRD 结构。 - 编写
controller.go
处理逻辑。 - 通过
make
生成 CRD 并运行控制器。
这样,我们就完成了一个 Kubernetes Operator 项目的基础搭建。🚀