controller-tool的简单使用
介绍
在上一篇code-generator简单介绍中重点介绍了如何使用code-generator
来自动生成代码,通过自动生成的代码可以帮助我们像访问k8s内置资源那样来操作我们的CRD,其实就是帮助我们生成ClientSet、Informer、Lister等工具包。
但是我们需要自己定义types.go文件以及需要自己去编写crd文件。工作量其实也是很大的,那么有没有工具像code-generator那样帮助我们生成代码呢?答案是肯定的,那就是接下来要介绍的controller-tools
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
└── v1
4 directories, 1 file
接下来我们就可以使用工具来生成我们所需要的代码了,首先我们生成types.go
所需要的内容,由于type-scaffold
不支持导入文本,所以生成后我们需要复制到types.go
文件中:
$ type-scaffold --kind Foo
// FooSpec defines the desired state of Foo
type 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=true
type 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 Foo
type 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.com
package v1
import (
"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.go
package v1
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
// FooSpec defines the desired state of Foo
type 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=true
type 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 Foo
type 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.go
6 directories, 6 files
最后我们来进行验证,首先创建一个cr:
apiVersion: example.com/v1
kind: Foo
metadata:
name: crd-test
spec:
name: test
replicas: 2
将crd和cr添加到集群后,我们来编写main.go
文件来进行验证:
package main
import (
"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)
}
//=======
// 输出结果
test
test2
controller-tool的简单使用的更多相关文章
- springmvc(2)Controller源码简单解析
前面简单的分析了一下DispatcherServlet,接下来分析一下Controller,在web的MVC中,Controller就是其中的C,启动的一些页面逻辑处理,页面映射的功能: 首先看看超类 ...
- build tool 的简单认知
Build Tool 什么是Build Tool(构建工具)? 构建工具是从源代码自动创建可执行应用程序的程序(例如.apk for android app).构建包括将代码编译,链接和打包成可用或可 ...
- 基于实现Controller接口的简单Spring工程
这个Spring工程的特点是:实现了Controller接口(这样就可以在url中传参数?,待调查) 一下为代码,可运行. 1,web.xml <servlet> <servlet- ...
- 注解@Component,@Controller,@Service,@Repository简单了解
Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发.@Repository注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring B ...
- Test Controller Tool
- building tool的简单了解
java常用的三种构建工具: Apache Maven ——主要用于构建Java项目的自动化工具. NetBeans IDE 支持 Maven 构建系统,可帮助您管理项目的依赖关系.构建.报告和文档. ...
- .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
平时我们在Action中编码的时候,我们都知道所有的Action返回值类型都是ActionResult,并且我们的返回值也是各种奇葩,比如:Json(),Content(), View()等等...当 ...
- 二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- Spring Controller单元测试
SpringMVC controller测试较简单,从功能角度划分,可分为两种.一种是调用请求路径测试,另一种是直接调用Controller方法测试. 调用请求路径测试 通过请求路径调用,请求需要经过 ...
随机推荐
- java接口返回为空时候如何处理
java前后端分离以后,后端常常返回给前端以下的内容: 如果遇到某个字段的内容为空的时候会出现这样的情况: 图中红色箭头的情况是一个数组集合,但是该集合为空,所以就返回null,但是我们如果想对于这样 ...
- 一个让我很不爽的外包项目——奔驰Smart2015新官网
七月份的下半个月,有幸做了奔驰 Smart 2015年新官网,包括手机端和PC端的宣传页,地址: PC端 手机端 这里,为了证明这个是一个事实,我还特意的留存了两张截图: 这里只想说明这么几个问题: ...
- javascript 判断变量是否是数组(Array)
过完春节又有好多人寻找新的机会,旁边的人面试完就会分享一些问题,明明会的但是面试的时候,想不全,面试官不满意...这个懊恼的行为,今天的文章跟大家分享下:javascript如何判断便是是数组. 1. ...
- Javascript--function的name属性
1.非标准的name属性 function sayHi(){ console.log("Hi");} console.log(sayHi.name);
- js和原生应用常用的数据交互方式
场景1 在原生app中经常会使用到H5页面,比如说电商中的活动页,一些电商中的详情页,等等...这些页面都有一个特点,那就是在未来修改的可能性,和一次性的几率特别的大.所以用H5的页面是最睿智的一种选 ...
- java中到底什么是继承?
1.何为继承?What is Inheritance? 在上图中,对于车来讲,汽车就是子类.对于汽车来讲,奔驰就是子类.车是汽车的基类,超类,或说父类.到底什么是继承?马克-to-win,子类把父类的 ...
- 安装PLSQLDeveloper
1.点击.exe开始安装 2.选择安装路径点击下一步 3.点击finish 4.注册 ,打开新安装的plsql 如下: 点击关闭(现在是登录不上的) 点击help->Register 如下: ...
- 「进阶篇」Vue Router 核心原理解析
前言 此篇为进阶篇,希望读者有 Vue.js,Vue Router 的使用经验,并对 Vue.js 核心原理有简单了解: 不会大篇幅手撕源码,会贴最核心的源码,对应的官方仓库源码地址会放到超上,可以配 ...
- ruby 版本管理RVM (ruby version manager)
macOS. 自带的ruby 版本目录权限比较高, 经常有很多 操作需要权限而不能执行 虽然 macOS 自带了一个 ruby 环境,但是是系统自己使用的,所以权限很小,只有 system. 而/Li ...
- Windows 10搭建FTP服务器
1 开启FTP服务 控制面板 -> 程序和功能 -> 启用或关闭Windows功能 找到下面选项的勾选 2 添加FTP站点 在开始菜单里面输入 IIS 搜索并打开 IIS管理器 展开左侧菜 ...