k8s中的核心数据结构(kuberneter源码刨析第三章)

1.GVR GVK


GVK和http路径不一一对应,GVR和http路径是一一对应的.
持久性实体,持久性资源对象(deployment)
短暂性实体(pod)
资源外部版本与内部版本 External Version Internal Version External Object Internal Object 。
外部版本用于给用户创建对象,是versioned版本。内部版本用于多个外部版本之间的转化的中间态,例如v1beta1→internal→v1。
内部版本定义在pkg/apis/{apigroup}/,外部定义在 pkg/apis/{apigroup}/{version}/和staging/src/k8s.io/{apigroup}/{version}。

staging/src/k8s.io/apiserver/pkg/registry/rest/rest.go定义了对资源各种方法的interfaces。如果某个资源对象在存储(Storage)上实现了、New及Create方法,就可以认为该资源对象拥有了create操作方法。(ducktype)

2.命名空间
3.CRD/CR
4.runtime.Object/TypeMeta
runtime.Object是一个接口,其中所有资源中的TypeMeta实现了GetObjectKind()接口。DeepCopyObject实现在各个资源的zz_generated.deepcopy.go中(外部版本实现在staging/src/k8s.io/{apigroup}/{version}/)。
5.unstructured数据
已知数据结构的数据。
6.Scheme资源注册表
UnversionedType: metav1.Status、metav1.APIVersions、metav1.APIGroupList、metav1.APIGroup、metav1.APIResourceList
KnownType: 常见Type

func main()  {
	coreGV :=schema.GroupVersion{"","v1"}
	extensionsGV:=schema.GroupVersion{"extensions","v1beta1"}
	coreInternalGV:=schema.GroupVersion{"",runtime.APIVersionInternal}
	unversioned:=schema.GroupVersion{"","v1"}
	scheme:=runtime.NewScheme()
	scheme.AddKnownTypes(coreGV,&corev1.Pod{})
	scheme.AddKnownTypes(coreGV,&corev1.Node{},&corev1.Pod{})
	scheme.AddKnownTypes(extensionsGV,&apps.DaemonSet{})
	scheme.AddKnownTypes(coreInternalGV,&corev1.Pod{})
	scheme.AddUnversionedTypes(unversioned,&metav1.Status{})
	fmt.Println(scheme.KnownTypes(coreGV))
	fmt.Println(scheme.ObjectKinds(&corev1.Pod{}))
	fmt.Println(scheme.ObjectKinds(&corev1.Namespace{}))
	fmt.Println(scheme.KnownTypes(extensionsGV))
	fmt.Println(scheme.KnownTypes(coreInternalGV))
	fmt.Println(scheme.AllKnownTypes())
}

输出如下

map[Node:v1.Node Pod:v1.Pod Status:v1.Status]
[/v1, Kind=Pod /__internal, Kind=Pod] false <nil>
[] false no kind is registered for the type v1.Namespace in scheme "pkg/runtime/scheme.go:100"
map[DaemonSet:v1.DaemonSet]
map[Pod:v1.Pod]
map[/__internal, Kind=Pod:v1.Pod /v1, Kind=Node:v1.Node /v1, Kind=Pod:v1.Pod /v1, Kind=Status:v1.Status extensions/v1beta1, Kind=DaemonSet:v1.DaemonSet]

7.codec 编解码器
Serializer:序列化器,将数据结构如struct转化为string。算了codec的一个子集。
Codec:编解码器,将某种数据结构转化为另一种数据结构。
一共三种类型,json,yaml,protobuf,其中关于yaml的编解码都是先将yaml转化为json,然后再进行编解码。
8.Converter资源版本转换器
转化函数在源代码的pkg/apis/{apigroup}/{version}/convertion.go中
通过执行kubect convert命令,--output-version将资源版本转换为指定的资源版本。如果指定的资源版本不在Scheme资源注册表中,则会报错。如果不指定资源版本,则默认转换为资源的首选版本。

posted on 2022-04-08 14:16  yangras  阅读(349)  评论(0编辑  收藏  举报

导航