一词源于希腊形式或图形,但如何定义schema取决于应用环境的上下文。模式有不同的类型,它们的含义与数据科学、教育、营销和搜索引擎优化以及心理学等领域密切相关。在维基百科中,schema被解释为图式,主要描述心理学中的一种思维或行为,用来组织信息的类别,以及信息之间的关系。它也可以被描述为先入为主的思想结构,代表某些世界观的框架,或组织和感知新信息的系统。但是计算机中的模式实际上非常接近这种解释。schema这个词在很多地方都可以看到,比如数据库,openldap,编程语言等等,这里_schema_可以简单理解为元数据组件,主要包括元素和属性的声明,由其他数据结构组成.数据库中的模式在数据库中,模式就像一个骨架结构,表示整个数据库的逻辑视图。它设计应用于特定数据库中数据的所有约束。在对数据建模时,会生成模式。在谈论关系数据库时经常使用模式]和面向对象的数据库。有时也指结构或文本的描述。数据库中的模式描述了数据的形状及其与其他模型、表和库的关系。在这种情况下,数据库条目是模式的一个实例,其中包含模式中描述的所有属性。数据库模式通常分为两类:物理数据库模式,它定义了数据文件的实际存储方式,以及逻辑数据库模式,它描述了应用于存储数据的所有逻辑约束,包括完整性、表和视图。常见的包括星型模式、雪花模式和事实星座模式(或星系模式)。星型模式类似于一个简单的数据仓库图,包括一对多的事实表和维度表。它使用非规范化数据。雪花模式是一种更复杂和流行的数据库模式,其中维度表被规范化以节省存储空间并最小化数据冗余。事实上,星座图比星图和雪花图要复杂得多。它有多个事实表,共享多个维度表。Kubernetes中的Schema通过上面的讲解,你可以大致了解什么是schema。Kubernetes中也有schema的概念。通过kubernetes中资源(GVK)的规范定义,关系之间的映射等,schema就是k8sResource对象的元数据。kubernetes中的资源对象是GroupVersionKind这些都是在staging/src/k8s.io/api/type.go中定义的,通常是的yaml文件操作,例如apiVersion:apps/v1kind:Deploymentmetadata:name:ngxnamespace:defaultspec:selector:matchLabels:app:ngxtemplate:metadata:labels:app:nginxspec:containers:-name:ngx-schemaimage:nginxports:-containerPort:80对应的是TypeMeta、ObjectMeta和DeploymentSpec,TypeMeta是kindand。apiserver,ObjectMeta是Name,NamespaceCreationTimestamp等段。DeploymentSpec对应yaml中的spec。而整个yaml就构成了一个k8s资源对象。typeDeploymentstruct{metav1.TypeMeta`json:",inline"`//标准对象元数据。//+optionalmetav1.ObjectMeta`json:"metadata,omitempty"protobuf:"bytes,1,opt,name=metadata"`//Deployment所需行为的规范。//+optionalSpecDeploymentSpec`json:"spec,omitempty"protobuf:"bytes,2,opt,name=spec"`//最近观察到的Deployment状态。//+optionalStatusDeploymentStatus`json:"status,omitempty"protobuf:"bytes,3,opt,name=status"`}register.go则将对应的资源类类型注册到schema中的类var(//TODO:将带有zz_generated.deepcopy.go的SchemeBuilder移动到k8s.io/api。//localSchemeBuilder和AddToScheme将保留在k8s.io/kubernetes中。SchemeBuilder=runtime.NewSchemeBuilder(addKnownTypes)localSchemeBuilder=&SchemeBuilderAddToScheme=localSchemeBuilder.AddToScheme)//将已知类型列表添加到给定的scheme.funcaddKnownTypes(scheme*runtime.Sche我)错误{scheme.AddKnownTypes(SchemeGroupVersion,&Deployment{},&DeploymentList{},&StatefulSet{},&StatefulSetList{},&DaemonSet{},&DaemonSetList{},&ReplicaSet{},&ReplicaSetList{},&ControllerRevision{},&ControllerRevisionList{},)metav1.AddToGroupVersion(scheme,SchemeGroupVersion)returnnil}而apimachinery包是模式的实现。查看其内容可以发现,kubernetes中的schema是GVK和GVR的属性约束之间的映射通过示例了解模式。例如,在app/v1/deployment资源中,k8s.io/api/apps/v1/types.go在代码中表示。如果你需要扩展它的资源,那么我需要做什么?例如,创建一个StateDeplyment资源类型Deploymentstruct{metav1.TypeMeta`json:",inline"`//标准对象元数据。//+optionalmetav1.ObjectMeta`json:"metadata,omitempty"protobuf:"bytes,1,opt,name=metadata"`如上代码所示,Deployment中的metav1.TypeMeta和metav1.ObjectMeta,然后我们复制一个Deployment作为StateDeployment,注意,因为metav1.TypeMeta和metav1.ObjectMeta这两个DeploymentAttributes分别实现了不同的方法,如图,所以在实现方法的时候,需要实现DeepCopyinfo,DeepCopy和继承接口Object的DeepCopyObject方法。//DeepCopyInto是一个自动生成的深度复制函数,复制接收者,写入输出。in必须是非nil.func(in*StateDeployment)DeepCopyInto(out*StateDeployment){*out=*inout.TypeMeta=in.TypeMetain.ObjectMeta.DeepCopyInto(&out.ObjectMeta)in.Spec.DeepCopyInto(&out.Spec)in.Status.DeepCopyInto(&out.Status)返回}//DeepCopy是一个自动生成的deepcopy函数,复制接收者,创建一个新的StateDeployment.func(in*StateDeployment)DeepCopy()*StateDeployment{ifin==nil{returnnil}out:=new(StateDeployment)in.DeepCopyInto(out)returnout}//DeepCopyObject是一个自动生成的deepcopy函数,复制接收者,创建一个新的runtime.Object.func(in*StateDeployment)DeepCopyObject()runtime.Object{ifc:=in.DeepCopy();c!=nil{returnc}returnnil}然后将一个资源的整个流程展开为:resourcetypein:k8s.io/api/{Group}/types.go数据类型的实现接口k8s.io/apimachinery/pkg/runtime/interfaces.go.Object哪里是基于Deployment的类型,metav1.TypeMeta和metav1.ObjectMetametav1.TypeMetaimplementsGetObjectKind();metav1.ObjectMetaimplementedDeepCopyinfo=(),DeepCopy(),还需要实现DeepCopyObject()最后注册资源去schemak8s.io/api/apps/v1/register.go
