github: https://github.com/kubernetes/code-generator
client-go 封装了对 k8s 内置资源的一些常用操作,包括了 clients/listers/informer 等对象和函数,通过 Watch 或者 Get List 获取对应的 Object,通过 Cache,可以避免对 APIServer 请求的压力
对于自己创建的 CRD,不能直接使用这些代码。
通过 code-generator,提供自己的 CRD 相关的结构体,生成 client-go 中类似的代码,方便编写自己的控制器
在 CustomResourceDefinition 上下文创建原生的,版本的 client informer lister
controller的详细设计引入:https://twitter.com/resouer/status/1009996649832185856
代码 code-generator/cmd 目录下,包括如下:
其中 pkg/apis是固定的
apps是groupname,比如 apps.k8s.io/v1
v1 是 version
doc.go types.go register.go 都是自己写的,或者使用 operator-sdk 生成,在填充
$ cat apis/apps/v1/doc.go
// Package v1 contains API Schema definitions for the apps v1 API group
// +k8s:deepcopy-gen=package
// +groupName=apps.krome.io
$ cat apis/apps/v1/statefulset_types.go
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// Statefulset is the Schema for the statefulsets API
// +kubebuilder:subresource:status
// +kubebuilder:resource:path=statefulsets,scope=Namespaced
type Statefulset struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec StatefulsetSpec `json:"spec,omitempty"`
Status StatefulsetStatus `json:"status,omitempty"`
}
+
格式注释,可以控制代码生成器的一些行为
对于自定义资源结构还需要一些接口,例如 AddToScheme
和 Resource
,这些函数负责将结构体注册到 schemes 中去。
$ cat apis/apps/v1/register.go
var (
// SchemeGroupVersion is group version used to register these objects
SchemeGroupVersion = schema.GroupVersion{Group: "apps.krome.io", Version: "v1"}
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
// SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
// AddToScheme is a global function that registers this API group & version to a scheme
AddToScheme = SchemeBuilder.AddToScheme
)
func Resource(resource string) schema.GroupResource {
return SchemeGroupVersion.WithResource(resource).GroupResource()
}
func Kind(kind string) schema.GroupKind {
return SchemeGroupVersion.WithKind(kind).GroupKind()
}
func addKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(
SchemeGroupVersion,
&Statefulset{},
&StatefulsetList{},
)
// register the type in the scheme
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
return nil
}
执行 $GOPATH/src/k8s.io/code-generator/generate-groups.sh all \
xxxxxxx/pkg/client \
xxxxxxx/pkg/apis \
apps:v1
或者像 sample-controller 写一个脚本执行 hack/update-code-gen.sh
可以生成如下代码:
在添加自己的 controller,可以使用 operator-sdk add controller 生成,在写文章分析
在 pkg/apis/${GROUP}/${VERSION}/types.go 中使用,使用 // +genclient 标记生成客户端
如果资源不是命名空间范围的(例如PersistentVolume),则附加 // + genclient:nonNamespaced标记
参考: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/generating-clientset.md
https://github.com/kubernetes/code-generator
https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/generating-clientset.md