Kubernetes对象深入学习之一:概览

news2024/11/6 3:13:57

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

关于《Kubernetes对象深入学习》系列

  • 在client-go的学习和使用过程中,不可避免涉及到对象相关的代码,经常面临一个尴尬的现象:平时代码能读懂七七八八,一旦写的时候就感觉无从下手,甚至抄都不知道去哪抄,例如:拿到一个runtime.Object类型的接口该如何处理,它的具体实现可能有哪些?如何取得它的name、label、annonation等信息?
  • 为了解决这些问题,必须对kubernetes的对象及其相关的代码有足够了解,然而面对大量代码和知识点,如何将其梳理清晰,合理拆分为多个重点,进行系统的学习,这就是《Kubernetes对象深入学习》系列的主要任务
  • 写这个系列的过程,也是欣宸自己的学习过程,整个系列会包含丰富的图示、表格、实战等元素加入,这些都是欣宸原创的特色,总之就是手段齐出,尽可能将知识点清晰立体的传达给您

本篇概览

  • 本文是《Kubernetes对象深入学习》系列的开篇,咱们先从整体上说清楚这个系列讲的是哪些内容,涉及哪些知识点,还要理清它们之间的关系,后续的文章会聚焦这些知识点深入学习,如此一来,从入门到精通也不是没有可能[dog]
  • 接下来会从对象定义开始,再展开与之相关的接口和实现类进行分析,最后结合实际的kubernetes资源来分析,这样就完成了对kubernetes对象的初步了解

核心知识点

  • 为了便于理解,这里将核心知识浓缩为几下几点
  1. 与对象有关的大部分源码在k8s.io/apimachinery这个module中
  2. 对象的根源是runtime.Object,官方描述如下
    在这里插入图片描述
  3. 这里将对象相关的知识按照不同侧重点梳理出三条线,以便咱们逐个击破,避免那种面对大量知识点无从下手的困境,具体的三条线如下图所示,分别是:对象类型、属性、列表属性,每个知识点都有明确的接口和实现
    在这里插入图片描述
  • 从上图可见,runtime.Object是个接口,其真实的实现可能是单个对象,也可能是列表对象,但无论是哪种都实现了类型接口schema.ObjectKind,然后就是它们各自的特有接口:单个对象有metav1.Object,列表对象有metav1.Listinterface

  • 注意:上图是学习路线,不是UML!

关于metav1

  • 在kubernetes源码中,metav1是k8s.io/apimachinery/pkg/apis/meta/v1这个package的别名,如下所示,因此文中都用metav1来表示完整的包
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

源码位置

  • 为了便于翻阅源码,这里用列表将其整理好以便随时用到(可以看出内容确实不少,这些kubernetes的基础知识,是不推荐速成的,还是认真深入学习逐个掌握吧)
接口&对象类型文件位置说明
runTime.Object接口runtime/interfaces.gokubernetes的对象都实现了此接口
schema.ObjectKind接口runtime/schema/interfaces.go对象类型相关的接口
metav1.Object接口apis/meta/v1/meta.go属性相关的接口
metav1.ListInterface接口apis/meta/v1/meta.go对象列表相关的接口
metav1.TypeMeta实现类apis/meta/v1/types.goObjectKind接口的实现类,负责类型的逻辑
metav1.ObjectMeta实现类apis/meta/v1/types.goObject接口的实现类,负责属性的逻辑
metav1.ListMeta实现类apis/meta/v1/types.goListInterface接口的实现类,负责列表的逻辑
  • 有了上面的表格,那么多interface和struct终于不显得混乱了,再捋一捋会更清晰:
  1. 除了类型接口比较特殊,属于schema包,其余所有接口和实现类都在metav1包中
  2. 实现类的名字都是xxxMeta

