千家信息网

自动生成代码controller tool怎么使用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了自动生成代码controller tool怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇自动生成代码controller tool怎么使用文章都
千家信息网最后更新 2026年10月31日自动生成代码controller tool怎么使用

这篇文章主要介绍了自动生成代码controller tool怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇自动生成代码controller tool怎么使用文章都会有所收获,下面我们一起来看看吧。

controller-tools

controller-tools主要可以帮我们自动生成types.go所需要的内容以及自动帮我们生成crd。

同样首先将其clone到本地:

$ git clone https://github.com/kubernetes-sigs/controller-tools.git

在项目的cmd目录下,我们可以看到有controller-gen、helpgen、type-scaffold三个工具。

其中type-scaffold可以用来生成我们需要的types.go文件,controller-gen可以生成zz_xxx.deepcopy.go文件以及crd文件。

我们使用go install进行安装:

$ cd controller-gen$ go install ./cmd/{controller-gen,type-scaffold}

安装完成后我们可以去GOPATH下的bin目录下查看。

接着我们就可以新建一个项目,来使用controller-tools提供的工具为我们自动生成代码了。

$ mkdir controller-test && cd controller-test$ go mod init controller-test$ mkdir -p pkg/apis/example.com/v1$ tree.├── go.mod└── pkg    └── apis        └── example.com            └── v14 directories, 1 file

接下来我们就可以使用工具来生成我们所需要的代码了,首先我们生成types.go所需要的内容,由于type-scaffold不支持导入文本,所以生成后我们需要复制到types.go文件中:

$ type-scaffold --kind Foo// FooSpec defines the desired state of Footype FooSpec struct {        // INSERT ADDITIONAL SPEC FIELDS -- desired state of cluster}// FooStatus defines the observed state of Foo.// It should always be reconstructable from the state of the cluster and/or outside world.type FooStatus struct {        // INSERT ADDITIONAL STATUS FIELDS -- observed state of cluster}// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object// Foo is the Schema for the foos API// +k8s:openapi-gen=truetype Foo struct {        metav1.TypeMeta   `json:",inline"`        metav1.ObjectMeta `json:"metadata,omitempty"`        Spec   FooSpec   `json:"spec,omitempty"`        Status FooStatus `json:"status,omitempty"`}// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object// FooList contains a list of Footype FooList struct {        metav1.TypeMeta `json:",inline"`        metav1.ListMeta `json:"metadata,omitempty"`        Items           []Foo `json:"items"`}

然后在types.go文件中将import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"添加上就行。

当然自动生成只是一个模版,里面的具体细节还是需要我们自己去填写,比如我们填充FooSpec。

资源类型定义好了,那么如何能让client-go识别我们的资源呢,这里就需要其注册进去。我们可以在register.go中定义GV(Group Version),以及通过标签指定groupName。

// register.go// +groupName=example.compackage v1import (        "k8s.io/apimachinery/pkg/runtime"        "k8s.io/apimachinery/pkg/runtime/schema"        "k8s.io/apimachinery/pkg/runtime/serializer")var (        Scheme       = runtime.NewScheme()        GroupVersion = schema.GroupVersion{                Group:   "example.com",                Version: "v1",        }        Codec = serializer.NewCodecFactory(Scheme))

在types.go中调用Scheme.AddKnownTypes方法即可:

// types.gopackage v1import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"// FooSpec defines the desired state of Footype FooSpec struct {        // INSERT ADDITIONAL SPEC FIELDS -- desired state of cluster        Name     string `json:"name"`        Replicas int32  `json:"replicas"`}// FooStatus defines the observed state of Foo.// It should always be reconstructable from the state of the cluster and/or outside world.type FooStatus struct {        // INSERT ADDITIONAL STATUS FIELDS -- observed state of cluster}// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object// Foo is the Schema for the foos API// +k8s:openapi-gen=truetype Foo struct {        metav1.TypeMeta   `json:",inline"`        metav1.ObjectMeta `json:"metadata,omitempty"`        Spec   FooSpec   `json:"spec,omitempty"`        Status FooStatus `json:"status,omitempty"`}// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object// FooList contains a list of Footype FooList struct {        metav1.TypeMeta `json:",inline"`        metav1.ListMeta `json:"metadata,omitempty"`        Items           []Foo `json:"items"`}func init() {        Scheme.AddKnownTypes(GroupVersion, &Foo{}, &FooList{})}

接下来就需要生成deepcopy.go文件了:

$ controller-gen object paths=./pkg/apis/example.com/v1/types.go

同样,我们使用controller-gen生成crd:

$ mkdir config$ go mod tidy$ controller-gen crd paths=./... output:crd:dir=config/crd

这时候我们查看项目结构:

.├── config│   └── crd│       └── example.com_foos.yaml├── go.mod├── go.sum└── pkg    └── apis        └── example.com            └── v1                ├── register.go                ├── types.go                └── zz_generated.deepcopy.go6 directories, 6 files

最后我们来进行验证,首先创建一个cr:

apiVersion: example.com/v1kind: Foometadata:  name: crd-testspec:  name: test  replicas: 2

将crd和cr添加到集群后,我们来编写main.go文件来进行验证:

package mainimport (        "context"        v1 "controller-test/pkg/apis/example.com/v1"        "fmt"        "k8s.io/client-go/rest"        "k8s.io/client-go/tools/clientcmd"        "log")func main() {        config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)        if err != nil {                log.Fatalln(err)        }        // 这边需要使用原始的 RESTClient        config.APIPath = "/apis/"        config.NegotiatedSerializer = v1.Codec        config.GroupVersion = &v1.GroupVersion        client, err := rest.RESTClientFor(config)        if err != nil {                log.Fatalln(err)        }        foo := &v1.Foo{}        err = client.Get().Namespace("default").Resource("foos").Name("crd-test").Do(context.TODO()).Into(foo)        if err != nil {                log.Fatalln(err)        }        newObj := foo.DeepCopy()        newObj.Spec.Name = "test2"        fmt.Println(foo.Spec.Name)        fmt.Println(newObj.Spec.Name)}//=======// 输出结果testtest2

关于"自动生成代码controller tool怎么使用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"自动生成代码controller tool怎么使用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

生成 自动生成 文件 代码 内容 工具 知识 项目 接下来 目录 篇文章 资源 验证 原始 三个 中将 价值 只是 操作简单 文本 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 精品咖啡豆 上海睿民互联网科技有限公司 亿人帮互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 互联网最新的科技有限公司 互联网科技战争 互联网与新科技 掌上梦互联网科技 大白互联网科技 成都玖崟互联网科技有限公司乐商圈怎么样 欧洲十大科技互联网公司 互联网系的金融科技公司 阿大互联网科技有限公司 崇明区互联网教育科技售后服务 洛阳昕诺飞互联网科技有限公司 互联网数据科技专业 中和天地互联网科技有限公司 富国互联网金融科技混合基金 西安左小互联网科技有限公司 互联网科技创业计划的风险分析 伟宏互联网科技 互联网科技产业 网络科技有限互联网 互联网金融 科技创新 上海电发互联网科技有限公司 上海宁丞科技互联网 互联网科技大赛获奖感言 特约风豹互联网科技为什么扣费 杭州融税互联网科技有限公司 山东亿川互联网科技有限责任公司
0