Kubernetes API Schema

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Kubernetes API 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 中资源对象即 GroupVersionKind 这些被定义在 staging/src/k8s.io/api/type.go 中,即平时所操作的 yaml 文件,例如

apiVersion: apps/v1kind: Deployment  metadata:  name:  ngx  namespace: defaultspec:  selector:      matchLabels:      app: ngx  template:      metadata:      labels:        app: nginx    spec:      containers:      - name: ngx-schema        image: nginx        ports:        - containerPort: 80

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


DeploymentSpec 则对应了 yaml 中的 spec。


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


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


// Specification of the desired behavior of the Deployment.// +optionalSpec DeploymentSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
// Most recently observed status of the Deployment.// +optionalStatus 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


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
4月前
|
Prometheus Kubernetes Cloud Native
云原生周刊:Argo Rollouts 支持 Kubernetes Gateway API 1.0 | 2024.7.1
探索开源世界:Kubetools的推荐系统[Krs](https://github.com/kubetoolsca/krs)助力K8s优化,追踪K8s组件清单,指引IAC集成。阅读建议: Prometheus与Thanos的进化故事,Adidas容器平台管理经验,K8s请求实现详解。关注云原生:Argo Rollouts支持Gateway API 1.0,Kubewarden v1.14强化策略与镜像安全。
|
1月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
145 0
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
|
3月前
|
Kubernetes Serverless API
Kubernetes 的架构问题之利用不可变性来最小化对API Server的访问如何解决
Kubernetes 的架构问题之利用不可变性来最小化对API Server的访问如何解决
80 7
|
3月前
|
资源调度 Kubernetes API
在K8S中,能否实现不通过api-Server创建Pod?
在K8S中,能否实现不通过api-Server创建Pod?
|
3月前
|
Kubernetes 负载均衡 API
在K8S中,api-service 和 kube-schedule 高可用原理是什么?
在K8S中,api-service 和 kube-schedule 高可用原理是什么?
|
3月前
|
Kubernetes 监控 API
在k8S中,各模块如何与API Server进行通信的?
在k8S中,各模块如何与API Server进行通信的?
|
3月前
|
存储 Kubernetes 负载均衡
在K8S中,api-server究竟是如何实现高可用?
在K8S中,api-server究竟是如何实现高可用?
|
4月前
|
Kubernetes Java 应用服务中间件
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
78 0
|
4天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
16天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。

热门文章

最新文章