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)
原文出处:wklken -> http://www.wklken.me/posts/2017/09/23/source-apiserver-03.html
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。