From 5f2074a4635db001ed16b75d14eb19956b212459 Mon Sep 17 00:00:00 2001 From: mouuii <49775493+mouuii@users.noreply.github.com> Date: Fri, 30 Aug 2024 10:01:17 +0800 Subject: [PATCH] sync workflow --- .../5.1-k8s-he-xin-shu-ju-jie-gou-fen-xi.md | 190 +++++++++--------- 1 file changed, 98 insertions(+), 92 deletions(-) diff --git a/k8s-yuan-ma-ren-cai-fu-hua-xun-lian-ying/di-wu-zhang-apimachinery/5.1-k8s-he-xin-shu-ju-jie-gou-fen-xi.md b/k8s-yuan-ma-ren-cai-fu-hua-xun-lian-ying/di-wu-zhang-apimachinery/5.1-k8s-he-xin-shu-ju-jie-gou-fen-xi.md index 32be788..12553b1 100644 --- a/k8s-yuan-ma-ren-cai-fu-hua-xun-lian-ying/di-wu-zhang-apimachinery/5.1-k8s-he-xin-shu-ju-jie-gou-fen-xi.md +++ b/k8s-yuan-ma-ren-cai-fu-hua-xun-lian-ying/di-wu-zhang-apimachinery/5.1-k8s-he-xin-shu-ju-jie-gou-fen-xi.md @@ -1,100 +1,100 @@ -# 5.1 k8s核心数据结构分析 - ## apiserver -
- - -### 概述 +## 概述 理解 Kubernetes 核心数据结构,在阅读源码时可以事半功倍并能够深刻理解 Kubernetes 核心设计。在整个 Kubernetes 体系架构中,资源是 Kubernetes 最重要的概念,可以说 Kubernetes 的生态系统都围绕着资源运作。Kubernetes 系统虽然有相当复杂和众多的功能,但它本质上是一个资源控制系统——注册、管理、调度资源并维护资源的状态。 -**在 Kubernetes 庞大而复杂的系统中,只有资源是远远不够的,Kubernetes 将资源再次分组和版本化,形成 Group(资源组)、Version(资源版本)、Resource(资源)。在 Kubernetes API Server 中它们又称为 APIGroup、APIVersion、APIResource。此外还有 Kind(资源种类),描述 Resource 的种类,与 Resource 为同一级别。** +###### 在 Kubernetes 庞大而复杂的系统中,只有资源是远远不够的,Kubernetes 将资源再次分组和版本化,形成 Group(资源组)、Version(资源版本)、Resource(资源)。在 Kubernetes API Server 中它们又称为 APIGroup、APIVersion、APIResource。此外还有 Kind(资源种类),描述 Resource 的种类,与 Resource 为同一级别。 + +
-#### 组 +### 组 k8s系统支持多个 Group,每个 Group 支持多个 Version,每个 Version 支持多个 Resource,其中部分资源同时会拥有自己的子资源 SubResource。一个资源对象的表现形式为: -/, Kind= +/, Kind= 例如 apps/v1,Kind=Deployment k8s 早期是没有组的概念,是 1.1 版本引入的,那么 k8s 为什么要在版本的基础上增加组呢? 主要是支持不同资源组能够以不同的速度发展,方便迭代。 -#### 资源操作 +### 资源操作 对每个资源都可以进行一系列操作即 Verbs,Verbs 对 Etcd 集群存储中的资源对象做增、删、改、查等操作。k8s资源分为两种:Kubernetes Resource 内置资源和Custom Resource 自定义资源,自定义资源可以通过CRD实现。 -#### 版本演进 +### 版本演进 在Kubernetes开发中,我们经常可以看到不同的版本如:`alpha`, `beta`, `stable` 。那么这些不同的版本有什么区别呢? -我在 https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api\_changes.md#alpha-beta-and-stable-versions 这里找到了答案,以下是此部分翻译内容: +我在 https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api_changes.md#alpha-beta-and-stable-versions 这里找到了答案,以下是此部分翻译内容: 新功能的开发经历了以下一系列的状态,不断发展成熟: -#### Development Level 开发级别 - -* 对象版本:没有规定 -* 可用性:不会提交到主要的kubernetes仓库,因此在官方的正式发布版本中并不可用 -* 用户:其他在此功能和概念上有紧密合作的开发者(比如client的开发者) -* 可升级性,可靠性,完整性,和支持:没有要求和保证 - -#### Alpha Level - -* 对象版本:包含`alpha` 的API版本命名(比如:`v1alpha1`) -* 可用性:提交到了主要 kubernetest 仓库; 出现在正式的发布版本中; 功能是默认出于非启用状态,但是可以通过 flag 启用 -* 用户:开发者以及一些希望对早期功能给出反馈的专家用户 -* 完整性:一部分API操作,CLI命令,以及UI支持也许还未实现; API还未经过 API审查(即,在一般的代码审查的基础上,对API进行深入的,有针对性的审查) -* 可升级性: - * API对象模式和语义可能在未来的版本中变更,无需在现有的集群中保留该对象; - * 移除可升级性的担忧可以方便开发者快速的进行开发;特别的,API版本可以比miner release(次要发布)更快节奏的增加,并且开发者不需要维护多个版本; - * 当API对象的模式和语义以不兼容的方式变更时,开发人员需要增加API版本 -* 集群可靠性:由于功能相对较新,所以可能缺乏完全的e2e测试,通过flag的方式启用功能可能会暴露一些集群不稳定的bug(比如,一个在控制循环(control loop)的中的bug可能造成迅速创建过多的对象,导致API存储资源耗尽) -* 支持:并不保证一定会完成改功能,该功能可能会在未来的版本中完全被弃用 -* 建议的使用场景:因为其可升级性问题,以及缺乏长期支持的问题,该版本API只建议临时的测试集群使用 - -#### Beta Level - -* 对象版本:包含 `beta` 的API版本命名(比如:`v1beta1`) -* 可用性:官方发布版本中存在,默认开启 -* 用户:对于提供反馈感兴趣的用户 -* 完整性:所有的API操作,CLI命令以及UI支持都应该实现了;具有完整的e2e测试;API已经过API审查并通过,虽然beta期间使用经常会冒出API审查没有考虑到的问题 -* 可升级性: - * 对象的结构和语义可能会在未来的版本中变更;变更发生时,升级路线将会被记录; - * 在一些情况下,对象会被自动的转化为新的版本;而在另一些情况下,可能需要人工升级; - * 人工升级可能要求依赖新功能的部分下线,并要求手动将对象转为新版本; - * 人工转化时,需要提供文档记录转化过程; -* 集群可靠性:因为该功能目前具有e2e测试,所以通过flag启用功能,并不会造成其他不想关功能的bug;但是由于是一个新功能,所以可能会有一些次级bug -* 支持:项目承诺会完成这个功能,一般在接下来的一个稳定版本中;一般会在3个月之内完成,有时可能会更久;发布的版本应该至少在一个次级发布周期中,同时支持两个练习的版本(比如 `v1beta1`和`v1bata2`, 或 `v1beta2`和`v1`),这样用户可以有足够的时间来升级 -* 建议的使用场景:临时的测试环境;也可以短暂的部署在生产环境以获取用户反馈 - -#### Stable Level - -* 对象版本:格式为 `vX`, 其中`X`是整数(比如:`v1`) 的API版本命名 -* 可用性:官方发布版本中存在,默认开启 -* 用户:所有用 -* 完整性:必须在释放的一致性配置文件中,进行SIG架构批准的一致性测试(比如:不可移植或 可选功能,可能不再默认的配置中) -* 可升级性:只有具有严格兼容性的变更才允许在接下来的发布版本中加入 -* 集群可靠性:高 -* 支持:该API版本竟在接下来的很多发布版本中存在 -* 建议的使用场景:任何场景 - -#### 内部版本和外部版本 +### Development Level 开发级别 + +- 对象版本:没有规定 +- 可用性:不会提交到主要的kubernetes仓库,因此在官方的正式发布版本中并不可用 +- 用户:其他在此功能和概念上有紧密合作的开发者(比如client的开发者) +- 可升级性,可靠性,完整性,和支持:没有要求和保证 + +### Alpha Level + +- 对象版本:包含`alpha` 的API版本命名(比如:`v1alpha1`) +- 可用性:提交到了主要 kubernetest 仓库; 出现在正式的发布版本中; 功能是默认出于非启用状态,但是可以通过 flag 启用 +- 用户:开发者以及一些希望对早期功能给出反馈的专家用户 +- 完整性:一部分API操作,CLI命令,以及UI支持也许还未实现; API还未经过 API审查(即,在一般的代码审查的基础上,对API进行深入的,有针对性的审查) +- 可升级性: + + - API对象模式和语义可能在未来的版本中变更,无需在现有的集群中保留该对象; + - 移除可升级性的担忧可以方便开发者快速的进行开发;特别的,API版本可以比miner release(次要发布)更快节奏的增加,并且开发者不需要维护多个版本; + - 当API对象的模式和语义以不兼容的方式变更时,开发人员需要增加API版本 +- 集群可靠性:由于功能相对较新,所以可能缺乏完全的e2e测试,通过flag的方式启用功能可能会暴露一些集群不稳定的bug(比如,一个在控制循环(control loop)的中的bug可能造成迅速创建过多的对象,导致API存储资源耗尽) +- 支持:并不保证一定会完成改功能,该功能可能会在未来的版本中完全被弃用 +- 建议的使用场景:因为其可升级性问题,以及缺乏长期支持的问题,该版本API只建议临时的测试集群使用 + +### Beta Level + +- 对象版本:包含 `beta` 的API版本命名(比如:`v1beta1`) +- 可用性:官方发布版本中存在,默认开启 +- 用户:对于提供反馈感兴趣的用户 +- 完整性:所有的API操作,CLI命令以及UI支持都应该实现了;具有完整的e2e测试;API已经过API审查并通过,虽然beta期间使用经常会冒出API审查没有考虑到的问题 +- 可升级性: + + - 对象的结构和语义可能会在未来的版本中变更;变更发生时,升级路线将会被记录; + - 在一些情况下,对象会被自动的转化为新的版本;而在另一些情况下,可能需要人工升级; + - 人工升级可能要求依赖新功能的部分下线,并要求手动将对象转为新版本; + - 人工转化时,需要提供文档记录转化过程; +- 集群可靠性:因为该功能目前具有e2e测试,所以通过flag启用功能,并不会造成其他不想关功能的bug;但是由于是一个新功能,所以可能会有一些次级bug +- 支持:项目承诺会完成这个功能,一般在接下来的一个稳定版本中;一般会在3个月之内完成,有时可能会更久;发布的版本应该至少在一个次级发布周期中,同时支持两个练习的版本(比如 `v1beta1`和`v1bata2`, 或 `v1beta2`和`v1`),这样用户可以有足够的时间来升级 +- 建议的使用场景:临时的测试环境;也可以短暂的部署在生产环境以获取用户反馈 + +### Stable Level + +- 对象版本:格式为 `vX`, 其中`X`是整数(比如:`v1`) 的API版本命名 +- 可用性:官方发布版本中存在,默认开启 +- 用户:所有用 +- 完整性:必须在释放的一致性配置文件中,进行SIG架构批准的一致性测试(比如:不可移植或 可选功能,可能不再默认的配置中) +- 可升级性:只有具有严格兼容性的变更才允许在接下来的发布版本中加入 +- 集群可靠性:高 +- 支持:该API版本竟在接下来的很多发布版本中存在 +- 建议的使用场景:任何场景 + +### 内部版本和外部版本 每个资源至少有两个版本,External Version 外部版本用于对外暴露给用户请求的接口所使用的资源对象。Internal Version 内部版本不对外暴露,仅在 Kubernetes API Server 内部使用。 例如,Deployment 资源,它所属的外部版本表现形式为 apps/v1,内部版本表现形式为 +- External Object:外部版本资源对象,也称为 Versioned Object(即拥有资源版本的资源对象)。外部版本用于对外暴露给用户请求的接口所使用的资源对象,例如,用户在通过 YAML 或 JSON 格式的描述文件创建资源对象时,所使用的时外部版本的资源对象。外部版本的资源对象通过资源版本(Alpha、Beta、Stable)进行标识。 +- Internal Object:内部版本资源对象。内部版本不对外暴露,仅在 Kubernetes API Server 内部使用。内部版本用于多资源版本的转换,例如将 v1beta1 版本转换为 v1 版本,其过程为 v1beta1 -> internal -> v1,即先将 v1beta1 转换为内部版本,再转换为 v1 版本。内部版本资源对象通过 runtime.APIVersionInternal(即 __internal)进行标识。 -* External Object:外部版本资源对象,也称为 Versioned Object(即拥有资源版本的资源对象)。外部版本用于对外暴露给用户请求的接口所使用的资源对象,例如,用户在通过 YAML 或 JSON 格式的描述文件创建资源对象时,所使用的时外部版本的资源对象。外部版本的资源对象通过资源版本(Alpha、Beta、Stable)进行标识。 -* Internal Object:内部版本资源对象。内部版本不对外暴露,仅在 Kubernetes API Server 内部使用。内部版本用于多资源版本的转换,例如将 v1beta1 版本转换为 v1 版本,其过程为 v1beta1 -> internal -> v1,即先将 v1beta1 转换为内部版本,再转换为 v1 版本。内部版本资源对象通过 runtime.APIVersionInternal(即 \_\_internal)进行标识。 - -资源的外部版本代码定义在 staging/src/k8s.io/api/// 目录下,资源的内部版本代码定义在 pkg/apis/ 目录下。例如Deployment 资源,它的外部版本定义在 pkg/apis/apps/{v1,v1beta1,v1beta2}/ 目录下,它的内部版本定义在 pkg/apis/apps/ 目录下(内部版本一般与资源组在同一级目录下)。 +资源的外部版本代码定义在 staging/src/k8s.io/api/// 目录下,资源的内部版本代码定义在 pkg/apis/ 目录下。例如Deployment 资源,它的外部版本定义在 pkg/apis/apps/{v1,v1beta1,v1beta2}/ 目录下,它的内部版本定义在 pkg/apis/apps/ 目录下(内部版本一般与资源组在同一级目录下)。 资源的外部版本和内部版本时需要相互转换的,而用于转换的函数需要事先初始化到资源注册表(Scheme)中。多个外部版本(External Version)之间的资源进行相互转换,都需要通过内部版本(Internal Version)进行中转。这也是 Kubernetes 能实现多资源版本转换的关键。 -### 资源类型 +
+ +## 资源类型 我们可以通过 kubetl api-resources 命令查看所有的资源类型 @@ -111,9 +111,9 @@ namespaces ns v1 nodes no v1 false Node persistentvolumeclaims pvc v1 true PersistentVolumeClaim ``` - 我们可以通过 kubectl api-versions:列出当前支持的资源组和资源版本 + ```shell ➜ ~ k api-versions admissionregistration.k8s.io/v1 @@ -139,13 +139,15 @@ rbac.authorization.k8s.io/v1 scheduling.k8s.io/v1 storag ``` - 下表列举了一些常用的资源类型,完整请看官方文档: -### 资源元信息 +
+ +## 资源元信息 k8s的核心数据结构放在 staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go 里面,首先先看一下描述: + TypeMeta用来表示API请求和响应当中的元信息,包含了资源类型和资源版本。 ```go @@ -186,6 +188,9 @@ type TypeMeta struct { ``` + + + ```go // ObjectMeta is metadata that all persisted resources must have, which includes all objects // users must create. @@ -358,6 +363,7 @@ type ObjectMeta struct { ``` + ```go // OwnerReference contains enough information to let you identify an owning @@ -365,29 +371,29 @@ type ObjectMeta struct { // be cluster-scoped, so there is no namespace field. // +structType=atomic type OwnerReference struct { - // API version of the referent. - APIVersion string `json:"apiVersion" protobuf:"bytes,5,opt,name=apiVersion"` - // Kind of the referent. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - Kind string `json:"kind" protobuf:"bytes,1,opt,name=kind"` - // Name of the referent. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names - Name string `json:"name" protobuf:"bytes,3,opt,name=name"` - // UID of the referent. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids - UID types.UID `json:"uid" protobuf:"bytes,4,opt,name=uid,casttype=k8s.io/apimachinery/pkg/types.UID"` - // If true, this reference points to the managing controller. - // +optional - Controller *bool `json:"controller,omitempty" protobuf:"varint,6,opt,name=controller"` - // If true, AND if the owner has the "foregroundDeletion" finalizer, then - // the owner cannot be deleted from the key-value store until this - // reference is removed. - // See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion - // for how the garbage collector interacts with this field and enforces the foreground deletion. - // Defaults to false. - // To set this field, a user needs "delete" permission of the owner, - // otherwise 422 (Unprocessable Entity) will be returned. - // +optional - BlockOwnerDeletion *bool `json:"blockOwnerDeletion,omitempty" protobuf:"varint,7,opt,name=blockOwnerDeletion"` +// API version of the referent. +APIVersion string `json:"apiVersion" protobuf:"bytes,5,opt,name=apiVersion"` +// Kind of the referent. +// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +Kind string `json:"kind" protobuf:"bytes,1,opt,name=kind"` +// Name of the referent. +// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names +Name string `json:"name" protobuf:"bytes,3,opt,name=name"` +// UID of the referent. +// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids +UID types.UID `json:"uid" protobuf:"bytes,4,opt,name=uid,casttype=k8s.io/apimachinery/pkg/types.UID"` +// If true, this reference points to the managing controller. +// +optional +Controller *bool `json:"controller,omitempty" protobuf:"varint,6,opt,name=controller"` +// If true, AND if the owner has the "foregroundDeletion" finalizer, then +// the owner cannot be deleted from the key-value store until this +// reference is removed. +// See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion +// for how the garbage collector interacts with this field and enforces the foreground deletion. +// Defaults to false. +// To set this field, a user needs "delete" permission of the owner, +// otherwise 422 (Unprocessable Entity) will be returned. +// +optional +BlockOwnerDeletion *bool `json:"blockOwnerDeletion,omitempty" protobuf:"varint,7,opt,name=blockOwnerDeletion"` } ```