| 阅读 |,阅读约 2 分钟
| 复制链接:

Scheme原理分析

Scheme

Scheme的作用:

  • 定义了资源序列化和反序列化方法
  • 资源类型和版本的对应关系

源码位置:k8s.io/apimachinery/pkg/runtime/scheme.go

核心的字段有:

  • gvkToType
  • typeToGVK
  • defaulterFuncs
 1type Scheme struct {
 2	// versionMap allows one to figure out the go type of an object with
 3	// the given version and name.
 4	gvkToType map[schema.GroupVersionKind]reflect.Type
 5
 6	// typeToGroupVersion allows one to find metadata for a given go object.
 7	// The reflect.Type we index by should *not* be a pointer.
 8	typeToGVK map[reflect.Type][]schema.GroupVersionKind
 9
10	// unversionedTypes are transformed without conversion in ConvertToVersion.
11	unversionedTypes map[reflect.Type]schema.GroupVersionKind
12
13	// unversionedKinds are the names of kinds that can be created in the context of any group
14	// or version
15	// TODO: resolve the status of unversioned types.
16	unversionedKinds map[string]reflect.Type
17
18	// Map from version and resource to the corresponding func to convert
19	// resource field labels in that version to internal version.
20	fieldLabelConversionFuncs map[schema.GroupVersionKind]FieldLabelConversionFunc
21
22	// defaulterFuncs is an array of interfaces to be called with an object to provide defaulting
23	// the provided object must be a pointer.
24	defaulterFuncs map[reflect.Type]func(interface{})
25
26	// converter stores all registered conversion functions. It also has
27	// default converting behavior.
28	converter *conversion.Converter
29
30	// versionPriority is a map of groups to ordered lists of versions for those groups indicating the
31	// default priorities of these versions as registered in the scheme
32	versionPriority map[string][]string
33
34	// observedVersions keeps track of the order we've seen versions during type registration
35	observedVersions []schema.GroupVersion
36
37	// schemeName is the name of this scheme.  If you don't specify a name, the stack of the NewScheme caller will be used.
38	// This is useful for error reporting to indicate the origin of the scheme.
39	schemeName string
40}

Scheme的初始化

 1runtime.NewScheme()
 2
 3func NewScheme() *Scheme {
 4	s := &Scheme{
 5		gvkToType:                 map[schema.GroupVersionKind]reflect.Type{},
 6		typeToGVK:                 map[reflect.Type][]schema.GroupVersionKind{},
 7		unversionedTypes:          map[reflect.Type]schema.GroupVersionKind{},
 8		unversionedKinds:          map[string]reflect.Type{},
 9		fieldLabelConversionFuncs: map[schema.GroupVersionKind]FieldLabelConversionFunc{},
10		defaulterFuncs:            map[reflect.Type]func(interface{}){},
11		versionPriority:           map[string][]string{},
12		schemeName:                naming.GetNameFromCallsite(internalPackages...),
13	}
14	s.converter = conversion.NewConverter(s.nameFunc)
15
16	// Enable couple default conversions by default.
17	utilruntime.Must(RegisterEmbeddedConversions(s))
18	utilruntime.Must(RegisterStringConversions(s))
19
20	utilruntime.Must(s.RegisterInputDefaults(&map[string][]string{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields))
21	utilruntime.Must(s.RegisterInputDefaults(&url.Values{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields))
22	return s
23}

SchemeBuilder

资源向Scheme注册的接口函数

 1type SchemeBuilder []func(*Scheme) error
 2
 3func (sb *SchemeBuilder) AddToScheme(s *Scheme) error {
 4	for _, f := range *sb {
 5		if err := f(s); err != nil {
 6			return err
 7		}
 8	}
 9	return nil
10}