kubernetes从apiserver中独立出来了一个项目:apiserver,可以基于这个库快速实现一个类似kubernetes apiserver的服务。
Generic library for building a Kubernetes aggregated API server.
如果直接阅读kubenetes的apiserver源码,会发现很多实现都位于这个项目中。kubenetes源码目录下还有个sample-apiserver,是用于示例如何使用这个库的。从这个sample可以更快速地了解kubernetes apiserver的实现,以及如何使用。
简单来说,这个apiserver库做了很多抽象,基本上,用户只需要描述自己的资源结构是怎样的,就可以构建出一个类似kubernetes的apiserver,具备资源多版本兼容能力,对外提供json/yaml的http restful接口,并持久化到etcd中。接下来主要讲下大概的用法以及apiserver中的主要概念。
apiserver简介
apiserver简单来说,可以理解为一个基于etcd,并提供HTTP接口的对象(资源)系统。其提供了针对多种资源的操作,例如CRUD、列表读取、状态读取。kubernetes中POD、Deployment、Service,都是资源,可以说kubernetes所有组件都是围绕着资源运作的。apiserver库本身是不提供任何资源的,它做了很多抽象,使得应用层可以根据自己需要添加各种资源。同时,apiserver支持相同资源多个版本的存在。
为了更容易地理解apiserver的设计,可以先自己思考如何实现出这样一个通用的资源服务框架,例如,可能需要解决以下问题:
- HTTP接口层,根据资源名映射出不同的URI,如何统一地从HTTP请求中创建出不同类型的资源
- 不同的资源支持的操作不同,如何区分
- 资源的多版本如何实现
- 资源如何统一地序列化存储到etcd中