当前位置:   article > 正文

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

newserializerwithoptions

上一篇文章中我们主要介绍了 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 的源码定义如下:

  1. // staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go
  2. type SerializerOptions struct {
  3.   Yaml bool
  4.   Pretty bool
  5. Strict bool
  6. }
  7. type Serializer struct {
  8. meta MetaFactory
  9. options SerializerOptions
  10. creater runtime.ObjectCreater
  11.   typer   runtime.ObjectTyper
  12. identifier runtime.Identifier
  13. }
  14. func NewSerializer(meta MetaFactory, creater runtime.ObjectCreater, typer runtime.ObjectTyper, pretty bool) *Serializer {
  15. return NewSerializerWithOptions(meta, creater, typer, SerializerOptions{false, pretty, false})
  16. }
  17. func NewYAMLSerializer(meta MetaFactory, creater runtime.ObjectCreater, typer runtime.ObjectTyper) *Serializer {
  18. return NewSerializerWithOptions(meta, creater, typer, SerializerOptions{true, false, false})
  19. }
  20. func NewSerializerWithOptions(meta MetaFactory, creater runtime.ObjectCreater, typer runtime.ObjectTyper, options SerializerOptions) *Serializer {
  21. return &Serializer{
  22. meta: meta,
  23. creater: creater,
  24. typer: typer,
  25. options: options,
  26. identifier: identifier(options),
  27. }
  28. }

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

04e9915360b89aea994103514c06829e.png

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

  1. // staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/meta.go
  2. type MetaFactory interface {
  3. Interpret(data []byte) (*schema.GroupVersionKind, error)
  4. }
  5. var DefaultMetaFactory = SimpleMetaFactory{}
  6. type SimpleMetaFactory struct {
  7. }
  8. func (SimpleMetaFactory) Interpret(data []byte) (*schema.GroupVersionKind, error) {
  9. findKind := struct {
  10. APIVersion string `json:"apiVersion,omitempty"`
  11. Kind string `json:"kind,omitempty"`
  12. }{}
  13. if err := json.Unmarshal(data, &findKind); err != nil {
  14. return nil, fmt.Errorf("couldn't get version/kind; json parse error: %v", err)
  15. }
  16. gv, err := schema.ParseGroupVersion(findKind.APIVersion)
  17. if err != nil {
  18. return nil, err
  19. }
  20. return &schema.GroupVersionKind{Group: gv.Group, Version: gv.Version, Kind: findKind.Kind}, nil
  21. }
  • MetaFactory 为接口类型,它的默认实现为 SimpleMetaFactory。

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

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

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号