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资源注册表中,则会报错。如果不指定资源版本,则默认转换为资源的首选版本。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端