Kubernetes(K8s)集群中最关键的组件之一是 API Server,它是所有集群管理活动的入口点。从本文开始,我们将对 K8s API Server 的代码进行详细分析,并探讨其应用入口点、框架以及与 etcd 的通信。
应用入口点
K8s API Server 的主要入口点位于 文件的。
其中的 是构建的一个 的命令对象, 然后执行该命令即可,所以我们直接查看 函数是如果构造 对象的:
该函数最核心的功能就是使用 函数来生成 apiserver 启动需要的默认参数,然后将默认参数传递给 函数进行启动。
在 Run 函数中首先会通过 函数通过委托创建连接的 APIServer 对象。
上面的函数中可以看到 会创建3个 server:、、,APIServer 就是依靠这3个组件来对不同类型的请求进行处理的:
: 主要负责处理 CustomResourceDefinition(CRD)方面的请求
: 主要负责处理 K8s 内置资源的请求,此外还会包括通用处理、认证、鉴权等
: 主要负责聚合器方面的处理,它充当一个代理服务器,将请求转发到聚合进来的 K8s service 中
创建每个 server 都有对应的 config,可以看出上面函数中的 和 的 Config 需要依赖 ,而这几个 ServerConfig 都需要依赖 , 函数创建 ,在该函数中通过调用 来创建 GenericConfig 对象,如下代码所示。
然后我们再来分别看看这3个 Server 是如何构建的。
go-restful框架
这里我们就不得不先了解下 go-restful 这个框架了,因为 APIServer 就使用的这个框架。下面的代码是 go-restful 官方的一个示例,这个 demo 了解后基本上就知道 go-restful 框架是如何使用的了:
这个示例代码,就是使用 go-restful 的核心功能实现了一个简单的 RESTful 的 API,实现了对 User 的增删查改,其中有这么几个核心概念:、、。
:服务器容器,包含多个 WebService 和一个 http.ServerMux
:服务,由多个 Route 组成,一个 WebService 其实代表某一个对象相关的服务,如上例中的 ,针对该 要实现RESTful API,那么需要向其添加增删查改的路由,即 Route,它是 Route 的集合。
:路由,包含了 url,http 方法,接收和响应的媒体类型以及处理函数。每一个 Route,根据 Method 和 Path,映射到对应的方法中,即是 Method/Path 到 Function 映射关系的抽象,如上例中的 ,就是针对 该路径的请求,则被路由到 方法中进行处理。
Container 是 WebService 的集合,可以向 Container 中添加多个 WebService,而 Container 因为实现了 方法,其本质上还是一个,可以直接用在 中。
Kubernetes 中对 go-restful 的使用比较基础,就使用到了其最基础的路由功能,由于 K8s 有很多内置的资源对象,也包括 CRD 这种自定义资源对象,所以一开始并不是直接将这些资源对应对应的接口硬编码的,而是通过一系列代码动态注册的,所以接下来我们分析的其实就是想办法让 APIServer 能够提供如下所示的路由处理出来:
对 go-restful 有一个基础了解后,后面就可以去了解下这3个 Server 具体是如何实例化的了。
领取专属 10元无门槛券
私享最新 技术干货