k8s-v1.9.3源码阅读笔记

1.入口点:cmd/kube-apiserver/apiserver.go

流程大概大概过一遍,找出路径 和 关键类


Run(runOptions *options.ServerRunOptions, stopCh <-chan struct{})
  |
  |————1) CreateServerChain(runOptions *options.ServerRunOptions, stopCh <-chan struct{}) (*genericapiserver.GenericAPIServer, error)
  |                 |  
  |                 |————1) CreateKubeAPIServerConfig(*options.ServerRunOptions, tunneler.Tunneler, *http.Transport) (*master.Config, informers.SharedInformerFactory, clientgoinformers.SharedInformerFactory, *kubeserver.InsecureServingInfo, aggregatorapiserver.ServiceResolver, error)
  |                 |           |  
  |                 |           |——————1) defaultOptions(s *options.ServerRunOptions)  
  |                 |           |——————2) Validate() []error  
  |                 |           |——————3) BuildGenericConfig(s *options.ServerRunOptions, *http.Transport) (*genericapiserver.Config, informers.SharedInformerFactory, clientgoinformers.SharedInformerFactory, *kubeserver.InsecureServingInfo, aggregatorapiserver.ServiceResolver, error)
  |                 |           |               |
  |                 |           |               |————1) NewConfig(codecs serializer.CodecFactory) *Config :包含DefaultBuildHandlerChain
  |                 |           |               |————2) genericapiserver.DefaultOpenAPIConfig(generatedopenapi.GetOpenAPIDefinitions, legacyscheme.Scheme)
  |                 |           |               |————3) genericapiserver.DefaultSwaggerConfig()
  |                 |           |               |————4) BuildStorageFactory(s *options.ServerRunOptions) (*serverstorage.DefaultStorageFactory, error)
  |                 |           |               |————5) s.Etcd.ApplyWithStorageFactoryTo(storageFactory, genericConfig)
  |                 |           |               |————6) BuildAuthenticator
  |                 |           |               |————7) BuildAuthorizer
  |                 |           |               |————8) BuildAdmissionPluginInitializers
  |                 |           |
  |                 |           |——————4) &master.Config=genericapiserver.Config+ExtraConfig
  |                 |                         
  |                 |————2) createAPIExtensionsConfig(genericapiserver.Config, kubeexternalinformers.SharedInformerFactory, *options.ServerRunOptions) (*apiextensionsapiserver.Config, error):设置RESTOptionsGetter
  |                 |————3) createAPIExtensionsServer( *apiextensionsapiserver.Config,  genericapiserver.DelegationTarget) (*apiextensionsapiserver.CustomResourceDefinitions, error)
  |                 |               |
  |                 |               |————1) apiextensionsConfig.Complete():CompletedConfig
  |                 |               |           |————(c *RecommendedConfig) Complete() CompletedConfig :cfg.GenericConfig.Complete()
  |                 |               |                          |————(c *Config) Complete(informers informers.SharedInformerFactory) CompletedConfig: c.Config.Complete(c.SharedInformerFactory)
  |                 |               |————2) (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget):*CustomResourceDefinitions
  |                 |                           |————1) c.GenericConfig.New("apiextensions-apiserver", delegationTarget):*GenericAPIServer
  |                 |                           |            |————1) NewAPIServerHandler(name string, request.RequestContextMapper, runtime.NegotiatedSerializer, HandlerChainBuilderFn, notFoundHandler http.Handler) *APIServerHandler
  |                 |                           |            |           |————1) nonGoRestfulMux := genericmux.NewPathRecorderMux(name)
  |                 |                           |            |           |————2) gorestfulContainer := restful.NewContainer()
  |                 |                           |            |————2) &GenericAPIServer
  |                 |                           |            |————3) installAPI(s *GenericAPIServer, c *Config) //第一次装载
  |                 |                           |                        |———— 1) routes.Index{}.Install(s.listedPathProvider, s.Handler.NonGoRestfulMux)
  |                 |                           |                        |———— 2) routes.SwaggerUI{}.Install(s.Handler.NonGoRestfulMux)
  |                 |                           |                        |———— 3) routes.Profiling{}.Install(s.Handler.NonGoRestfulMux)
  |                 |                           |                        |———— 4) routes.MetricsWithReset{}.Install(s.Handler.NonGoRestfulMux)
  |                 |                           |                        |———— 5) routes.DefaultMetrics{}.Install(s.Handler.NonGoRestfulMux)
  |                 |                           |                        |———— 6) routes.Version{Version: c.Version}.Install(s.Handler.GoRestfulContainer)
  |                 |                           |                        |———— 7) s.Handler.GoRestfulContainer.Add(s.DiscoveryGroupManager.WebService())  
  |                 |                           |————2) genericapiserver.NewDefaultAPIGroupInfo
  |                 |                           |————3) apiGroupInfo里设置VersionedResourcesStorageMap,NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) *REST
  |                 |                           |————4) s.InstallAPIGroup(apiGroupInfo *APIGroupInfo)
  |                 |                           |           |———— (*GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo)
  |                 |                           |                        |———— (g *APIGroupVersion) InstallREST(container *restful.Container)
  |                 |                           |                                       |———— (a *APIInstaller) Install() ([]metav1.APIResource, *restful.WebService, []error)
  |                 |                           |                                                  |———— (a *APIInstaller) newWebService() *restful.WebService
  |                 |                           |                                                  |———— 最终的API注册过程是在这个函数中完成的,把一个rest.Storage对象转换为实际的getter, lister等处理函数,并和实际的url关联起来。
  |                 |                           |                                                  |———— (a *APIInstaller) registerResourceHandlers(path string, rest.Storage, *restful.WebService, proxyHandler http.Handler) (*metav1.APIResource, error)
  |                 |                           |————5) s.GenericAPIServer.Handler.NonGoRestfulMux.Handle("/apis", crdHandler)
  |                 |                           |————6) s.GenericAPIServer.Handler.NonGoRestfulMux.HandlePrefix("/apis/", crdHandler)
  |                 |————4) CreateKubeAPIServer(*master.Config, genericapiserver.DelegationTarget, informers.SharedInformerFactory, clientgoinformers.SharedInformerFactory) (*master.Master, error)
  |                 |               |————1) kubeAPIServerConfig.Complete(versionedInformers):master.CompletedConfig:cfg.GenericConfig.Complete(informers)
  |                 |               |                           |————(c *Config) Complete(informers informers.SharedInformerFactory) CompletedConfig: c.Config.Complete(c.SharedInformerFactory)
  |                 |               |   //第二次装载 功能性的、主要的api是在m.InstallAPIs()中装载的。
  |                 |               |————2) (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget):*Master
  |                 |                           |————1) c.GenericConfig.New("kube-apiserver", delegationTarget)
  |                 |                           |————2) (m *Master) InstallLegacyAPI(c *completedConfig, generic.RESTOptionsGetter, corerest.LegacyRESTStorageProvider)
  |                 |                           |           |————1) (c LegacyRESTStorageProvider) NewLegacyRESTStorage(restOptionsGetter generic.RESTOptionsGetter) (LegacyRESTStorage, genericapiserver.APIGroupInfo, error)
  |                 |                           |           |          |———— nodestore.NewStorage(restOptionsGetter, c.KubeletClientConfig, c.ProxyTransport): //func NewStorage(...就是controller创建
  |                 |                           |           |                       |———— (e *Store) CompleteWithOptions(options *generic.StoreOptions)
  |                 |                           |           |                                   |———— (f *storageFactoryRestOptionsFactory) GetRESTOptions(resource schema.GroupResource):generic.RESTOptions
  |                 |                           |           |                                               |———— ret.Decorator = genericregistry.StorageWithCacher(cacheSize)
  |                 |                           |           |                                                       |———— 1) s, d := generic.NewRawStorage(storageConfig)
  |                 |                           |           |                                                       |       |———— s, d, err := factory.Create(*config)
  |                 |                           |           |                                                       |               |———— newETCD2Storage(c)
  |                 |                           |           |                                                       |               |———— newETCD3Storage(c)
  |                 |                           |           |                                                       |———— 2) cacher := storage.NewCacherFromConfig(cacherConfig)
  |                 |                           |           |————2) (s *GenericAPIServer) InstallLegacyAPIGroup(apiPrefix string, apiGroupInfo *APIGroupInfo)
  |                 |                           |————3) (m *Master) InstallAPIs(serverstorage.APIResourceConfigSource, generic.RESTOptionsGetter, restStorageProviders ...RESTStorageProvider)
  |                 |                                                  |———— (s *GenericAPIServer) InstallAPIGroup(apiGroupInfo *APIGroupInfo) 
  |                 |————5) kubeAPIServer.GenericAPIServer.PrepareRun()
  |                 |               |————1) routes.Swagger{Config: s.swaggerConfig}.Install(s.Handler.GoRestfulContainer)
  |                 |               |————2) routes.OpenAPI{Config: s.openAPIConfig,}.Install(s.Handler.GoRestfulContainer, s.Handler.NonGoRestfulMux)
  |                 |               |————3) s.installHealthz()
  |                 |————6) apiExtensionsServer.GenericAPIServer.PrepareRun()
  |                 |————7) createAggregatorConfig(genericapiserver.Config, *options.ServerRunOptions, kubeexternalinformers.SharedInformerFactory, aggregatorapiserver.ServiceResolver, *http.Transport) (*aggregatorapiserver.Config, error)
  |                 |————8) createAggregatorServer(*aggregatorapiserver.Config, genericapiserver.DelegationTarget, apiextensionsinformers.SharedInformerFactory) (*aggregatorapiserver.APIAggregator, error)
  |                 |               |————1) aggregatorConfig.Complete().NewWithDelegate(delegateAPIServer):*APIAggregator
  |                 |                           |———— c.GenericConfig.New("kube-aggregator", delegationTarget)
  |                 |————9) BuildInsecureHandlerChain(apiHandler http.Handler, c *server.Config) http.Handler
  |                 |————10) NonBlockingRun( *InsecureServingInfo, insecureHandler http.Handler, shutDownTimeout time.Duration, stopCh <-chan struct{}) error 
  |                                 |————serveInsecurely(insecureServingInfo *InsecureServingInfo, insecureHandler http.Handler, shutDownTimeout time.Duration, stopCh <-chan struct{})
  |                                         |————server.RunServer(insecureServer, ln, shutDownTimeout, stopCh)
  |
  |————2) (s *GenericAPIServer) PrepareRun() preparedGenericAPIServer
  |
  |————3) (s preparedGenericAPIServer) Run(stopCh <-chan struct{}) error
                            |————(s preparedGenericAPIServer) NonBlockingRun(stopCh <-chan struct{})
                                            |———— (s *GenericAPIServer) serveSecurely(stopCh <-chan struct{}) 设置APIServerHandler为http处理函数
                                                        |———— RunServer(secureServer, s.SecureServingInfo.Listener, s.ShutdownTimeout, stopCh)

