K8s源码分析(16)-资源的API数据结构
上一篇文章里,我们主要介绍了kubernetes 中资源服务类接口的实现,包括操作策略类接口以及其它的类型的具体实现。但是不论如何,在 kubernetes 定义中所有的组以及组内各个...
上一篇文章里,我们主要介绍了 kubernetes 中资源服务类接口的实现,包括操作策略类接口以及其它的类型的具体实现。但是不论如何, 在 kubernetes 定义中所有的组以及组内各个版本的资源都是通过 REST API 来向外暴露提供操作的,在本篇文章中我们主要介绍 kubernetes 资源 API 的数据结构。
从 kubernetes 相关资源 API 的数据结构角度上看,主要包括三个结构体, APIGroupInfo 结构体, APIGroupVersion 结构体,APIInstaller 结构体,下面我们逐一对其介绍。
APIGroupInfo结构体
对于 APIGroupInfo 结构体,其主要定义了具体某一个资源组 API 的相关信息,例如常见的 apps 和 core 资源组,其图解和源码如下:
// k8s.io/apiserver/pkg/server/genericapiserver.go
type APIGroupInfo struct {
PrioritizedVersions []schema.GroupVersion
VersionedResourcesStorageMap map[string]map[string]rest.Storage
OptionsExternalVersion *schema.GroupVersion
MetaGroupVersion *schema.GroupVersion
Scheme *runtime.Scheme
NegotiatedSerializer runtime.NegotiatedSerializer
ParameterCodec runtime.ParameterCodec
StaticOpenAPISpec *spec.Swagger
}
func NewDefaultAPIGroupInfo(group string, scheme *runtime.Scheme, parameterCodec runtime.ParameterCodec, codecs serializer.CodecFactory) APIGroupInfo {
return APIGroupInfo{
PrioritizedVersions: scheme.PrioritizedVersionsForGroup(group),
VersionedResourcesStorageMap: map[string]map[string]rest.Storage{},
OptionsExternalVersion: &schema.GroupVersion{Version: "v1"},
Scheme: scheme,
ParameterCodec: parameterCodec,
NegotiatedSerializer: codecs,
}
}
结构体中包含 PrioritizedVersions 属性代表某一组下资源所有的版本。
包含了 VersionedResourcesStorageMap 属性来 map 该组下某一个具体版本对应的资源操作实例,key 为具体的版本的名称,例如 v1/v1beta1 等版本。value 则为另外一个 map ,在此 map 中 key 为该版本里某一个具体的资源的名称,例如常见资源 depployment/demonset 等,value 则为在以前文章中我们介绍的资源操作接口 rest.Storage 类型。
结构体中有以前文章中介绍的 Scheme 属性,来 hold 各种资源注册在其中。
在该结构体中定义有以前文章中我们介绍的 NegotiatedSerializer 接口类型属性来辅助完成资源的序列化和反序列化。
APIGroupVersion结构体
对于 APIGroupVersion 结构体,其主要定义了某一个资源组下的某一个具体版本 API 的相关信息,例如我们常见的 apps 资源组下的 v1 版本,其图解和相关源码如下:
// k8s.io/apiserver/pkg/endpoints/groupversion.go
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
ConvertabilityChecker ConvertabilityChecker
Defaulter runtime.ObjectDefaulter
Linker runtime.SelfLinker
UnsafeConvertor runtime.ObjectConvertor
TypeConverter fieldmanager.TypeConverter
EquivalentResourceRegistry runtime.EquivalentResourceRegistry
Authorizer authorizer.Authorizer
Admit admission.Interface
MinRequestTimeout time.Duration
OpenAPIModels openapiproto.Models
MaxRequestBodyBytes int64
}
该结构体有属性 GroupVersion 来代表是哪个资源组的哪个版本,例如 apps/v1, apps/v1beta1 等版本。
该结构体有属性 Storage 来 map 此版本下各个资源对应的操作类,key 为某一个具体的资源的实际名称,例如常见资源 depployment/demonset 等等,value 则为以前文章中我们介绍的资源操作接口 rest.Storage 类型。
结构体有属性 Root 代表 API 的根路径。
结构体中有 Serializer 属性来辅助完成资源的序列化和反序列化操作。
结构体有 Typer 属性辅助识别资源类型。
结构体有 Creater 属性辅助实例化资源。
结构体中有 Defaulter 属性来辅助资源默认值的初始化。
结构体中有 Convertor 属性来辅助完成资源的不同版本的转化。
APIInstaller结构体
对于 APIInstaller 结构体,主要用来辅助完成资源到 REST API 的注册,其图解和源码如下:
// k8s.io/apiserver/pkg/endpoints/installer.go
type APIInstaller struct {
group *APIGroupVersion
prefix string // Path prefix where API resources are to be registered.
minRequestTimeout time.Duration
}
该结构体有上面介绍的 APIGroupVersion 指针类型的属性 group,其代表将要对某个组下的某个版本的所有资源注册相关的 REST API。
结构体有 prefix 属性代表 API 的前缀。
该结构体中包含 minRequestTimeout 属性来代表 API 的请求最小时间。
目前先我们写到这里,在下一篇文章中我们继续来介绍 kubernetes 资源 API 结构体的创建。
更多推荐
所有评论(0)