schema一词源于希腊语form或figure,但如何定义schema取决于应用环境的上下文。图式有不同的类型,它们的含义与数据科学、教育、营销和SEO以及心理学等领域密切相关。

在维基百科中,图式被解释为图式,主要描述心理学中的一种思维或行为类型,用于组织信息的类别,以及信息之间的关系。也可以描述为先入为主的观念的心理结构,表达某些世界观的框架,或者组织和感知新信息的系统。

但是电脑里的图式其实很接近这个解释。schema这个术语可以在很多地方看到,比如数据库、openldap、编程语言等等。这里我们可以简单的把_schema_理解为一个元数据组件,主要包括元素和属性的声明,由其他数据结构组成。

数据库中的模式在数据库中,模式就像是一个骨架结构,代表了整个数据库的逻辑视图。它设计应用于特定数据库中数据的所有约束。对数据建模时,会生成一个模式。在谈到关系数据库和面向对象数据库时,经常会用到Schema。有时也指对结构或文字的描述。

中的数据库模式描述了数据的形状及其与其他模型、表和库的关系。在这种情况下,数据库条目是模式的一个实例,包含模式中描述的所有属性。

数据库通常分为两类:物理数据库模式和逻辑数据库模式,它们定义了数据文件的实际存储方式。它描述了应用于存储数据的所有逻辑约束,包括完整性、表和视图。包括公共

星型模式、雪花模式、事实星座模式或星系模式星型模式类似于一个简单的数据仓库图,包括一对多的事实表和维度表。它使用非规范化的数据。

雪花模式是一种比较复杂和流行的数据库模式,其中维度表是标准化的,可以节省存储空间,最大限度地减少数据冗余。

事实星座模式远比星星模式和雪花模式复杂。它有多个事实表,这些事实表共享多个维度表。

通过上面的解释,我们大概可以明白图式是什么了。在Kubernetes中还有图式的概念。通过Kubernetes中资源(GVK)的标准化定义和关系之间的映射,模式是k8s资源对象元数据。

kubernetes中的资源对象,即GroupVersionKind,是在staging/src/k8s.io/api/type.go中定义的,也就是平时操作的yaml文件,比如

API version:apps/v1 kind:deployment metadata:name:ngx namespace:default spec:selector:match labels:app:ngx template:metadata:labels:app:nginxspec:containers:-Name:ngx-schemai image:nginx ports:-container port:80对应TypeMeta、ObjectMeta和DeploymentSpec,TypeMeta是kind和apiserver,ObjectMeta是Name,NamespaceCreationTimestamp等段。

Deploymentspec对应于yaml中的规范。

整个yaml构成了一个k8s资源对象。

typeDeploymentstruct{metav1。type meta ` JSON:内嵌`//标准对象元数据。//optionalmetav1。object meta ` JSON:元数据,omitempty proto buf:bytes,1,opt,name=元数据`//specificationoftedesired behaviourofdeployment。//optionalspecdeploymentspec ` JSON:规格,omitempty proto buf:bytes,2,opt,name=spec `//mostrecentlyobsed statusofthedeployment。//optionalstatusdeploymentstatus ` JSON:地位、机遇proto buf:bytes,3,opt,name=status ` `} register.go是在模式中注册相应资源类型的类。

var(//TODO:moveschembuilderwithhz _ generated。深度复制。转k8s。io/API .//localchemebuilderandaddtoschemewillstayink 8s。木卫一/库伯内特.SchemeBuilder=运行时新建方案生成器(addKnownTypes)localschebuilder=SchemeBuilderAddToScheme=localschebuilder .addto scheme)//addsthelistofknowntypesetogivenscheme。funcadknowntypes(scheme * runtime .方案)错误方案.AddKnownTypes(SchemeGroupVersion,Deployment{},DeploymentList{},StatefulSet{},StatefulSetList{},DaemonSet{},DaemonSetList{},ReplicaSetList{},ControllerRevision{},ControllerRevisionList{,)metav1 .addtogroupvversion(scheme,schemegroupvversion)return nil }而养蜂机械包则是(计划或理论的)纲要的实现,通过看其内容可以发现,kubernetes中(计划或理论的)纲要就是GVK的属性约束与GVR之间的映射。

通过示例了解(计划或理论的)纲要例如在应用/版本1/部署这个资源,在代码中表示k8s.io/api/apps/v1/types.go,如果需要对其资源进行扩展那么需要怎么做?如,建立一个州立监狱资源

typeDeploymentstruct{metav1 .type meta ` JSON:内嵌`//标准对象元数据.//optionalmetav1 .object meta ` JSON:元数据,omitempty proto buf:字节,1,opt,name=元数据如上述代码所示,部署中的metav1 .类型元和metav1 .对象元

那么我们复制一个部署为状态部署,注意,因为部署的两个属性,metav1 .类型元和metav1 .对象元分别实现了不同的方法,如图所示

所以在实现方法时,需要实现DeepCopyinfo和继承接口目标的DeepCopyObject方法

//deepcopyintois autogenerateddeepcopyfunction,copyingthereceiver,writing toout。因穆斯本农-零。func(in * state deployment)DeepCopyInto(out * state deployment){ * out=* inout .TypeMeta=in .键入meta in。对象元。深拷入(出).ObjectMeta)在规格。DeepCopyInto(out .规格)在106 .地位。DeepCopyInto(out .status)return }//DeepCopyisanautogenerateddeepcopyfunction,copyingthereceiver,正在创建newstatdeployment。func(in *状态部署)DeepCopy()*状态部署{ ifin==nil { return nil } out:=new(状态部署)in .DeepCopyInto(out)return out }//deepcopyobjectsanautogenerateddeepcopyfunction,copyingthereceiver,creatinganewruntime .对象。func(处于*状态部署)DeepCopyObject()运行时。对象{国际金融公司:=在.DeepCopy();c!=nil{returnc}returnnil}那么扩展一个资源的整个流为:

资源类型在:k8s.io/api/{Group}/types.go资料类型的实现接口k8s.io/apimachinery/pkg/runtime/interfaces.go.Object其中是基于部署的类型,metav1 .类型元和metav1 .ObjectMetametav1。类型元实现了GetObjectKind();metav1 .对象元实现了DeepCopyinfo=(),DeepCopy(),还需要实现DeepCopyObject()最后注册资源到(计划或理论的)纲要中k8s.io/api/apps/v1/register.go

审核编辑:李倩