K8s源码分析(5)-Resource Meta 序列化

上一篇文章中我们主要介绍了 kubernetes 中的所有 resource 的基本定义 model,总结起来就是所有的 resource 都会通过继承的方式来继承 type meta 和 object meta 类型,通过组合成员变量的方式来组合了属于 resource 自己特定的 spec 和 status。这种模型的设计理念也比较常见,类似于在 java 的世界中,多数的设计模式也都是通过继承和组合的概念来完成变化的。在本篇文章里我们主要介绍 kubernetes 中 resource meta 的序列化。

众所周知,我们和 kubernetes 的交互的接口就是 resource 定义的 yaml 文件,在以前文章里我们也介绍过,一个 resource object 主要是由 type meta, object meta, 还有 spec 组成,其中 type meta 就是 group, version, kind。我们如果要把这些信息存储在后端的 etcd cluster 里,就避免不了序列化和反序列化的过程。在 kubernetes 的世界里支持的序列化和反序列化的格式有很多,比方说有 json 格式, yaml 格式, protobuf 格式等。不同协议的支持定义在 staging/src/k8s.io/apimachinery/pkg/runtime/serializer 包中:

65615fb4b2be3e5c086347c6333a6ced.png

我们以常用的 json 协议格式为例,该协议由 serializer.json.Serializer 结构体负责实现, 在 staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go 中定义,图解其中包含的组件如下:

38112368db8bbc99a2f417267a649f83.png

  • MetaFactory 来负责序列化 resource 的 group, version, kind。

  • SerializerOption 负责定义是否为 yaml 格式,是否需要 pretty 美化处理,是否为 strict 严格处理。

  • ObjectTyper 和 ObjectCreater 负责序列化之后识别类型以及创建对象。

serializer.json.Serializer 的源码定义如下:

// staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go
type SerializerOptions struct {
  Yaml bool
  Pretty bool
  Strict bool
}


type Serializer struct {
  meta    MetaFactory
  options SerializerOptions
  creater runtime.ObjectCreater
  typer   runtime.ObjectTyper
  identifier runtime.Identifier
}


func NewSerializer(meta MetaFactory, creater runtime.ObjectCreater, typer runtime.ObjectTyper, pretty bool) *Serializer {
  return NewSerializerWithOptions(meta, creater, typer, SerializerOptions{false, pretty, false})
}


func NewYAMLSerializer(meta MetaFactory, creater runtime.ObjectCreater, typer runtime.ObjectTyper) *Serializer {
  return NewSerializerWithOptions(meta, creater, typer, SerializerOptions{true, false, false})
}


func NewSerializerWithOptions(meta MetaFactory, creater runtime.ObjectCreater, typer runtime.ObjectTyper, options SerializerOptions) *Serializer {
  return &Serializer{
    meta:       meta,
    creater:    creater,
    typer:      typer,
    options:    options,
    identifier: identifier(options),
  }
}

接下来我们看 resource 的 type meta 对象是如何通过反序列化从而得到的,由上述分析 serializer.json.Serializer 的 MetaFactory 组件负责反序列化 resource 的 group, version, kind,其 overall 的流程如下:

04e9915360b89aea994103514c06829e.png

从源码的角度看 MetaFactory 定义如下:

// staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/meta.go


type MetaFactory interface {
  Interpret(data []byte) (*schema.GroupVersionKind, error)
}


var DefaultMetaFactory = SimpleMetaFactory{}


type SimpleMetaFactory struct {
}


func (SimpleMetaFactory) Interpret(data []byte) (*schema.GroupVersionKind, error) {
  findKind := struct {
    APIVersion string `json:"apiVersion,omitempty"`
    Kind string `json:"kind,omitempty"`
  }{}
  if err := json.Unmarshal(data, &findKind); err != nil {
    return nil, fmt.Errorf("couldn't get version/kind; json parse error: %v", err)
  }
  gv, err := schema.ParseGroupVersion(findKind.APIVersion)
  if err != nil {
    return nil, err
  }
  return &schema.GroupVersionKind{Group: gv.Group, Version: gv.Version, Kind: findKind.Kind}, nil
}
  • MetaFactory 为接口类型,它的默认实现为 SimpleMetaFactory。

  • SimpleMetaFactory 通过实现 Interpret() 方法来完成序列化。

  • Interpret() 方法利用 encoding/json 开源工具的 json.Unmarshal() 方法来完成对资源的 group, version, kind 的提取。

目前先我们写到这里,在下一篇文章中我们来介绍 kubernates resource 的内容序列化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值