runtime.Object和metav1.TypeMeta的关系(非常重要!

  • runtime.Object和metav1.TypeMeta的关系需要尽早理清楚,后面的学习会顺利很多
  • 先看runtime.Object的源码,如下所示,非常简单的接口,只定义了两个方法
type Object interface {
	GetObjectKind() schema.ObjectKind
	DeepCopyObject() Object
}
  • 再看metav1.TypeMeta的方法
func (obj *TypeMeta) GetObjectKind() schema.ObjectKind { return obj }
  • 也就是说metav1.TypeMeta实现了runtime.Object的GetObjectKind方法,至于另一个方法DeepCopyObject,咱们来看看Pod的源码就一目了然了
    在这里插入图片描述

  • 关于上图黄色箭头1指向的deepcopy-gen,涉及到代码生成工具,此工具在编译时会把代码生成在kubernetes源码目录中,再用于编译,举个例子,pod有关的生成代码如下
    在这里插入图片描述

  • 通过上面对Pod代码的分析,得到这么一个规律:如果一个数据结构内嵌了TypeMeta,并且用deepcopy-gen工具生成DeepCopyObject方法,那么这个数据结构就是runtime.Object接口的实现类(非常重要!

  • 按照这个规则去找一个列表对象看看,就选PodList吧,这是kubernetes用来表达Pod对象列表的数据结构,如下图所示,和Pod一样的套路
    在这里插入图片描述

  • 现在对最基础的runtime.Ojbect算是有了一定的了解,接下来分别观察单个对象和列表对象,即要看它们和通用接口TypeMeta的关系,也要看它们各自特有的接口:ObjectMeta和ListMeta

单个对象实现的接口:TypeMeta和ObjectMeta

  • 虽然用表格和关系图做了梳理,但还是有些抽象,所以这里来举个具体的例子,把前面那些对象、接口、实现的关系做个说明
  • 在kubernetes开发中,pod应该是最常见的对象了,它的数据结构源码在kubernetes仓库中的apis/core/types.go文件
// 1. 代码生成器来生成runtime.Object接口的实现
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// Pod is a collection of containers, used as either input (create, update) or as output (list, get).
type Pod struct {
	// 2. 这样就实现了schema.ObjectKind接口
	metav1.TypeMeta
	
	// 3. 这样就实现了metav1.Object接口
	// +optional
	metav1.ObjectMeta

	// Spec defines the behavior of a pod.
	// +optional
	Spec PodSpec

	// Status represents the current information about a pod. This data may not be up
	// to date.
	// +optional
	Status PodStatus
}
  • 从上述代码可见,Pod数据结构嵌入了metav1.TypeMeta、metav1.ObjectMeta,这就实现了schema.ObjectKind和metav1.Object接口
  • 如果上面对Pod源码的分析还不够具体,您依然对TypeMeta和ObjectMeta没有形象具体的认识,那就再找个更具体例子吧
  • 在kubernetes环境执行kubectl get pod kube-apiserver-hedy -n kube-system -o yaml,作用是以yaml格式的名义查看api-server的pod详情,内容如下图所示,属于TypeMeta和ObjectMeta部分的内容用黄色箭头标识出来了
    在这里插入图片描述
  • 现在您应该对metav1.TypeMeta、metav1.ObjectMeta有了大致认识,也发现了一个问题:不是分了三条学习线路吗?还有个metav1.ListInterface呢?

列表对象实现的接口:TypeMeta和ListMeta

  • 为了说清楚metav1.ListInterface,还是以Pod为例吧,它有自己专属的列表对象PodList,源码如下
type PodList struct {
	metav1.TypeMeta
	// +optional
	metav1.ListMeta

	Items []Pod
}
  • 也就是说,kubernetes在表达Pod列表的时候,并不是简单的使用Pod切片,而是使用了PodList对象,列表的真实数据存储在Items字段中
  • PodList内嵌了metav1.TypeMeta,这和Pod是一致的,因此这里得出一个重要结论:PodList也是runtime.Object接口的的具体实现,这很重要!
  • 请务必注意:当一段代码中出现runtime.Object时,它的真实对象可能是一个资源实例,例如Pod,也可能是个列表对象,例如PodList
  • 还剩一个问题:PodList和ListInterface有啥关系呢?很简答:PodList内嵌了metav1.ListMeta,metav1.ListMeta又是ListInterface的实现类,因此PodList也是ListInterface的实现类
  • 至此,本篇算是完成了,咱们算是对kubernetes的对象和相关接口有了基本的了解,至少它们关系已经理清楚,读kubernetes源码的时候可以对的上号了,接下来的内容就会聚焦到每个知识点的深度上,再配上丰富的编码实战,咱们有信心学好kubernetes知识

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCL点云处理之多角度剖面切割(一百九十五)

PCL点云处理之多角度切割点云剖面(一百九十五) 一、算法介绍二、具体实现1.沿法向量方向切割剖面2.沿竖直方向切割剖面3.沿水平方向切割剖面一、算法介绍 点云的剖面往往隐藏着很多有用信息,而且分析更加简单一些,这里自己实现一系列不同角度的点云剖面切割,包括沿着法向量…

车载软件架构 —— 闲聊几句AUTOSAR OS(七)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

Framework - AMS

一、概念 Android10(API29)开始,ActivityTaskManagerService 接管 ActivityManagerService。 二、启动ATMS过程 三、启动APP & 跳转Activity过程 3.1 Activity → ATMS 启动一个 APP 或跳转一个 Activity 都是调用的 startActivity()&a…

数据结构--串的存储结构

数据结构–串的存储结构 串的顺序存储 静态数组实现(定长顺序存储) #define MAXLEN 255 typedef struct {char ch[MAXLEN];int length; }SString;动态数组实现(堆分配存储) typedef struct {char* ch;int length; }HString;int main() {HString S;S.ch (char*)malloc(sizeo…

问题解决:centos7异常关闭后无法开机

前言:主机卡死,直接关了电脑电源,虚拟机中的centos7 产生错误,无法开机 重点是取消挂载。很多文章都提到了xfs_repair /dev/dm-0 , 但是不适用我遇到的情况。 # ls /dev/mapper umount /dev/mapper/centos-root xfs_repair -v -…

[洛谷]B3601 [图论与代数结构 201] 最短路问题_1(负权)(spfa)

SPFA模板啦~ 直接上ACcode: #include<bits/stdc.h> using namespace std; //#define int long long #define inf 2147483647 const int N15e310,M2*N; int dis[N],head[N],cnt; bool vis[N]; int n,m; struct E {int to,w,next; } e[M]; queue<int>q; void add(in…

U-Boot移植 - 1_嵌入式Linux系统移植概述

文章目录 1. 嵌入式Linux系统移植概述2. 实验开发板简介3. U-Boot简介4. NXP uboot测试 1. 嵌入式Linux系统移植概述 Linux 的移植主要包括3部分&#xff1a; 移植「bootloader 代码」&#xff0c; Linux 系统要启动就必须需要一个 bootloader 程序&#xff0c;也就说芯片上电…

【Android Framework (十) 】- ContentProvider

文章目录 知识回顾启动第一个流程initZygote的流程system_serverServiceManagerBinderLauncher的启动AMSservicebinderService 前言源码分析1.使用方法2.ContentProvider实现类。3.使用方法4.注册Observer正文 拓展知识 总结 知识回顾 启动第一个流程init 1&#xff0c;挂载文…

基于eBPF技术的云原生可观测实践

** 基于eBPF技术的云原生可观测实践 ** eBPF技术是Linux内核3.15版本中引入的全新设计&#xff0c;自从2014年发布以来&#xff0c;一直都备受瞩目。在过去几年中&#xff0c;基于eBPF技术的实践和工程落地层出不穷&#xff0c;出现了爆发式的增长。2015年微软、Google、Face…

浏览器里的任意一个请求通过postman生成对应的代码

大多数情况下&#xff0c;我们都是不知道某个网站的get或者post请求以及其他请求&#xff08;比如说PUT请求等&#xff09;是该加哪些headers和cookie才能用代码请求成功&#xff0c;这时就需要下面的操作了。 浏览器里的任意一个请求通过postman生成对应的代码&#xff1a; …

外观模式的学习与使用

1、外观模式的学习 当你在开发软件系统时&#xff0c;系统内部的子系统可能会变得非常复杂&#xff0c;包含了许多相互关联的类和接口。在使用这些子系统时&#xff0c;你可能需要调用多个类和方法才能完成所需的功能。这样的复杂性可能导致代码难以维护、理解和使用。外观模式…

NSQ 实现逻辑探秘

1 什么是 NSQ NSQ 是一个消息队列中间件&#xff0c;用 go 实现&#xff0c;有如下特点&#xff1a; 分布式&#xff1a; 它提供了分布式的、去中心化且没有单点故障的拓扑结构&#xff0c;稳定的消息传输发布保障&#xff0c;能够具有高容错和高可用特性。 易于扩展&#xf…

【Echarts】echarts饼图、圆环图配置代码详解

前言 简介&#xff1a;本文将从头开始&#xff0c;带你快速上手 echarts最常用图例—饼图 准备&#xff1a;请自行先将echarts图例引入你的项目&#xff0c;本文不多介绍。&#xff08;引入 echarts教程&#xff1a;http://t.csdn.cn/mkTa4&#xff09; 心得&#xff1a;echar…

递归函数:

含义&#xff1a;自己调自己 递归三要素&#xff1a;定义函数、终止条件和等价关系式 小案例&#xff1a;排序 let arr1 [8, 8, 9, 13, 45, 8, 0, 1, 9, 66];//定义函数function quickSort(arr) {//终止条件if (arr.length < 1) return arr;const baseIndex Math.floor(…

十五、docker学习-docker核心docker数据卷

什么是数据卷 当我们在使用docker容器的时候&#xff0c;会产生一系列的数据文件&#xff0c;这些数据文件在我们删除docker容器时是会消失的&#xff0c;但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的&#xff0c;Docker将应用与运行环境打包成容器发布&…

【游戏逆向】D3D HOOK实现透视讲解

实现目的: 目前大部分游戏通过Direct3D实现3D效果,通过挂钩相应函数,可以实现3D透视,屏幕挂字效果。而透视,屏蔽特定效果,设置透明在很多游戏(特别是FPS)中发挥着巨大的作用! 实现思路: [D3D] DirectX的功能都是以COM组件的形式提供的。在Direct3D中,主要通过采…

Unity新输入系统

1、导入新输入系统 &#xff08;1&#xff09; 这里改成.NET Framework&#xff0c;下面改成input system package(New) 2、使用新系统 &#xff08;1&#xff09; 在你的player物体上添加Player Input组件&#xff0c;然后CreateAction &#xff08;2&#xff09; 创建出…

连接器信号完整性仿真教程 五

本文将详细介绍CST电磁仿真的激励源&#xff08;Excitation Source&#xff09;及其设置。CST微波工作室根据具体应用和结构类型提供多种不同的激励源&#xff0c;总得来说包含激励端口&#xff08;Excitation Port&#xff09;和场源&#xff08;Field Sources&#xff09;。 …

3.Mysql子查询练习

1.子查询概述 子查询指一个查询语句嵌套在另一个查询语句内部的查询&#xff0c;内部的查询是外部查询的条件&#xff0c;这个特性从MySQL4.1开始引入 子查询(内查询)在主查询之前执行完成 子查询的结果被主查询(外查询)使用 注意事项&#xff1a; 子查询要包含在括号内 将子查…

Vue 时间格式转换

文章目录 将秒转换成简单时间格式方式一 表格渲染方式二 js转换 将时间转换为字符串方式一 年、月、日、时、分、秒、星期等信息方式二 返回多久之前的时间 将秒转换成简单时间格式 方式一 表格渲染 element-ui 表格为例&#xff0c;duration 单位为秒 <el-table-column …