2.关键类

ServerRunOptions 启动选项:

ServerRunOptions位于cmd/kube-apiserver/app/options/options.go apiserver启动配置选项,内部把配置分组到另外的配置对象上(有kube的option,有server的option)。 操作有验证validate,和 AddFlags(fs *pflag.FlagSet)

GenericAPIServer

分析APIServer的属性和方法 apiserver的核心是GenericAPIServer。

GenericAPIServer的InstallAPIGroup()方法,根据输入参数APIGroupInfo中的storage,自动生成url路由,和REST请求的Handler。

Master
APIServerHandler
Scheme
APIGroupInfo
APIGroupVersion
APIInstaller
APIGroupHandler
Store
Storage.Interface
REST
StatusREST
go-restful

kubernetes apiserver中最终使用go-restful注册资源并接收处理 HTTP 请求.

  • Container: 一组WebService的集合, 目的: Containers for WebServices on different HTTP endpoints(多个端口). 它包括一组restful.WebService和一个http.ServeMux对象,使用RouteSelector进行请求派发。
  • WebService: Route的集合; 为一组Route定义统一的 root path / 请求类型 / 响应类型
  • Route: 定义method/ULR path/输入输出类型/对应的回掉函数restful.RouteFunction/文档/参数/响应内容类型(Accept) curly route; 支持正则及动态谭树
  • Filter:用于动态的拦截请求和响应,类似于放置在相应组件前的钩子,在相应组件功能运行前捕获请求或者响应,主要用于记录log,验证,重定向等功能 Filters for intercepting the request → response flow on Service or Route level, 可以加global / Webservice / Route 各自的filter

