k8s 资源外部版本和内部版本

简介

kubernetes资源定义在pkg/apis目录下,在详解资源代码定义之前,先来了解一下资源的外部版本和内部版本。在Kubernetes系统中,同一资源对象对应着两个版本。

资源代码

// 外部版本所在位置

kubernetes/staging/src/k8s.io/api/

// 内部版本所在位置

kubernetes/pkg/apis/

外部版本代码

内部版本代码

为什么会有内外版本的概念

其实在 kubernetes 中对于 resource 之所以会有 version 的概念,是因为方便持续的渐进演化。

例如一个 deployment 在 v1 里有功能 A, 那么在 v1beta1 里就可能会对功能 A 来进行 enhancement 或者去增加新功能 B, 然后在 v1beta2 中又会有更多的特性加入。

从设计角度上看 kubernetes 引入的 internal version 的概念,在同一个 group 之中的所有 version 的 resource 都会转化成 internal version, 然后来持久化在 etcd cluster 之中。反之从 etcd cluster 中读取数据的时候,就会从 internal version来转化成相应的对外 version,也就是如下所示:

引入 internal version 的概念就是希望其它所有的 version 在转化的过程中仅仅会和 internal version 产生关联依赖,不会相互关联依赖。而 internal version 并不会暴露给外面使用,完全交由 kuberbetes 研发团队来维护。如果没有 internal version 那么就需要如下图来提供所有 version 之间的相互转换,这样就极大的增加了演进的复杂度,所以并没有采用如下的设计。

资源代码的定义

内部版本的资源代码结构说明如下:

  • doc.go: GoDoc文件,定义了当前包的注释信息。在Kubernetes资源包中,它还当担了代码生成器的全局Tags描述文件;
  • register.go:定义了资源组、资源版本以及资源的注册信息;
  • type.go: 定义了在当前资源组、资源版本下所支持的资源类型;
  • v1、v1beta1、v1beta2:定义了资源组下拥有的资源版本的资源
  • install:把当前资源之下的所有资源注册到资源注册表中;
  • validation:定义了资源的验证方法;
  • zz_generated.deepcopy.go:定义了资源的深复制操作,该文件由代码生成器自动生成;

将资源注册到资源注册表中(scheme)

每个kubernetes资源目录,都通过register.go代码文件定义所属的资源组和资源版本,内部版本资源对象通过runtime.APIVersionInternal标识。

代码路径:pkg/apis/apps/v1/register.go

在每个kubernetes资源组目录汇总,都拥有一个install/install.go代码文件,它负责将资源信息注册到资源注册表(Scheme)中。以core核心资源组为例,代码如下:

代码路径:pkg/apis/core/install/install.go

legacyscheme.Scheme是kube-apiserver组件的全局资源注册表,Kubernetes的所有资源信息都交给资源注册统一管理。core.AddToScheme函数注册core资源组内部版本的资源。v1.AddToScheme函数注册core资源组外部版本的资源。scheme.SetVersionPriority函数注册资源组的版本顺序,如有多个资源版本,排在最前面的为资源首选版本。

资源模型


我们可以用如下图例来表示 kubernetes 中 resource 的基本定义 model:

  • 所有 resource 的基本定义 model,总结起来就是所有的 resource 都会通过继承的方式来继承 type meta 和 object meta 类型,通过组合成员变量的方式来组合了属于 resource 自己特定的 spec 和 status。这种模型的设计理念也比较常见,类似于在 java 的世界中,多数的设计模式也都是通过继承和组合的概念来完成变化的。
  • 可以理解为,就是一个资源创建的基本框架
  • 本节也就等同于之前的k8s类型定义介绍

在 kubernetes 世界之中所有 resource 的基本定义里(例如我们常用的 YAML 文件),一定都有 type meta 和 object meta 这两个部分。在上一篇文章里我们以 deployment 资源为例, 也看同时到了 type meta 和 object meta 在源文件中的对应。

  • 我们看到在 deployment 的定义中 type meta 和 object meta 类型并没有名称的定义,而是直接写的类型。在 go 语言中,这种特性就相当于是继承 (类比 java 语言的继承) 。
  • DeploymentSpec 和 DeploymentStatus 这两种类型在资源 deployment 的定义中是有名称 Spec 和 Status 的, 在 go 语言中,这种方式就相当于是组合(类比 java 语言的成员变量)。

所以综上进行总结,在 kubernetes 世界里所有的 resource 定义之中,通过继承的方式来继承了 type meta 和 object meta 两种类型,通过组合成员变量的方式组合了属于自己特定的 spec 和 status。

TypeMeta 和 ObjectMeta 两种结构体分别定义了 kubernetes 各种资源的类型属性和实例属性。

两种结构体又分别各自实现了不同的接口, TypeMeta 来实现了 runtime.Object 这个接口以及 schema.ObjectKind 等主要接口。 而 ObjectMeta 结构体则是实现了 meta.Object 等主要接口。

对于kubernetes 中的各种不同资源(例如 deployment 等), 通过继承的方式来继承了 TypeMeta 和 ObjectMeta 两种结构体类型, 从而定义了资源 common 的属性和方法。通过组合的方式定义了属于各自不同的 spec 和 status。

虽然以上的定义和设计都是 go 语言的特性,但是不难发现其中也处处蕴含着类似我们熟悉的 java 语言之中面向对象的概念, 例如接口, 继承, 组合等等。

资源的操作方法

在Kubernetes系统中,针对每个资源都有一定的操作方法(Verbs),例如pod资源对象,可以通过kubectl命令行工具对其执行create、delete、get等操作。

资源操作方法可以通过metav1.Verbs数据结构进行描述,

代码路径:vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go

参考

原文链接:【k8s基础篇】k8s scheme2 之resource model_oceanweave的博客-CSDN博客

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值