K8S源码笔记

515 阅读2分钟

K8S中代码生成器

deepcopy-gen

用于为资源定义生成deepcopy函数,生成的文件为zz_generated.deepcopy.go

defaulter-gen

用于为资源生成Defaulter相关函数,并为其生成RegisterDefaults注册函数

conversion-gen

用于为资源生成convert相关函数

openapi-gen

自动生成OpenAPI定义文件

go-bindata

用于将静态资源生成go文件,比如html静态资源

资源类型注册

代码在pkg/api/legacyscheme/scheme.go

Scheme = runtime.NewScheme()

Codecs = serializer.NewCodecFactory(Scheme)

ParameterCodec = runtime.NewParameterCodec(Scheme)

scheme用于资源的注册,资源注册中心
codec用于资源的编解码

资源注册表scheme

scheme的主要代码逻辑在staging/src/k8s.io/apimachinery/pkg/runtime/scheme.go

func NewScheme() *Scheme {
	s := &Scheme{
		gvkToType:                 map[schema.GroupVersionKind]reflect.Type{},
		typeToGVK:                 map[reflect.Type][]schema.GroupVersionKind{},
		unversionedTypes:          map[reflect.Type]schema.GroupVersionKind{},
		unversionedKinds:          map[string]reflect.Type{},
		fieldLabelConversionFuncs: map[schema.GroupVersionKind]FieldLabelConversionFunc{},
		defaulterFuncs:            map[reflect.Type]func(interface{}){},
		versionPriority:           map[string][]string{},
		schemeName:                naming.GetNameFromCallsite(internalPackages...),
	}
	s.converter = conversion.NewConverter(s.nameFunc)

	// Enable couple default conversions by default.
	utilruntime.Must(RegisterEmbeddedConversions(s))
	utilruntime.Must(RegisterStringConversions(s))
	return s
}

codec编解码器

代码在staging/src/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go k8s目前支持3中编解码器 (json编解码器,yaml编解码器,protobuf编解码器)

func NewCodecFactory(scheme *runtime.Scheme, mutators ...CodecFactoryOptionsMutator) CodecFactory {
	options := CodecFactoryOptions{Pretty: true}
	for _, fn := range mutators {
		fn(&options)
	}

	serializers := newSerializersForScheme(scheme, json.DefaultMetaFactory, options)
	return newCodecFactory(scheme, serializers)
}

pretty参数用来区分,是否是human-readable的json格式,被注册在了json编解码器中

ParameterCodec

官方注释
ParameterCodec handles versioning of objects that are converted to query parameters.
处理转化为查询参数的对象的版本控制?
不太清楚实际作用???

type ParameterCodec interface {
	// DecodeParameters takes the given url.Values in the specified group version and decodes them
	// into the provided object, or returns an error.
	DecodeParameters(parameters url.Values, from schema.GroupVersion, into Object) error
	// EncodeParameters encodes the provided object as query parameters or returns an error.
	EncodeParameters(obj Object, to schema.GroupVersion) (url.Values, error)
}

DecodeParameters将url.values中的参数按照schema.GroupVersion进行解码 EncodeParameters将obj按照schema.GroupVersion进行编码

一些不太清楚的概念

unversionedType

无版本资源类型,主要用于某些没有版本的资源类型,该类型的资源对象并不需要进行转换。