clientNegotiator是序列化、反序列化的核心组件。 根据HTTP的content type,得到合适的encoder、decoder。
type clientNegotiator struct {
serializer NegotiatedSerializer
encode, decode GroupVersioner //k8s resource的GroupVersion信息
}
NegotiatedSerializer 提供能力:k8s.io/apimachinery/pkg/runtime/negotiate.go
有四个实现类
- CodecFactory:这是全局Codecs,也是最基础的,返回的Decoder会将object转换成internal version,返回的Encoder也是会做版本转换。返回的Decoder和Encoder是versioning serializer。
- WithoutConversionCodecFactory:对CodecFactory封装,不需要做版本转换。大部分client都使用这个。返回的是WithoutVersionDecoder、WithVersionEncoder。WithoutVersionDecoder
- basicNegotiatedSerializer k8s.io/client-go/dynamic/scheme.go 用于discovery and error handling serialization
- negotiatedSerializerWrapper
CodecFactory,k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go :
NewCodecFactory 根据scheme创建codeFactory
—》newSerializersForScheme,自动创建 json、yaml、protobuf的serializer
—》newCodecFactory 使用 recognizer.NewDecoder
// CodecFactory provides methods for retrieving codecs and serializers for specific
// versions and content types.
type CodecFactory struct {
scheme *runtime.Scheme
serializers []serializerType
universal runtime.Decoder
accepts []runtime.SerializerInfo
legacySerializer runtime.Serializer
}
Decoder、Encoder 和 serializer的关系
Decoder和Encoder都定义在 k8s.io/apimachinery/pkg/runtime/interfaces.go
serializer是实现了Decoder、Encoder接口的struct
包括有:json和protobuf是最基础的
- json:k8s.io/apimachinery/pkg/runtime/serializer/json 使用json-iterator 去做序列化相关
- protobuf:k8s.io/apimachinery/pkg/runtime/serializer/protobuf 使用protobuf去做序列化相关
- streaming:k8s.io/apimachinery/pkg/runtime/serializer/streaming 封装了其他的encoder和decoder,来对数据流处理
- versioning:k8s.io/apimachinery/pkg/runtime/serializer/versioning 包含版本信息和encoder、decoder
- recognizer:k8s.io/apimachinery/pkg/runtime/serializer/recognizer 自动根据Reader数据识别出Decoder,执行Decode操作
_
使用
WithoutConversionCodecFactory
根据 某个GroupVersion、NegotiatedSerializer 创建RESTClient
RESTClientFor
—》NewClientNegotiator 使用NegotiatedSerializer 和schema.GroupVersion组装一个对象