Skip to content

Commit

Permalink
GITBOOK-257: No subject
Browse files Browse the repository at this point in the history
  • Loading branch information
mouuii authored and gitbook-bot committed Feb 6, 2025
1 parent 23c44c8 commit 7044c2a
Showing 1 changed file with 5 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@

apiserver 有两个很重要的模块,多版本转换和序列化,今天我们来聊聊多版本转换,它跟一般应用的多版本还不太一样,有它自己的特色,因此搞懂它的相关概念和实现原理是相当有必要的。

### API 组和版本控制 <a href="#api-groups-and-versioning" id="api-groups-and-versioning"></a>
## API 组和版本控制 <a href="#api-groups-and-versioning" id="api-groups-and-versioning"></a>

Kubernetes 支持多个 API 版本,每个版本位于不同的 API 路径, 例如 `/api/v1``/apis/rbac.authorization.k8s.io/v1alpha1`

版本控制是在 API 级别而不是在资源或字段级别完成的,以确保 API 呈现出清晰、一致的系统资源和行为视图, 并能够控制对生命结束和/或实验性 API 的访问
为了更容易演进和扩展其 API,Kubernetes 将资源分成了很多组 , 这些组可以单独演进,被启用或禁用

为了更容易演进和扩展其 API,Kubernetes 实现了 [API ](https://kubernetes.io/zh-cn/docs/reference/using-api/#api-groups), 这些 API 组可以被[启用或禁用](https://kubernetes.io/zh-cn/docs/reference/using-api/#enabling-or-disabling)
API 服务器透明地处理 API 版本之间的转换:所有不同的版本实际上都是相同持久化数据的呈现,即底层数据是同一份数据

API 资源通过其 API 组、资源类型、名字空间(用于名字空间作用域的资源)和名称来区分。 API 服务器透明地处理 API 版本之间的转换:所有不同的版本实际上都是相同持久化数据的呈现,即底层数据是同一份数据。 API 服务器可以通过多个 API 版本提供相同的底层数据,但是根据调用 API 的版本不同,可以转换成对应版本的资源对象。
&#x20;API 服务器可以通过多个 API 版本提供相同的底层数据,但是根据调用 API 的版本不同,可以转换成对应版本的资源对象。

例如,假设针对相同的资源有两个 API 版本:`v1``v1beta1`。 如果你最初使用其 API 的 `v1beta1` 版本创建了一个对象, 你稍后可以使用 `v1beta1``v1` API 版本来读取、更新或删除该对象, 直到 `v1beta1` 版本被废弃和移除为止。此后,你可以使用 `v1` API 继续访问和修改该对象。其实这个特性完全是为了保持API的兼容而设计的,正常情况下,没有人会混着版本去用,它发挥作用的地方主要在`升级迭代`,要知道随着API的迭代开发,API 会逐渐 GA 进入到稳定版本,那 beta 版,以及 alpha 版则会在某一个阶段被移除,这时候,你用beta版API创建的资源对象,仍然能够用稳定版 API 来操作,这样就实现了无缝升级。

Expand Down Expand Up @@ -226,7 +226,7 @@ OK,看了上面的功能介绍和示例,我们心里可能会有一些困惑

好,带着这些问题,我们进入下一个小节,来看看它的实现原理。

### 原理介绍
## 原理介绍

主要来说说版本是怎么转换的,为了方便各个版本之间互相转换,APIServer引入了一个`内部版本`的概念,每个API对象都有一个对应的内部版本,它是一个特殊的版本,是在APIServer内部对各个API对象进行处理时使用的数据结构(Struct),而不是使用的某个具体版本的数据结构(Struct),当该API对象跟外部交互时,则会从内部版本转换成对应的具体版本,我们称之为`外部版本`,这个“外部”其实包含两个地方:一个是通过HTTP协议跟客户端交互时,会将其转换成客户端请求的版本,一个是将该对象存储到数据库时,数据库会将其保存成某个版本的数据结构(Struct)。这个`内部版本`,有点类似于`中间版本`的概念,不论你请求的是哪个版本,都是那个版本跟`内部版本`之间互相转换,具体版本之间是不会直接进行转换的,这样就将一个网状的结构,转换成了星状的结构,减少了数据处理的维度,每个版本的API对象,只需要申明自己怎么跟`内部版本`进行转换就可以了。

Expand Down

0 comments on commit 7044c2a

Please sign in to comment.