K8s源码分析(16)-资源的API数据结构

上一篇文章里,我们主要介绍了 kubernetes 中资源服务类接口的实现,包括操作策略类接口以及其它的类型的具体实现。但是不论如何, 在 kubernetes 定义中所有的组以及组内各个版本的资源都是通过 REST API 来向外暴露提供操作的,在本篇文章中我们主要介绍 kubernetes 资源 API 的数据结构。

从 kubernetes 相关资源 API 的数据结构角度上看,主要包括三个结构体, APIGroupInfo 结构体, APIGroupVersion 结构体,APIInstaller 结构体,下面我们逐一对其介绍。

APIGroupInfo结构体

对于 APIGroupInfo 结构体,其主要定义了具体某一个资源组 API 的相关信息,例如常见的 apps 和 core 资源组,其图解和源码如下:

e0c75b0e7a2635a00dba156aa0e978aa.png

//  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 版本,其图解和相关源码如下:

f567c17726252609aca5acf591f7e85d.png

//  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 的注册,其图解和源码如下:

805a417c233a00ca638b569457330559.png

//  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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值