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)  }  

在这里

  1. 新建一个WebService
  2. 由installer.Install(ws)将API 对应的route新建初始化后, 加入到 WebService
  3. 将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],我们会很快的为您处理。