kubernetes-添加资源-demo-v1.5.2
本次分析将介绍如何在kubernetes v1.5.2中通过代码添加一种资源。我们假设要添加的资源为”Application”,只有一个”replicas”属性,即如下所示:
|
|
因为这个demo是参考Deployment写的,所以,我们把Application也放在了extensions/v1beta1中。自己另起一个group添加资源待以后弄清楚Kubernetes的自动生成代码机制再实验,这部分可以参考帮助文件adding-an-APIGroup.md。
添加Application的定义
首先,我们要在/pkg/apis/extensions/types.go中添加Application及ApplicationList的定义:
|
|
其中,// +genclient=true
估计是和代码自动生成机制有关,以后研究。
同样,在/pkg/extensions/v1beta1/types.go中添加Application及ApplicationList的定义:
|
|
添加完成之后,执行hack/update-all.sh -v
,执行该脚本需要下载gcr.io/google_containers/kube-cross:v1.7.4-0。然后就等,需要很长时间完成,我这边执行到特定阶段时会报错,但此时zz_generated.deepcopy.go等文件已有Application的相关转换代码,ClientSet中也已经有了Application的定义,所以主目标已经达到。至于为什么出错,出错带来的影响,还有待研究完代码自动生成机制后才能给出结论。
报错信息如下:
|
|
现在修改/pkg/apis/extensions/register.go,添加Application和ApplicationList的注册:
|
|
同样,修改/pkg/apis/extensions/v1beta1/register.go,添加Application和ApplicationList的注册:
|
|
至此,已经完成apiserver侧的资源添加,但此时,资源对应的storage还未定义,所以资源还处在不可用状态。
添加Storage
首先在/pkg/registry/extensions目录下添加application目录。
在application目录下添加doc.go:
|
|
然后添加etcd目录,并在etcd目录下,即/pkg/registry/extensions/application/etcd下添加etcd.go:
|
|
现在我们可以看到,在NewREST()函数中,我们还缺cachesize.Applications及application.Strategy还未定义。
所以修改/pkg/registry/cachesize/cachesize.go,添加Application的定义:
|
|
再来定义application.Strategy,在/pkg/registry/extensions/application/目录下添加strategy.go:
|
|
strategy.go中的这些方法或函数必须定义,至于要实现的功能,还要看具体的需求。当然,由于参考了Deployment的实现,applicationStrategy的方法Validate()调用了validate.ValidateApplication(),所以我们要去定义ValidateApplication(),定义在/pkg/apis/extensions/validation/validation.go中:
|
|
至此我们有了Application storage,现在可以在RESTStorageProvider的v1beta1Storage()中添加该storage了,在/pkg/registry/extensions/rest/storage_extensions.go中:
|
|
这里可以看到,apiResourceConfigSource.ResourceEnabled(version.WithResource(“applications”))的结果是false,因为我们还没有在apiResourceConfigSource中注册Application。
修改/pkg/master/master.go的DefaultAPIResourceConfigSource():
|
|
添加HumanPrinter
之前分析过,kubectl get pod
这类命令调用的是HumanPrinter。现在我们就需要在HumanPrinter中添加Application的打印函数。
修改/pkg/kubectl/resource_printer.go中HumanReadablePrinter的addDefaultHandlers():
|
|
可以看到,我们现在缺applicationColumns,printApplication和printApplicationList。
先来定义applicationColumns,在同文件下的var xxxColumns列表定义中添加applicationColumns:
|
|
再来定义printApplication和printApplicationList,在相同文件下,添加:
|
|
现在,我们可以执行make编译了。
验证
可以使用下面文件创建Application:
|
|
可以使用kubectl get application
获取application列表:
|
|
也可以查看具体的application:
|
|
资源添加完成。