参考k8s官方的sample-apiserver进行编写(项目地址:GitHub - kubernetes/sample-apiserver: Reference implementation of an apiserver for a custom Kubernetes API.)
说明:网上对于aggregated api的实战性文章非常少,有关这类的文章是在推荐使用apiserver-builder这个工具,但是在学习aggregated api编写的过程中,我觉得这个工具对于代码开发人员不太友好(起码对我这个初学k8s又要进行aggregated api开发的同学),封装的太好了,以至于很难明白其中的实现流程,代码所展现的也不是平时我所理解的web服务的代码结构(很难找到url注册以及handler注册的地方)
场景:
1)编写k8s风格的web服务 & 复用k8s的认证和鉴权;
2)想要实现类似CRD的功能,但是又不想以etcd作为后端存储
通过学习sample-apiserver,可以比较快速的通过运行sample-apiserver来了解aggregated api的运行流程并进行编码
1)编写storage,存储到map[${apiVersion}]map[${resource}]${xxx_storage}中,并注册到genericAPIServer中
1.1)storage的作用:${resource}用于注册url的subPath,${xxx_storage}表示对应url的处理逻辑,storage实现了什么接口,就会支持对应的http method,比如:实现了Getter接口,就支持GET方法
1.2)sample-apiserver中aggregated-apiserver运行时附带运行了一个etcd,这是因为代码中的storage底层是依附于etcd实现的,如果你的storage不用依赖etcd进行逻辑的处理,可以不用添加etcd这个容器
2)编写CustomResource定义(这个需要自己定义结构体),编写aggregated api时,一定需要新增CustomResource
2.1)结构体定义目录结构
2.2)结构体定义注意事项
2.3)register.go理解
2.3.1)SchemeBuilder中用于存储需要给Scheme中注册添加对资源类型描述的相关信息、Register用于给SchemeBuilder中添加函数、AddToScheme用于将SchemeBuilder登记的函数实施到Scheme中(会有一个地方统一调用所有的AddToScheme)
2.4)生成代码:
直接复制hack目录下的东西,并修改update-codegen.sh中部分东西
2.4.1)修改generate-groups.sh和generate-internal-groups.sh,具体参数的含义,这两个脚本内有样例介绍