k8s之从internal version到runtime.codec
介绍k8s internal version 和 runtime.serializer 以及 runtime.codec
一、 内部版本internal version
1、引入 internal version 目的是方便各种k8s resource 版本的持续渐进演化,通过 internal version 的概念希望其它所有的 version 在版本转换的过程中仅仅会和 internal version 产生关联依赖,不会相互关联依赖。
2、同时 internal version 并不会暴露给外面使用,完全交由 kuberbetes 研发团队来维护,并且k8s的 各种版本的资源永远都会以内部版本的形式存储在 etcd 集群中。
3、我们以 apps 资源组为例,对于其外部版本的type定义在源码目录"kubernetes\staging\src\k8s.io\api\apps",
对于各个资源组 的内部版本的type定义则在源码目录"kubernetes\pkg\apis\apps";
二、序列化与反序列化runtime.serializer
1、序列化与反序列化的主要作用是 利用 decode 操作去从请求中来提取相关的 resource, 利用 encode 操作来把相关 resource 写入到响应中去,以及设置部分默认值。
2、在k8s中中支持的序列化和反序列化的格式有很多,比如 json,yaml,protobuf 格式等。源码目录"staging/src/k8s.io/apimachinery/pkg/runtime/serializer"。
其中,MetaFactory 来负责序列化 resource 的 group, version, kind;
SerializerOption 负责定义是否为 yaml 格式,是否需要 pretty 美化处理,是否为 strict 严格处理;
ObjectTyper 和 ObjectCreater 负责序列化之后识别类型以及创建对象;
三、runtime.codec
1、k8s resource 是有内部版本和其它版本之间的转化的,正常的序列化和反序列化操作只能操作正常版本,但如果涉及到内部版本和其它版本之间相互转换的序列化以及反序列化,就会用到 codec 组件。
2、codec 组件实现了 runtime.Serializer 接口,会由 Encode 和 Decode 方法来实现正常版本和内部版本相互转换的序列化以及反序列化。源码目录"staging/src/k8s.io/apimachinery/pkg/runtime/interfaces.go";
其中:
codec 内部有 Encoder 和 Decoder 成员,主要完成正常版本下资源的某种格式序列化和反序列化,例如我们上一篇文章介绍的 json 格式。
codec 内部有 ObjectConveror 关键成员,主要完成资源的正常版本和内部版本之间的相互转化。
codec 内部有 ObjectCreater 关键成员和 ObjectDefaulter 关键成员,主要用于资源完成在 decode 操作中正常版本的创建和赋默认值。
codec 内部有 ObjectTyper 关键成员, 以用来确定资源的类型,即 GVK。
codec 内部有 encodeVersion 关键成员和 decodeVersion 关键成员,主要用于定义资源转化的版本,正常版本或者内部版本。
3、资源 decode 流程:对于一个创建资源的请求来说, 我们以常见的 apps/v1/deployment 资源为例。 decode 操作首先会将 v1 版本的 deployment 对象从请求数据中 反序列化 出来,然后在将其转化为内部版本的deployment对象,后续将这个内部版本的资源持久化在 etcd 集群里;
4、 资源 endecode 流程: 对于一个资源的查询请求, 我们以常见的 apps/v1/deployment 资源为例。 encode 操作会首先将etcd中的内部版本对象转化成相应版本v1的对象,最后序列化数据到 response 数据流中;
更多推荐
所有评论(0)