什么是schema

schema一词起源于希腊语中的formfigure,但具体应该如何定义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)

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

雪花模式是更为复杂的一种流行的数据库模式,在该模式下,维度表是规范化的,可以节省存储空间并最大限度地减少数据冗余。

事实星座模式远比星型模式和雪花模式复杂得多。它拥有多个共享多个维度表的事实表。

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

而对应的的即为TypeMetaObjectMetaDeploymentSpec,

TypeMetakindapiserver

ObjectMetaNameNamespace CreationTimestamp等段。

DeploymentSpec 则对应了 yaml 中的 spec。

而整个yaml组成了 一个 k8s的资源对象。

type Deployment struct {
metav1.TypeMeta `json:",inline"`
// Standard object metadata.
// +optional
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Specification of the desired behavior of the Deployment.
// +optional
Spec DeploymentSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` // Most recently observed status of the Deployment.
// +optional
Status DeploymentStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}

register.go 则是将对应的资源类型注册到schema中的类

var (
// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api.
// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
localSchemeBuilder = &SchemeBuilder
AddToScheme = localSchemeBuilder.AddToScheme
) // Adds the list of known types to the given scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(SchemeGroupVersion,
&Deployment{},
&DeploymentList{},
&StatefulSet{},
&StatefulSetList{},
&DaemonSet{},
&DaemonSetList{},
&ReplicaSet{},
&ReplicaSetList{},
&ControllerRevision{},
&ControllerRevisionList{},
)
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
return nil
}

apimachinery 包则是 schema的实现,通过看其内容可以发下,kubernetes中 schema就是 GVK 的属性约束 与 GVR 之间的映射。

通过示例了解schema

例如在 apps/v1/deployment 这个资源,在代码中表示 k8s.io/api/apps/v1/types.go ,如果需要对其资源进行扩展那么需要怎么做?如,建立一个 StateDeplyment 资源

type Deployment struct {
metav1.TypeMeta `json:",inline"`
// Standard object metadata.
// +optional
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`

如上述代码所示,Deployment 中的 metav1.TypeMetametav1.ObjectMeta

那么我们复制一个 Deployment 为 StateDeployment,注意,因为 Deployment的两个属性, metav1.TypeMetametav1.ObjectMeta 分别实现了不同的方法,如图所示

所以在实现方法时,需要实现 DeepCopyinfoDeepCopy 和继承接口 ObjectDeepCopyObject 方法

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-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
} // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StateDeployment.
func (in *StateDeployment) DeepCopy() *StateDeployment {
if in == nil {
return nil
}
out := new(StateDeployment)
in.DeepCopyInto(out)
return out
} // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *StateDeployment) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}

那么扩展一个资源的整个流为:

  • 资源类型在:k8s.io/api/{Group}/types.go
  • 资料类型的实现接口 k8s.io/apimachinery/pkg/runtime/interfaces.go.Object
  • 其中是基于 Deployment 的类型,metav1.TypeMetametav1.ObjectMeta
  • metav1.TypeMeta 实现了 GetObjectKind()metav1.ObjectMeta 实现了DeepCopyinfo=()DeepCopy() ,还需要实现 DeepCopyObject()
  • 最后注册资源到schema中 k8s.io/api/apps/v1/register.go

