前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用code-generator创建crd controller

使用code-generator创建crd controller

作者头像
有点技术
发布2020-07-13 11:13:57
3.4K0
发布2020-07-13 11:13:57
举报
文章被收录于专栏:有点技术有点技术

code-generator

用于生成k8s风格的api代码

生成器

  • client-gen
  • conversion-gen
  • deepcopy-gen
  • defaulter-gen
  • go-to-protobuf
  • import-boss
  • informer-gen
  • lister-gen
  • openapi-gen
  • register-gen
  • set-gen

client-gen

在 pkg/apis/{GROUP}/{VERSION}/types.go中使用,使用 // +genclient标记对应类型生成的客户端, 如果与该类型相关联的资源不是命名空间范围的(例如PersistentVolume), 则还需要附加 // + genclient:nonNamespaced标记,

  • // +genclient - 生成默认的客户端动作函数(create, update, delete, get, list, update, patch, watch以及 是否生成updateStatus取决于.Status字段是否存在)。
  • // +genclient:nonNamespaced - 所有动作函数都是在没有名称空间的情况下生成
  • // +genclient:onlyVerbs=create,get - 指定的动作函数被生成.
  • // +genclient:skipVerbs=watch - 生成watch以外所有的动作函数.
  • // +genclient:noStatus - 即使 .Status字段存在也不生成updateStatus动作函数

官方文档

conversion-gen

conversion-gen是用于自动生成在内部和外部类型之间转换的函数的工具。一般的转换代码生成任务涉及三套程序包:

  • 一套包含内部类型的程序包,
  • 一套包含外部类型的程序包,
  • 单个目标程序包(即,生成的转换函数所在的位置,以及开发人员授权的转换功能所在的位置)。 包含内部类型的包在Kubernetes的常规代码生成框架中扮演着称为 peerpackage的角色。

使用方法

  • 标记转换内部软件包 // +k8s:conversion-gen=<import-path-of-internal-package>
  • 标记转换外部软件包 // +k8s:conversion-gen-external-types=<import-path-of-external-package>
  • 标记不转换对应注释或结构 // +k8s:conversion-gen=false

官方文档

deepcopy-gen

deepcopy-gen是用于自动生成DeepCopy函数的工具,使用方法:

  • 在文件中添加注释 // +k8s:deepcopy-gen=package
  • 为单个类型添加自动生成 // +k8s:deepcopy-gen=true
  • 为单个类型关闭自动生成 // +k8s:deepcopy-gen=false

defaulter-gen

用于生成Defaulter函数

  • 为包含字段的所有类型创建defaulters, // +k8s:defaulter-gen=<field-name-to-flag>
  • 所有都生成 // +k8s:defaulter-gen=true|false

go-to-protobuf

通过go struct生成pb idl

import-boss

在给定存储库中强制执行导入限制

informer-gen

生成informer

lister-gen

生成对应的lister方法

openapi-gen

生成openAPI定义

使用方法:

  • +k8s:openapi-gen=true 为指定包或方法开启
  • +k8s:openapi-gen=false 指定包关闭

register-gen

生成register

手动添加基础代码

ip是我们定义的新的资源

  • pkg/apis/ip/register.go内容如下
代码语言:javascript
复制
package ip

// GroupName is the group name used in this package
const (
    GroupName = "rocdu.top"
)
  • pkg/apis/ip/v1/doc.go内容如下
代码语言:javascript
复制
// +k8s:deepcopy-gen=package

// Package v1 is the v1 version of the API.
// +groupName=rocdu.top
package v1
  • pkg/apis/ip/v1/types.go内容如下,该文件包含了资源的数据结构,对应yaml
代码语言:javascript
复制
package v1

import (
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// +genclient
// +genclient:noStatus
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// ip is a res to get  node/pod from ip
type Ip struct {
    metav1.TypeMeta `json:",inline"`
    // +optional
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec IpSpec `json:"spec"`
}

type IpSpec struct {
    Pod  string `json:"pod,omitempty"`
    Node string `json:"node,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// IpCrdList is a list of ip
type IpList struct {
    metav1.TypeMeta `json:",inline"`
    metav1.ListMeta `json:"metadata"`

    Items []Ip `json:"items"`
}
  • boilerplate.go.txt该文件是文件开头统一的注释
代码语言:javascript
复制
boilerplate.go.txt

/*
/*
@Time : 2019/12/23 3:08 下午
@Author : tianpeng.du
@File : types
@Software: GoLand
*/
  • pkg/apis/ip/v1/register.go
代码语言:javascript
复制
package v1

import (
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/apimachinery/pkg/runtime/schema"

    "github.com/du2016/code-generator/pkg/apis/ip"
)

// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: ip.GroupName, Version: "v1"}

// Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) schema.GroupKind {
    return SchemeGroupVersion.WithKind(kind).GroupKind()
}

// Resource takes an unqualified resource and returns a Group qualified GroupResource
func Resource(resource string) schema.GroupResource {
    return SchemeGroupVersion.WithResource(resource).GroupResource()
}

var (
    // SchemeBuilder initializes a scheme builder
    SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
    // AddToScheme is a global function that registers this API group & version to a scheme
    AddToScheme = SchemeBuilder.AddToScheme
)

// Adds the list of known types to Scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
    scheme.AddKnownTypes(SchemeGroupVersion,
        &Ip{},
        &IpList{},
    )
    metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
    return nil
}

生成代码

代码语言:javascript
复制
./vendor/k8s.io/code-generator/generate-groups.sh all github.com/du2016/code-generator/pkg/client github.com/du2016/code-generator/pkg/apis ip:v1

使用crd informer

代码语言:javascript
复制
informer := externalversions.NewSharedInformerFactoryWithOptions(clientset, 10*time.Second, externalversions.WithNamespace("default"))
go informer.Start(nil)

IpCrdInformer:=informer.Rocdu().V1().Ips()
cache.WaitForCacheSync(nil,IpCrdInformer.Informer().HasSynced)

https://github.com/kubernetes/code-generator https://github.com/kubernetes/sample-controller

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有点技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • code-generator
  • 生成器
    • client-gen
      • conversion-gen
        • deepcopy-gen
          • defaulter-gen
            • go-to-protobuf
              • import-boss
                • informer-gen
                  • lister-gen
                    • openapi-gen
                      • register-gen
                      • 手动添加基础代码
                      • 生成代码
                      • 使用crd informer
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档