Kubernetes对象深入学习之二:细说schema.ObjectKind

欢迎访问我的GitHub

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

  • 在前文咱们对对象体系有了大概了解,接下来就要按照前面换分的三个知识区域逐个深入学习,今天从最简单的对象类型开始

runtime.Object、schema.ObjectKind、metav1.TypeMeta三者的关系

  • 首先要梳理清楚runtime.Object、schema.ObjectKind、metav1.TypeMeta这三者的关系,先回顾前文的简图
    在这里插入图片描述
  • 这里小结一下三者关系:
  1. runtime.Object是个接口,定义了GetObjectKind()方法,返回值是schema.ObjectKind
type Object interface {GetObjectKind() schema.ObjectKindDeepCopyObject() Object
}
  1. 上述返回值schema.ObjectKind也是一个接口,定义了两个方法:SetGroupVersionKind和GroupVersionKind
type ObjectKind interface {// SetGroupVersionKind sets or clears the intended serialized kind of an object. Passing kind nil// should clear the current setting.SetGroupVersionKind(kind GroupVersionKind)// GroupVersionKind returns the stored group, version, and kind of an object, or an empty struct// if the object does not expose or provide these fields.GroupVersionKind() GroupVersionKind
}
  1. 上面一共提到了两个接口的三个方法,它们都被metav1.TypeMeta实现了
    在这里插入图片描述
  • 还有一点要注意:TypeMeta的GetObjectKind方法,返回的是它自己!
  • 文章写到这里,突然有了一个小小的顿悟:以后在代码中再看到runtime.Object应该就很淡定了,它可能是任何资源类型,也可能只是个TypeMeta,但是无论如何,能直接从它那里得到的东西很少,因为它只有一个方法定义而已,所以拿到runtime.Object之后,各种转换和判断是少不了的
  • 由此可见核心就是schema.ObjectKind,因为runtime.Object定义的方法要返回它,而它定义的方法又被metav1.TypeMeta实现

了解schema.ObjectKind

  • 先看源码,ObjectKind的源码很简单,就是数据结构GroupVersionKind的获取和设置方法(Java bean的既视感)
type ObjectKind interface {// SetGroupVersionKind sets or clears the intended serialized kind of an object. Passing kind nil// should clear the current setting.SetGroupVersionKind(kind GroupVersionKind)// GroupVersionKind returns the stored group, version, and kind of an object, or an empty struct// if the object does not expose or provide these fields.GroupVersionKind() GroupVersionKind
}
  • 再回顾前文,如下图黄色箭头2,单个对象的数据结构中嵌入了metav1.TypeMeta,这也就说明,对象自已有GroupVersionKind和SetGroupVersionKind这两个方法,我们在程序中可以通过GroupVersionKind方法获取对象的GroupVersionKind信息,也能用SetGroupVersionKind方法设置对象的GroupVersionKind信息
    在这里插入图片描述

  • 上面反复提到的GroupVersionKind是什么?打开源码一看,原来是基础知识,这是对kubernetes中每一种资源类别的定义

// GroupVersionKind unambiguously identifies a kind.  It doesn't anonymously include GroupVersion
// to avoid automatic coercion.  It doesn't use a GroupVersion to avoid custom marshalling
type GroupVersionKind struct {Group   stringVersion stringKind    string
}
  • 关于GroupVersionKind的更多信息,请参考《Kubernetes的Group、Version、Resource学习小记》,里面有详细的介绍,这里选一副有代表性的图来说明,如下所示,Group、Version、Kind一目了然
    在这里插入图片描述
  • 回到TypeMeta源码,看看和GroupVersionKind有关,先看Set方法,可见是用TypeMeta对象的两个字段来保存的,group和version两个字段被拼接到了一起,成为新的APIVersion字段
func (obj *TypeMeta) SetGroupVersionKind(gvk schema.GroupVersionKind) {obj.APIVersion, obj.Kind = gvk.ToAPIVersionAndKind()
}
  • 再看Get方法,里面会将obj.APIVersion拆分,还原成Group和Version,再重新组装成GroupVersionKind对象返回
func (obj *TypeMeta) GroupVersionKind() schema.GroupVersionKind {return schema.FromAPIVersionAndKind(obj.APIVersion, obj.Kind)
}
  • 看过上述代码,发现都在操作TypeMeta的APIVersion和Kind字段,那就去看看TypeMeta这个数据结构,如下所示,只有这两个字段