API Schema in kubernetes的更多相关文章

  1. Schema、API Schema与MFn

    大部分知识都是相通的,Maya和USD在设计上有很多相似之处,USD的Schema粗看很难理解,但实际上与Maya的MFn有着异曲同工之处.这篇文章会简单介绍一下这两个知识点,做个对比,了解下它们在各 ...

  2. vue项目给less传递参数,出现 Invalid options object. Less Loader has been initialized using an options object that does not match the API schema.

    vue-cli创建的项目,想使用less-loader的全局变量配置,但是配置(vue.config.js文件)项出现 error in ./src/components/BookFooter.vue ...

  3. Docker系列(三):将.Net Core Api部署到Kubernetes (K8s)中

    1.新建一个WebApi项目,并添加Dockerfile文件: FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EX ...

  4. webpack配置报错:invalid configuration object.webpack has been initialisted using a configuration objcet that does not match thie API schema

    最近接收了别人的项目,webpack配置总是报错如下:最后找到了解决办法,在此分享一下: 错误情况: 解决办法: 将package.json里面的colors删除掉即可

  5. 解决:Sass Loader has been initialised using an options object that does not ma tch the API schema.

    今天是犯傻的一天,第一回用sass遇到了bug: 结果就是:<style lang = 'scss'>.写成了<style lang = 'sass'> (脑子要清醒一点.太笨 ...

  6. Kubernetes API作为权威接口,Kubernetes将成为软件的通用控制平面

    1创新之处在于API这是有关 Kubernetes的两部分系列中的第一篇.第一部分是一个答案:影响Kubernetes设计的关键思想是什么?Kubernetes会将它与其他平台区分开来吗?第二部分是关 ...

  7. 使用aggregation API扩展你的kubernetes API

    Overview What is Kubernetes aggregation Kubernetes apiserver aggregation AA 是Kubernetes提供的一种扩展API的方法 ...

  8. API网关+Kubernetes集群的架构替代了传统的Nginx(Ecs)+Tomcat(Ecs)

    API网关为K8s容器应用集群提供强大的接入能力_最佳实践_API 网关-阿里云 https://help.aliyun.com/document_detail/71623.html 在最后一节,我们 ...

  9. 资深专家深度剖析Kubernetes API Server第1章(共3章)

    欢迎来到深入学习Kubernetes API Server的系列文章,在本系列文章中我们将深入的探究Kubernetes API Server的相关实现.如果你对Kubernetes的内部实现机制比较 ...

随机推荐

  1. linux环境下搭建solr服务器--单机版

    前提需要在安装好jdk和tomcat,本人用的是jdk1.8+tomcat8.5+solr4.10. 第一步:安装linux.jdk.tomcat.(这步都是比较简单的,就不多说了) 第二步:把sol ...

  2. 完美解决 scipy.misc.imread 报错 TypeError: Image data cannot be converted to float

    File "/home/harrison/anaconda3/lib/python3.7/site-packages/matplotlib/image.py", line 634, ...

  3. (4)_结果与讨论Result and Discussion【论文写作】

  4. post提交的数据有哪几种编码格式?能否通过URL参数获取用户账户密码

    这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [post提交的 ...

  5. elf,基于flexbox的响应式CSS框架

    官网地址:http://jrainlau.github.io/elf/项目地址:https://github.com/jrainlau/elf 介绍 取名为"精灵"的elf,是一个 ...

  6. 关于Echarts的填坑之旅

    正如标题所说,这是Echarts的一遍填坑,如果你是一些echart的配置的话可以阅读http://echarts.baidu.com/opti...的官网配置信息.今天我想给大家分享的是一些我前段时 ...

  7. Python窗口学习之浅尝按键触发事件

    一.窗口上敲键盘触发事件(以Enter键为例) 二.点击窗口按钮触发事件(以鼠标左键双击为例) 代码: import tkinter as tk root = tk.Tk() root.geometr ...

  8. 【MarkDown】使用

    1. 插入代码 在代码前后加上三个点样式的标识符: ``` 效果: 我是代码 1-1 换行 &符号加上 "ensp;"   2. 标题样式定制 # 一级标题 ## 二级标题 ...

  9. Android回到页面并刷新数据

    通过对Android Activity的生命周期的了解,需要在后退页面重写onResume()的方法. 建立自己更新数据的函数,并在onCreate()方法中调用. @Override protect ...

  10. vue行内动态添加样式或者动态添加类名

    还是记录一下吧(๑•ᴗ•๑) <li :style="{backgroundImage:`url(${item.pic})`}" @click="chooseVip ...