前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8s源码分析(5)-Resource Meta 序列化

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

作者头像
TA码字
发布2021-10-08 15:22:00
5420
发布2021-10-08 15:22:00
举报
文章被收录于专栏:TA码字

上一篇文章中我们主要介绍了 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 包中:

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

  • MetaFactory 来负责序列化 resource 的 group, version, kind。
  • SerializerOption 负责定义是否为 yaml 格式,是否需要 pretty 美化处理,是否为 strict 严格处理。
  • ObjectTyper 和 ObjectCreater 负责序列化之后识别类型以及创建对象。

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

代码语言:javascript
复制
// 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 的流程如下:

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

代码语言:javascript
复制
// 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 的内容序列化。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TA码字 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档