我的编程空间,编程开发者的网络收藏夹
学习永远不晚
位置:首页-资讯-运维

理解 Kubernetes 的 API Schema

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

理解 Kubernetes 的 API Schema

  在 Kubernetes 中也有 schema 的概念,通过对 kubernetes 中资源(GVK)的规范定义、相互关系间的映射等,schema 即 k8s 资源对象元数据。

  词起源于希腊语中的 ​​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)

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

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

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

  Kubernetes 中的 schema

  通过上面的阐述,大概上可以明白 schema 究竟是什么东西了,在 Kubernetes 中也有 schema 的概念,通过对 kubernetes 中资源(GVK)的规范定义、相互关系间的映射等,schema 即 k8s 资源对象元数据。

  而 kubernetes 中资源对象即 ​​Group​​​ ​​Version​​​ ​​Kind​​​ 这些被定义在 ​​staging/class="lazy" data-src/k8s.io/api/type.go​​ 中,即平时所操作的 yaml 文件,例如

  复制

  1. apiVersion: apps/v1

  2. kind: Deployment

  3. metadata:

  4. name: ngx

  5. namespace: default

  6. spec:

  7. selector:

  8. matchLabels:

  9. app: ngx

  10. template:

  11. metadata:

  12. labels:

  13. app: nginx

  14. spec:

  15. containers:

  16. - name: ngx-schema

  17. image: nginx

  18. ports:

  19. - containerPort: 80 

  而对应的的即为 ​​TypeMeta​​​ 、​​ObjectMeta​​​ 和 ​​DeploymentSpec​​​,​​TypeMeta​​​ 为 ​​kind​​​ 与 ​​apiserver​​​,​​ObjectMeta​​​ 为 ​​Name​​​ 、​​Namespace​​​ ​​CreationTimestamp​​ 等段。

  ​​DeploymentSpec​​ 则对应了 yaml 中的 spec。

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

  复制

  1. type Deployment struct {

  2. metav1.TypeMeta `json:",inline"`

  3. // Standard object metadata.

  4. // +optional

  5. metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`

  6.

      7. // Specification of the desired behavior of the Deployment.

  8. // +optional

  9. Spec DeploymentSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`

     10.

  11. // Most recently observed status of the Deployment.

  12. // +optional

  13. Status DeploymentStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`

  14. }1.2.3.4.5.6.7.8.9.10.11.12.13.14.

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

  复制

  1. var (

  2. // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api.

  3. // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.

  4. SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)

  5. localSchemeBuilder = &SchemeBuilder

  6. AddToScheme = localSchemeBuilder.AddToScheme

  7. )

      8.

  9. // Adds the list of known types to the given scheme.

  10. func addKnownTypes(scheme *runtime.Scheme) error {

  11. scheme.AddKnownTypes(SchemeGroupVersion,

  12. &Deployment{},

  13. &DeploymentList{},

  14. &StatefulSet{},

  15. &StatefulSetList{},

  16. &DaemonSet{},

  17. &DaemonSetList{},

  18. &ReplicaSet{},

  19. &ReplicaSetList{},

  20. &ControllerRevision{},

  21. &ControllerRevisionList{},

  22. )

  23. metav1.AddToGroupVersion(scheme, SchemeGroupVersion)

  24. return nil

  25. }

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

  通过示例了解 schema

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

  复制

  1. type Deployment struct {

  2. metav1.TypeMeta `json:",inline"`

  3. // Standard object metadata.

  4. // +optional

  5. metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`

   如上述代码所示,Deployment 中的 ​​metav1.TypeMeta​​​ 和 ​​metav1.ObjectMeta​​

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

  8所以在实现方法时,需要实现 ​​DeepCopyinfo​​​ , ​​DeepCopy​​​ 和继承接口 ​​Object​​​ 的 ​​DeepCopyObject​​ 方法

  复制

  1. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

  2. func (in *StateDeployment) DeepCopyInto(out *StateDeployment) {

  3. *out = *in

  4. out.TypeMeta = in.TypeMeta

  5. in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)

  6. in.Spec.DeepCopyInto(&out.Spec)

  7. in.Status.DeepCopyInto(&out.Status)

  8. return

  9. }

     10.

  11. // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StateDeployment.

  12. func (in *StateDeployment) DeepCopy() *StateDeployment {

  13. if in == nil {

  14. return nil

  15. }

  16. out := new(StateDeployment)

  17. in.DeepCopyInto(out)

  18. return out

  19. }

      20. 

  21. // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

  22. func (in *StateDeployment) DeepCopyObject() runtime.Object {

  23. if c := in.DeepCopy(); c != nil {

  24. return c

  25. }

  26. return nil

  27. }

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

  资源类型在:​​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​

  >>>>>>点击进入系统运维专题

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

