千家信息网

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

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍了自动生成代码controller tool怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇自动生成代码controller tool怎么使用文章都
千家信息网最后更新 2025年01月16日自动生成代码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-genhelpgentype-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安全错误 数据库的锁怎样保障安全 女生可以学软件开发 网络安全研究的必要性 武隆区工商软件开发服务特点 升级15.0后连接服务器失败 软件开发爱好者 政法委网络安全自查情况报告 数据库文本换行代码 网络安全人人有责 手抄报 毕设数据库框架设计 盘锦app软件开发报价 怎样连接服务器电脑 项目中的jdbc怎么连接数据库 软件开发项目的税费 知网数据库文件 网络安全审计服务资质认证 依托搜索频率更新数据库 服务器配置与管理期末 软件开发工程师评估 服务器关机了还能访问吗 广东数控套料软件开发商 防电诈手机网络安全教育 周村区网络安全服务中心在哪 腾讯云数据库mysql 网络安全个人心得体会800字 计算机专业数据库系统 怎样构建网络技术的文章 福建软件开发加盟商哪个好 网络安全问题原因及防范措施 网信西藏网络安全法考试答案 兴化农商行网络安全中标
0