api注册

有install*的地方, apiGroupInfo, APIServerHandler, NonGoRestfulMux, GoRestfulContainer k8s.io/apiserver/pkg/server/routes

filter

DefaultBuildHandlerChain k8s.io/apiserver/pkg/endpoints

dao: storage

k8s.io/apiserver/pkg/storage:数据库相关操作的接口 k8s.io/apiserver/pkg/storage/storagebackend/factory/factory.go
k8s.io/apiserver/pkg/storage/etcd3/store.go
k8s.io/apiserver/pkg/storage/cacher.go

handle, service系统逻辑处理: store

pkg/registry:implements the storage and system logic for the core of the api server
pkg/registry/core/rest/storage_core.go: NewLegacyRESTStorage
pkg/registry/core/xxxx/storage/storage.go: 每个资源的REST和xxxxStorage

k8s.io/apiserver/pkg/registry: the generic implementation of the storage and system logic
k8s.io/apiserver/pkg/registry/generic/storage_decorator.go k8s.io/apiserver/pkg/registry/generic/registry/storage_factory.go
k8s.io/apiserver/pkg/registry/generic/registry/store.go 原型
k8s.io/apiserver/pkg/server/options/etcd.go

猜你喜欢

转载自my.oschina.net/braveCS/blog/1623623
今日推荐