理解 Kubernetes 的 API Schema

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

理解 Kubernetes 的 API Schema

在 Kubernetes 中也有 schema 的概念,通过对 kubernetes 中资源(GVK)的规范定义、相互关系间的映射等,schema 即 k8s 资源对象元数据。
理解 Kubernetes 的 API Schema

编程热搜

  • 人工智能你要知道的那些事
    编程学习网:早在1g时代我们只能接打电话。2g时代可以打电话发短信,玩早期的qq,但网络十分不稳定。3g时代带给我们很大的改变就是宽带上网,视频通话,看视频,听歌玩游戏。那时的人们认为4g无用,认为不会有什么改变,但当4g出来时我们才发现这是一次质的飞跃。
    人工智能你要知道的那些事
  • 人工智能无人机管制到底有多难?
    编程学习网:近日,一段“重庆网红列车遭无人机撞击逼停”的视频,在网络热传。
    人工智能无人机管制到底有多难?
  • 人工智能与人类
    欢迎各位阅读本篇,人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。本篇文章讲述了人工智能与人类,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    人工智能与人类
  • 两小时 Elasticsearch 性能优化,直接把慢查询干团灭了……
    公共集群的机器负载分布不均衡的问题,业务的查询和流量不可控等各种各样的问题,要节省机器资源就一定会面对这种各种各样的问题,除非土豪式做法,每个业务都拥有自己的机器资源,这里面有很多很多颇具技术挑战的事情。
    两小时 Elasticsearch 性能优化,直接把慢查询干团灭了……
  • 关于OpenStack的架构详细讲解
    欢迎各位阅读本篇文章,OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。本篇文章讲述了关于OpenStack的架构详细讲解,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    关于OpenStack的架构详细讲解
  • AI &神经网络
    欢迎各位阅读本篇,本篇文章讲述了AI &神经网络,人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。神经网络内容丰富,反映了当前国内外该领域的最新研究成果和动向,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    AI &神经网络
  • 人工智能对于网络安全的优缺点
    编程学习网:如今,产生的数据比以往任何时候都要多。由于数据分析工具的发展,各行各业的组织都更加重视大数据的收集和存储。
    人工智能对于网络安全的优缺点
  • Bash 初学者系列 7:bash 中的条件语句(if else)
    今天我们介绍一下如何在 bash 中使用条件语句。
    Bash 初学者系列 7:bash 中的条件语句(if else)
  • 人工智能机器学习的重要趋势是什么?
    编程学习网:在竞争日益激烈的技术市场中,从高科技初创公司到全球跨国公司都将人工智能视为关键竞争优势。但是,人工智能行业发展如此之快,以至于很难跟踪最新的研究突破和成就,甚至很难应用科学成果来实现业务成果。
    人工智能机器学习的重要趋势是什么?
  • 人工智能为什么会觉得Matplotlib用起来困难?
    编程学习网:Matplotlib是一个流行的Python库,可以很容易地用于创建数据可视化。
    人工智能为什么会觉得Matplotlib用起来困难?

目录