clientNegotiator是序列化、反序列化的核心组件。 根据HTTP的content type,得到合适的encoder、decoder。

  1. type clientNegotiator struct {
  2. serializer NegotiatedSerializer
  3. encode, decode GroupVersioner //k8s resource的GroupVersion信息
  4. }

NegotiatedSerializer 提供能力:k8s.io/apimachinery/pkg/runtime/negotiate.go
有四个实现类

  1. CodecFactory:这是全局Codecs,也是最基础的,返回的Decoder会将object转换成internal version返回的Encoder也是会做版本转换。返回的Decoder和Encoder是versioning serializer。
  2. WithoutConversionCodecFactory:对CodecFactory封装,不需要做版本转换。大部分client都使用这个。返回的是WithoutVersionDecoder、WithVersionEncoder。WithoutVersionDecoder
  3. basicNegotiatedSerializer k8s.io/client-go/dynamic/scheme.go 用于discovery and error handling serialization
  4. negotiatedSerializerWrapper

CodecFactory,k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go :
NewCodecFactory 根据scheme创建codeFactory
—》newSerializersForScheme,自动创建 json、yaml、protobuf的serializer
—》newCodecFactory 使用 recognizer.NewDecoder

  1. // CodecFactory provides methods for retrieving codecs and serializers for specific
  2. // versions and content types.
  3. type CodecFactory struct {
  4. scheme *runtime.Scheme
  5. serializers []serializerType
  6. universal runtime.Decoder
  7. accepts []runtime.SerializerInfo
  8. legacySerializer runtime.Serializer
  9. }

Decoder、Encoder 和 serializer的关系

Decoder和Encoder都定义在 k8s.io/apimachinery/pkg/runtime/interfaces.go

serializer是实现了Decoder、Encoder接口的struct
包括有:json和protobuf是最基础的

  1. json:k8s.io/apimachinery/pkg/runtime/serializer/json 使用json-iterator 去做序列化相关
  2. protobuf:k8s.io/apimachinery/pkg/runtime/serializer/protobuf 使用protobuf去做序列化相关
  3. streaming:k8s.io/apimachinery/pkg/runtime/serializer/streaming 封装了其他的encoder和decoder,来对数据流处理
  4. versioning:k8s.io/apimachinery/pkg/runtime/serializer/versioning 包含版本信息和encoder、decoder
  5. recognizer:k8s.io/apimachinery/pkg/runtime/serializer/recognizer 自动根据Reader数据识别出Decoder,执行Decode操作

_

使用

WithoutConversionCodecFactory

根据 某个GroupVersion、NegotiatedSerializer 创建RESTClient
RESTClientFor
—》NewClientNegotiator 使用NegotiatedSerializer 和schema.GroupVersion组装一个对象