schema 一詞起源于希臘語中的 form
或 figure
,但具體應該如何定義 schema
取決于應用環境的上下文。schema
有不同的類型,其含義與數據科學、教育、營銷和 SEO 以及心理學等領域密切相關。
在維基百科中將 schema 解釋為,圖式,在心理學中主要描述一種思維或行為類型,用來組織資訊的類別,以及資訊之間的關系。它也可以被描述為先入為主思想的心理結構,表示世界某些觀點的框架,或是用于組織和感知新資訊的系統。
但在計算機中的 schema 其實與這個解釋很接近了,從很多地方都可以看到schema這個名詞,例如 database,openldap,programing language 等的。這里可以簡單的把 _schema_理解為元數據集合(metadata component),主要包含元素及屬性的聲明,與其他數據結構組成。
數據庫中的 schema
在數據庫中,schema
就像一個骨架結構,代表整個數據庫的邏輯視圖。它設計了應用于特定數據庫中數據的所有約束。當在數據建模時,就會產生一個 schema。在談到關系數據庫]和面向對象數據庫時經常使用 schema。有時也指將結構或文本的描述。
數據庫中 schema 描述數據的形狀以及它與其他模型、表和庫之間的關系。在這種情況下,數據庫條目是 schema 的一個實例,包含 schema 中描述的所有屬性。
數據庫 schema 通常分為兩類:定義數據文件實際存儲方式的物理數據庫 schema 和邏輯數據庫 schema,它描述了應用于存儲數據的所有邏輯約束,包括完整性、表和視圖。常見包括
- 星型模式(star schema)
- 雪花模式(snowflake schema)
- 事實星座模型(fact constellation schema 或 galaxy schema)
星型模式是類似于一個簡單的數據倉庫圖,包括一對多的事實表和維度表。它使用非規范化數據。
![ac8f944a-e59d-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/6D/wKgZomTnASWAGEmGAAD81AesWRM848.png)
雪花模式是更為復雜的一種流行的數據庫模式,在該模式下,維度表是規范化的,可以節省存儲空間并最大限度地減少數據冗余。
事實星座模式遠比星型模式和雪花模式復雜得多。它擁有多個共享多個維度表的事實表。
![acc2ca7c-e59d-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/6D/wKgZomTnASWAFLdEAAFXw0LghhQ636.png)
Kubernetes 中的 schema
通過上面的闡述,大概上可以明白 schema 究竟是什么東西了,在 Kubernetes 中也有 schema 的概念,通過對 kubernetes 中資源(GVK)的規范定義、相互關系間的映射等,schema 即 k8s 資源對象元數據。
而 kubernetes 中資源對象即Group
Version
Kind
這些被定義在staging/src/k8s.io/api/type.go
中,即平時所操作的 yaml 文件,例如
apiVersion:apps/v1
kind:Deployment
metadata:
name:ngx
namespace:default
spec:
selector:
matchLabels:
app:ngx
template:
metadata:
labels:
app:nginx
spec:
containers:
-name:ngx-schema
image:nginx
ports:
-containerPort:80
![ad338618-e59d-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/6D/wKgZomTnASWAHhWyAAAttL07I9w584.png)
而對應的的即為 TypeMeta
、ObjectMeta
和DeploymentSpec
,TypeMeta
為kind
與apiserver
,ObjectMeta
為Name
、Namespace
CreationTimestamp
等段。
DeploymentSpec
則對應了 yaml 中的 spec。
而整個 yaml 組成了 一個 k8s 的資源對象。
typeDeploymentstruct{
metav1.TypeMeta`json:",inline"`
//Standardobjectmetadata.
//+optional
metav1.ObjectMeta`json:"metadata,omitempty"protobuf:"bytes,1,opt,name=metadata"`
//SpecificationofthedesiredbehavioroftheDeployment.
//+optional
SpecDeploymentSpec`json:"spec,omitempty"protobuf:"bytes,2,opt,name=spec"`
//MostrecentlyobservedstatusoftheDeployment.
//+optional
StatusDeploymentStatus`json:"status,omitempty"protobuf:"bytes,3,opt,name=status"`
}
register.go
則是將對應的資源類型注冊到 schema 中的類
var(
//TODO:moveSchemeBuilderwithzz_generated.deepcopy.gotok8s.io/api.
//localSchemeBuilderandAddToSchemewillstayink8s.io/kubernetes.
SchemeBuilder=runtime.NewSchemeBuilder(addKnownTypes)
localSchemeBuilder=&SchemeBuilder
AddToScheme=localSchemeBuilder.AddToScheme
)
//Addsthelistofknowntypestothegivenscheme.
funcaddKnownTypes(scheme*runtime.Scheme)error{
scheme.AddKnownTypes(SchemeGroupVersion,
&Deployment{},
&DeploymentList{},
&StatefulSet{},
&StatefulSetList{},
&DaemonSet{},
&DaemonSetList{},
&ReplicaSet{},
&ReplicaSetList{},
&ControllerRevision{},
&ControllerRevisionList{},
)
metav1.AddToGroupVersion(scheme,SchemeGroupVersion)
returnnil
}
而apimachinery
包則是 schema 的實現,通過看其內容可以發現,kubernetes 中 schema 就是GVK的屬性約束 與GVR之間的映射。
通過示例了解 schema
例如在apps/v1/deployment
這個資源,在代碼中表示k8s.io/api/apps/v1/types.go
,如果需要對其資源進行擴展那么需要怎么做?如,建立一個StateDeplyment
資源
typeDeploymentstruct{
metav1.TypeMeta`json:",inline"`
//Standardobjectmetadata.
//+optional
metav1.ObjectMeta`json:"metadata,omitempty"protobuf:"bytes,1,opt,name=metadata"`
如上述代碼所示,Deployment 中的metav1.TypeMeta
和metav1.ObjectMeta
![ad810abe-e59d-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/6D/wKgZomTnASWAfry8AAB1xTexssE334.png)
那么我們復制一個 Deployment 為 StateDeployment,注意,因為 Deployment 的兩個屬性,metav1.TypeMeta
和metav1.ObjectMeta
分別實現了不同的方法,如圖所示
![adc895a0-e59d-11ec-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/6D/wKgZomTnASWAUeSLAABsWcKwM-Y506.png)
所以在實現方法時,需要實現DeepCopyinfo
,DeepCopy
和繼承接口Object
的DeepCopyObject
方法
//DeepCopyIntoisanautogenerateddeepcopyfunction,copyingthereceiver,writingintoout.inmustbenon-nil.
func(in*StateDeployment)DeepCopyInto(out*StateDeployment){
*out=*in
out.TypeMeta=in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
in.Spec.DeepCopyInto(&out.Spec)
in.Status.DeepCopyInto(&out.Status)
return
}
//DeepCopyisanautogenerateddeepcopyfunction,copyingthereceiver,creatinganewStateDeployment.
func(in*StateDeployment)DeepCopy()*StateDeployment{
ifin==nil{
returnnil
}
out:=new(StateDeployment)
in.DeepCopyInto(out)
returnout
}
//DeepCopyObjectisanautogenerateddeepcopyfunction,copyingthereceiver,creatinganewruntime.Object.
func(in*StateDeployment)DeepCopyObject()runtime.Object{
ifc:=in.DeepCopy();c!=nil{
returnc
}
returnnil
}
那么擴展一個資源的整個流為:
-
資源類型在:
k8s.io/api/{Group}/types.go
-
資料類型的實現接口
k8s.io/apimachinery/pkg/runtime/interfaces.go.Object
-
其中是基于
Deployment
的類型,metav1.TypeMeta
和metav1.ObjectMeta
-
metav1.TypeMeta
實現了GetObjectKind()
;metav1.ObjectMeta
實現了DeepCopyinfo=()
,DeepCopy()
,還需要實現DeepCopyObject()
-
最后注冊資源到 schema 中
k8s.io/api/apps/v1/register.go
審核編輯 :李倩
-
API
+關注
關注
2文章
1512瀏覽量
62414 -
數據庫
+關注
關注
7文章
3851瀏覽量
64698
原文標題:理解 Kubernetes 的 API Schema
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
MySQL數據庫的安裝
![MySQL<b class='flag-5'>數據庫</b>的安裝](https://file1.elecfans.com/web3/M00/05/E2/wKgZPGeF2XWAe83fAAAW9lhgvGk652.jpg)
云數據庫是哪種數據庫類型?
數據庫加密辦法
數據庫事件觸發的設置和應用
數據庫數據恢復—MYSQL數據庫ibdata1文件損壞的數據恢復案例
數據庫數據恢復—通過拼接數據庫碎片恢復SQLserver數據庫
![<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—通過拼接<b class='flag-5'>數據庫</b>碎片恢復SQLserver<b class='flag-5'>數據庫</b>](https://file1.elecfans.com/web1/M00/F4/07/wKgaoWcjE32AbQdWAAJD_hojvJc119.png)
Oracle數據恢復—異常斷電后Oracle數據庫啟庫報錯的數據恢復案例
![Oracle<b class='flag-5'>數據</b>恢復—異常斷電后Oracle<b class='flag-5'>數據庫</b>啟<b class='flag-5'>庫</b>報錯的<b class='flag-5'>數據</b>恢復案例](https://file1.elecfans.com/web2/M00/08/B8/wKgZomb6Ns-AbiICAAFlXAFpKKU086.png)
數據庫數據恢復—SQL Server數據庫出現823錯誤的數據恢復案例
![<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—SQL Server<b class='flag-5'>數據庫</b>出現823錯誤的<b class='flag-5'>數據</b>恢復案例](https://file1.elecfans.com/web2/M00/07/F4/wKgaombs78mANJ1GAAPeSoXHVPE244.png)
恒訊科技分析:sql數據庫怎么用?
數據庫數據恢復—SQL Server數據庫所在分區空間不足報錯的數據恢復案例
數據庫數據恢復—raid5陣列上層Sql Server數據庫數據恢復案例
![<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—raid5陣列上層Sql Server<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復案例](https://file.elecfans.com/web2/M00/A2/AD/pYYBAGRLbSSAHhFWAAI9vWNRQec919.png)
選擇 KV 數據庫最重要的是什么?
![選擇 KV <b class='flag-5'>數據庫</b>最重要的是什么?](https://file1.elecfans.com/web2/M00/C7/0C/wKgaomYFejKABcBUAAYcik-_bpw704.png)
評論