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