K8s 使用code-generator生成crd controller

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的常規代碼生成框架中扮演著稱為peer package的角色。
  • 使用方法
  • 標記轉換內部軟件包 // +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內容如下

package ip

// GroupName is the group name used in this package

const (

GroupName = "rocdu.top"

)

  • pkg/apis/ip/v1/doc.go內容如下

// +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

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該文件是文件開頭統一的註釋

boilerplate.go.txt

/*

/*

@Time : 2019/12/23 3:08 下午

@Author : tianpeng.du

@File : types

@Software: GoLand

*/

  • pkg/apis/ip/v1/register.go

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

}

生成代碼

./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

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)


分享到:


相關文章: