IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 《k3s 源码解析4 ---- k3s重要数据结构》 -> 正文阅读

[数据结构与算法]《k3s 源码解析4 ---- k3s重要数据结构》

k3s完全兼容k8s,我解释一下是为什么:

因为k3s的底层数据结构(写入etcd/mysql/sqlite/dsqlite数据库的格式),是完全照搬k8s的数据结构。api完全兼容。 对外表现相同,底层数据相同,只是实现方式不同(举个例子: 一个爆炒大虾,一个油焖虾)。

我认为 k3s/k8s数据结构的3个用途:

  • 缓存从api中解析出来的参数,为了后面的处理逻辑更方便的去引用api的参数。
  • 方便响应api时,用marshal() 去生成json/protobuf序列化的数据
  • 方便写入数据库(etcd/mysql/sqlite)时,序列化为有序数据块

在k3s/k8s中,deploy、pod、service、Ingress、namespace、configmap等被成为资源。
yaml文件在定义一组(多组)资源的规格/约束条件的集合。

1 资源类型:

type TypeMeta struct {
        // rest api操作的资源类型:deployment/pod/servce/ingress/ns/pv/pvc
        Kind string `json:"kind,omitempty" protobuf:"bytes,1,opt,name=kind"`
        
        // APIVersion defines the versioned schema of this representation of an object.
        // Servers should convert recognized schemas to the latest internal value, and
        // may reject unrecognized values.
        APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=apiVersion"`
}

2 资源元数据:

资源元数据:与api相关、与调度器相关、与数据库相关。 什么叫相关? 直白点说:就是被读写

type ObjectMeta struct {
        // 在一个命名空间范围中,资源的名字(pod-https、pod-http、pod-web、sevice-reds、confiigmap-secrets-web)。  例如某个村里面(命名空间)不允许人重名,张三、李四
        Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`

		// 在创建yaml文件时,可以指定资源名称、也可以不指定资源名称(不指定时则 用资源类型-随机字符拼接,例如pod-nx7jsda,service-hlayjk0a),此变量就是k3s/k8s生成的默认资源名称
        GenerateName string `json:"generateName,omitempty" protobuf:"bytes,2,opt,name=generateName"`

		// 命名空间名称,例如default、filecoin、ingress-nginx。在同一个命名空间内,所有资源可互相感知存在。 在不同命名空间中,资源之间不能直接感知到其它命名空间的资源。
		Namespace string `json:"namespace,omitempty" protobuf:"bytes,3,opt,name=namespace"`

		// url地址,client可以通过访问此地址,来只读到资源的内容。  对应另外一个命令是读写,kubectl edit pod pod-name
		// k3s/k8s在1.21 release会删除此变量(因为有读写api、(历史原因存在的)只读api显得很鸡肋),无视它即可。
		SelfLink string `json:"selfLink,omitempty" protobuf:"bytes,4,opt,name=selfLink"`

		// k8s server在最终成功创建了资源后,会生成一个uuid给这资源,生成后,在资源的整个生命周期中不允许被修改。 (你可以理解为是身份证编号)
		UID types.UID `json:"uid,omitempty" protobuf:"bytes,5,opt,name=uid,casttype=k8s.io/kubernetes/pkg/types.UID"`

		// k3s/k8s 兼容多个api版本,即http/https rest api接口存在多个版本的路由,和多个版本对应的参数逻辑解析程序段
		// apiVersion: v1
		// apiVersion: v2
		// apps/v1beta1
		ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,6,opt,name=resourceVersion"`

		// 流水号
		Generation int64 `json:"generation,omitempty" protobuf:"varint,7,opt,name=generation"`

		// 资源被创建时的时间戳
		CreationTimestamp Time `json:"creationTimestamp,omitempty" protobuf:"bytes,8,opt,name=creationTimestamp"`

		// 资源被删除时的时间戳,例如kubectl delete pods pod-name 命令被执行到时的时间戳
		DeletionTimestamp *Time `json:"deletionTimestamp,omitempty" protobuf:"bytes,9,opt,name=deletionTimestamp"`

		// 资源被删除时的宽限(给资源发让其退出的信号,等待资源关闭相关的系统资源后退出)时间(单位:秒),超过宽限时间则k3s/k8s会主动杀死资源
		DeletionGracePeriodSeconds *int64 `json:"deletionGracePeriodSeconds,omitempty" protobuf:"varint,10,opt,name=deletionGracePeriodSeconds"`
	
		// 给资源打标签: kubectl label node cka-node  disktype=gpu
		// 查看资源标签: kubectl get node --show-labels
		// 标签用途:用于更精细的去调度资源到指定的node,是k3/k8s为运维通讯提供的(管理/调度)扩展功能
		Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"`

		// 注解:
		//Annotations 允许在 Kubernetes 资源上附加任意的非标识性元数据,用来记录资源的一些属性。这些元数据主要是给工具或者库来提取信息,一般不会直接开放给用户。绝大多数基于 Kubernetes 的开源项目都不依赖于 DB,完全可以利用 Kubernetes 的能力,满足对 DB 的需求。对于需要持久化的数据,除了定义 CRD,另一种通用的做法就是将数据存储在 annotation 中。
		//由于 annotation 的定位是 Kubernetes 资源上附加任意的非标识性元数据,除了在 key 上有跟 label key 完全一样的限制外,在 value 上没有任何限制:可长可短,可结构化可非结构化,可包含任意字符。
		Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,12,rep,name=annotations"`

		// 包含足够的信息来让你确定一个对象,举个例子:你妈妈喊你吃饭时叫你小名:小张、狗子,你就知道是在叫你,而不用叫你的全名:张三丰、赵二狗
		OwnerReferences []OwnerReference `json:"ownerReferences,omitempty" patchStrategy:"merge" patchMergeKey:"uid" protobuf:"bytes,13,rep,name=ownerReferences"`

		// 资源在被删除之后,会写一个记录在这里切片中
		Finalizers []string `json:"finalizers,omitempty" patchStrategy:"merge" protobuf:"bytes,14,rep,name=finalizers"`

		// 资源属于的集群的名称。例如:易春雷老师(资源)是第二初级中学(集群名称)的优秀班主任, 
		ClusterName string `json:"clusterName,omitempty" protobuf:"bytes,15,opt,name=clusterName"`

		// 
		ManagedFields []ManagedFieldsEntry `json:"managedFields,omitempty" protobuf:"bytes,17,rep,name=managedFields"`
}


type ManagedFieldsEntry struct {
        // Manager is an identifier of the workflow managing these fields.
        Manager string `json:"manager,omitempty" protobuf:"bytes,1,opt,name=manager"`
        // Operation is the type of operation which lead to this ManagedFieldsEntry being created.
        // The only valid values for this field are 'Apply' and 'Update'.
        Operation ManagedFieldsOperationType `json:"operation,omitempty" protobuf:"bytes,2,opt,name=operation,casttype=ManagedFieldsOperationType"`
        // APIVersion defines the version of this resource that this field set
        // applies to. The format is "group/version" just like the top-level
        // APIVersion field. It is necessary to track the version of a field
        // set because it cannot be automatically converted.
        APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,3,opt,name=apiVersion"`
        // Time is timestamp of when these fields were set. It should always be empty if Operation is 'Apply'
        // +optional
        Time *Time `json:"time,omitempty" protobuf:"bytes,4,opt,name=time"`

        // Fields is tombstoned to show why 5 is a reserved protobuf tag.
        //Fields *Fields `json:"fields,omitempty" protobuf:"bytes,5,opt,name=fields,casttype=Fields"`

        // FieldsType is the discriminator for the different fields format and version.
        // There is currently only one possible value: "FieldsV1"
        FieldsType string `json:"fieldsType,omitempty" protobuf:"bytes,6,opt,name=fieldsType"`
        // FieldsV1 holds the first JSON version format as described in the "FieldsV1" type.
        // +optional
        FieldsV1 *FieldsV1 `json:"fieldsV1,omitempty" protobuf:"bytes,7,opt,name=fieldsV1"`

        // Subresource is the name of the subresource used to update that object, or
        // empty string if the object was updated through the main resource. The
        // value of this field is used to distinguish between managers, even if they
        // share the same name. For example, a status update will be distinct from a
        // regular update using the same manager name.
        // Note that the APIVersion field is not related to the Subresource field and
        // it always corresponds to the version of the main resource.
        Subresource string `json:"subresource,omitempty" protobuf:"bytes,8,opt,name=subresource"`
}

先写到这里,晚点补充其它数据结构。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:31:56  更:2022-04-27 11:35:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:47:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码