k8s APIServer源码: api注册主体流程
基于版本 1.6.7
k8s使用了go-restful github, 在前面, 已经介绍了container
如何初始化的.
这里, 需要关注, api是如何注册进来的. 即, route -> webservice -> container
begin
- pkg/master/master.go
func (c completedConfig) New() (*Master, error) {
// register /api
m.InstallLegacyAPI(c.Config, c.Config.GenericConfig.RESTOptionsGetter, legacyRESTStorageProvider)
// register /apis
m.InstallAPIs(c.Config.APIResourceConfigSource, c.Config.GenericConfig.RESTOptionsGetter, restStorageProviders...)
}
1. /api
- pkg/master/master.go
func (m *Master) InstallLegacyAPI(c *Config, restOptionsGetter generic.RESTOptionsGetter, legacyRESTStorageProvider corerest.LegacyRESTStorageProvider) {
legacyRESTStorage, apiGroupInfo, err := legacyRESTStorageProvider.NewLegacyRESTStorage(restOptionsGetter)
m.GenericAPIServer.InstallLegacyAPIGroup(genericapiserver.DefaultLegacyAPIPrefix, &apiGroupInfo)
- vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
func (s *GenericAPIServer) InstallLegacyAPIGroup(apiPrefix string, apiGroupInfo *APIGroupInfo) error {
s.installAPIResources(apiPrefix, apiGroupInfo)
}
2. /apis
- pkg/master/master.go
func (m *Master) InstallAPIs(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter, restStorageProviders ...RESTStorageProvider) {
for i := range apiGroupsInfo {
m.GenericAPIServer.InstallAPIGroup(&apiGroupsInfo[i]) }
}
- vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
func (s *GenericAPIServer) InstallAPIGroup(apiGroupInfo *APIGroupInfo) error {
s.installAPIResources(APIGroupPrefix, apiGroupInfo)
}
3. all to installAPIResources
- vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo) error {
for _, groupVersion := range apiGroupInfo.GroupMeta.GroupVersions {
apiGroupVersion.InstallREST(s.HandlerContainer.Container)
}
}
- vendor/k8s.io/apiserver/pkg/endpoints/groupversion.go
func (g *APIGroupVersion) InstallREST(container *restful.Container) error {
installer := g.newInstaller()
// 新建一个WebService
ws := installer.NewWebService()
// 关键, URL注册, add router into ws
apiResources, registrationErrors := installer.Install(ws)
lister := g.ResourceLister
if lister == nil {
lister = staticLister{apiResources}
}
AddSupportedResourcesWebService(g.Serializer, ws, g.GroupVersion, lister)
// container.add(webservice)
container.Add(ws)
return utilerrors.NewAggregate(registrationErrors)
}
在这里
- 新建一个
WebService
- 由
installer.Install(ws)
将API 对应的route
新建初始化后, 加入到WebService
- 将
WebService
加入到Container
完成了router -> webservice -> container
的流程
后面, 分析 installer.Install(ws)
具体做了哪些事情(vendor/k8s.io/apiserver/pkg/endpoints/installer.go
)