如何操作自定义资源?
client-go为每种K8S内置资源提供对应的clientset和informer。那如果我们要监听和操作⾃定义资源对象,应该如何做呢?这⾥我们有两种⽅式:
⽅式⼀:
使⽤client-go提供的dynamicClient来操作⾃定义资源对象,当然由于dynamicClient是基于RESTClient实现的,所以我们也可以使⽤RESTClient来达到同样的⽬的。
⽅式⼆:
使⽤代码生成器来帮助我们⽣成我们需要的代码,这样我们就可以像使⽤client-go为K8S内置资源对象提供的⽅式监听和操作⾃定义资源了。
总结:k8s操作内置资源可以使用client-go,而操作自定义资源则需要通过代码生成器生成需要的代码来操作自定义资源。
概述
k8s相关功能有许多代码生成器,operator方面常使用kubebuilder、k8s.io/code-generator,以及operator-sdk。而operator-sdk,简而言之,是在kubeBuilder的基础上扩展了功能,它底层还是调用kubeBuilder。通过代码生成器根据配置信息自动生成相关API代码。截至目前版本,前两款工具在生成的文件上有如下区别:
总结:如果是制作完整的operator,那就2款产品一起用吧。
code-generator
code-generator是K8S官⽅提供的⼀组代码⽣成⼯具,它主要有两个应⽤场景:
为CRD编写⾃定义controller时,可以使⽤它来⽣成我们需要的versionedclient、informer、lister以及其他⼯具⽅法;
编写⾃定义APIServer时,可以⽤它来internal和versioned类型的转换defaulters、internal和versioned的clients和informers;
kubeBuilder
kubeBuilder相较于code-generator,在生成的代码框架上更满足于operator的需求,于是我们有必要先了解一下几个有关API的术语。在default命名空间中,一个HTTP路径为:/apis/batch/v1/namespaces/default/jobs,其中,batch为group,v1是version,jobs是resource,核心概念就出来了:
GV & GVK & GVR
GV:group & version
GVK:group & version & kind
GVR:group & version & resource
资源(resourse)总是从属于某个API组(group)的某个版本(version),也就称为GVR,同样,类型(kind)也从属于某个API组(group)的某个版本(version),称为GVK。根据GVK,k8s就能找到一个yaml所对应的资源类型,根据GVR,就能够找到对应的资源信息,于是,GVK/GVR也就成了k8s资源的坐标。
以上两种代码生成器将在接下来的文章进行介绍和实战。