type TypeMeta struct {// Kind is a string value representing the REST resource this object represents.// Servers may infer this from the endpoint the client submits requests to.// Cannot be updated.// In CamelCase.// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds// +optionalKind 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.// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources// +optionalAPIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=apiVersion"`
}

TypeMeta的重要性

  • 既然每种资源都必须有类型,那么TypeMeta的重要性就不用多说了,在kubernetes源码中暴力搜索一下,先排除单元测试文件,可见有多处会用到,打开一段自动生成的代码,可见复制对象时首先会复制TypeMeta
    在这里插入图片描述
  • 然后再随便打开一个单元测试的代码,如下图黄色箭头,这就很清楚了,再回想之前写的那些代码,原来这个TypeMeta我们一直在用,是如此的属性,每次创建对象的第一步就是TypeMeta对象:
    在这里插入图片描述
  • 至此,关于对象类型和版本的接口schema.ObjectKind就学习完成了,这是平时用client-go开发时最常见的内容了,下一篇会看到ObjectMeta,那里丰富的内容在等着咱们

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 数组

1. 数组的地址 1.1 一维数组的地址 int a[5];(1) &a[0]第0个元素的地址a第0个元素的地址&a整个一维数组的地址 (2)&a[0] a &a; (3) &a[0] 1跳过一个数组元素a …

Gradio库中的Model3D模块:实时上传和展示3D模型

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

如何与ChatGPT愉快地聊天

原文链接:https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段,在这个阶段,人工智能可以像人一样与我们进行深度的文本交互。其中,OpenAI的ChatGPT是一个具有代表性的模型。然而&#xff0…

chatGPT之100个例子-从体验到精通

简介 本博文演示了100个chatGPT在各行各业的使用例子,全部看完有助于培养chatGPT解决问题的思维。 在人工智能时代,智能软件并不会淘汰人类,淘汰人类的是会使用人工智能的人! 我们直接使用openAI官方chatGPT,生动演示了chatGPT的一些妙用! 请仔细看完,一定会有收获! 每…

构建工具——webpack、vite

文章目录 构建工具Webpack使用步骤配置文件(webpack.config.js)插件(plugin) ViteVite 也是前端的构建工具使用命令构建配置文件:vite.config.js 构建工具 当我们习惯了在 node 中编写代码的方式后,在回到…

Jenkins 配置用户角色和权限

1、配置条件: 1)已安装Jenkins,当前案例使用版本:2.319.3 2)已成功进入Jenkins,并新建用户:dev_java 2、安装插件【系统管理-插件管理-搜索-可选插件】:Role-based Authoriz…

多元分类预测 | Matlab基于麻雀算法优化深度置信网络(SSA-DBN)的分类预测,多特征输入模型,SSA-DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab基于麻雀算法优化深度置信网络(SSA-DBN)的分类预测,多特征输入模型,SSA-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 7 日论文合集)

文章目录 一、检测相关(5篇)1.1 Contextual Affinity Distillation for Image Anomaly Detection1.2 Noise-to-Norm Reconstruction for Industrial Anomaly Detection and Localization1.3 MMNet: Multi-Collaboration and Multi-Supervision Network for Sequential Deepfake…

深度学习笔记之Transformer(四)铺垫:LayerNormalization

深度学习笔记之Transformer——LayerNormalization 引言回顾:批标准化问题描述问题处理 层标准化批标准化无法处理的问题 引言 在介绍 Transformer \text{Transformer} Transformer模型架构之前,首先介绍 Transformer \text{Transformer} Transformer的…

YOLOV5-Lite轻量化部署与训练

文章目录 前言项目下载项目运行自定义数据集训练使用LabelImg标注制作数据集划分训练文件生成标签聚合操作辅助脚本需要运行的脚本 开始训练 总结 前言 没啥意思,很简单,需要实现一个目标检测,但是,不能占用太多运算资源&#xf…

【javaEE面试题(六)wait 和 sleep 的对比(面试题)】

7.4 wait 和 sleep 的对比(面试题) 其实理论上 wait 和 sleep 完全是没有可比性的,因为一个是用于线程之间的通信的,一个是让线程阻塞一段时间, 唯一的相同点就是都可以让线程放弃执行一段时间 当然为了面试的目的&…

二、C语言算法题期末题

一、枚举题 1、用1元5角人民币兑换5分、2分、1分的硬币&#xff08;每种都要有&#xff09;共100枚&#xff0c;有多少种方案,每种方案的具体情况? #include<stdio.h> int main(){int money150; //1元5角等于150分int count0; //记录数量for(int i1;i<99;i){ …