在 【Kubernetes】API Centric 这篇文章中,我们了解了 API 相关的 runtime.Scheme
和 RESTMapper
等数据结构,知道了一个API是如何以 Go Object
的形式被定义,如何被转换成 GVK
和 GVR
的。本文要解决的问题是,ApiServer
作为一个 REST API Server
,是如何将这些 API 注册到自己的服务当中的。当一个 REST API Request
到达 ApiServer
之后,到底经历了什么?
REST Storage
k8s.io/apiserver/pkg/endpoints/groupversion.go1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| type APIGroupVersion struct { Storage map[string]rest.Storage Root string
GroupVersion schema.GroupVersion OptionsExternalVersion *schema.GroupVersion MetaGroupVersion *schema.GroupVersion
RootScopedKinds sets.String
Serializer runtime.NegotiatedSerializer ParameterCodec runtime.ParameterCodec
Typer runtime.ObjectTyper Creater runtime.ObjectCreater Convertor runtime.ObjectConvertor Defaulter runtime.ObjectDefaulter Linker runtime.SelfLinker UnsafeConvertor runtime.ObjectConvertor
EquivalentResourceRegistry runtime.EquivalentResourceRegistry
Authorizer authorizer.Authorizer Admit admission.Interface
MinRequestTimeout time.Duration OpenAPIModels openapiproto.Models MaxRequestBodyBytes int64 }
|
API Installer
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| func (g *APIGroupVersion) InstallREST(container *restful.Container) error { prefix := path.Join(g.Root, g.GroupVersion.Group, g.GroupVersion.Version) installer := &APIInstaller{ group: g, prefix: prefix, minRequestTimeout: g.MinRequestTimeout, }
apiResources, ws, registrationErrors := installer.Install() versionDiscoveryHandler := discovery.NewAPIVersionHandler(g.Serializer, g.GroupVersion, staticLister{apiResources}) versionDiscoveryHandler.AddToWebService(ws) container.Add(ws) return utilerrors.NewAggregate(registrationErrors) }
|
参考资料