Kubernetes对象深入学习之三:对象属性

news2024/11/26 21:23:46

欢迎访问我的GitHub

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

本篇概览

  • 本文是《Kubernetes对象深入学习》系列的第三篇,主要内容是关于对象属性的知识点,关于对象属性,先通过一个具体实例来建立第一印象,在kubernetes环境执行命令kubectl get pod kube-apiserver-hedy -n kube-system -o yaml,可以看到指定pod的基本信息(注意,pod名请根据您自己环境的实际情况调整),内容如下图
    在这里插入图片描述
  • 上图中,黄色箭头2和3之间的大片区域都是对象属性,对应在kubernetes源码中,接口是metav1.Object,实现是metav1.ObjectMeta
  • 来看pod的数据结构源码,内嵌了metav1.ObjectMeta,其他资源也是同样的套路
// 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
}

  • 以上是从使用的角度了解属性,接下来深入属性相关的源码学习

接口metav1.Object

  • 先看接口metav1.Object的源码,可见前面咱们看到的annonations,labels等等信息,在metav1.Object中都有Get方法获取,也有Set方法来设置
type Object interface {
	GetNamespace() string
	SetNamespace(namespace string)
	GetName() string
	SetName(name string)
	GetGenerateName() string
	SetGenerateName(name string)
	GetUID() types.UID
	SetUID(uid types.UID)
	GetResourceVersion() string
	SetResourceVersion(version string)
	GetGeneration() int64
	SetGeneration(generation int64)
	GetSelfLink() string
	SetSelfLink(selfLink string)
	GetCreationTimestamp() Time
	SetCreationTimestamp(timestamp Time)
	GetDeletionTimestamp() *Time
	SetDeletionTimestamp(timestamp *Time)
	GetDeletionGracePeriodSeconds() *int64
	SetDeletionGracePeriodSeconds(*int64)
	GetLabels() map[string]string
	SetLabels(labels map[string]string)
	GetAnnotations() map[string]string
	SetAnnotations(annotations map[string]string)
	GetFinalizers() []string
	SetFinalizers(finalizers []string)
	GetOwnerReferences() []OwnerReference
	SetOwnerReferences([]OwnerReference)
	GetClusterName() string
	SetClusterName(clusterName string)
	GetManagedFields() []ManagedFieldsEntry
	SetManagedFields(managedFields []ManagedFieldsEntry)
}

接口的实现metav1.ObjectMeta

  • 前面看到接口定义是一堆Get和Set方法,这里再来了解这些Get和Set方法在实现中返回了哪些内容,又设置了哪些内容
  • 先看结构体定义,与前面截图中的pod的meta信息是能对应上的
type ObjectMeta struct {
	
	Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`

	GenerateName string `json:"generateName,omitempty" protobuf:"bytes,2,opt,name=generateName"`

	Namespace string `json:"namespace,omitempty" protobuf:"bytes,3,opt,name=namespace"`

	SelfLink string `json:"selfLink,omitempty" protobuf:"bytes,4,opt,name=selfLink"`

	UID types.UID `json:"uid,omitempty" protobuf:"bytes,5,opt,name=uid,casttype=k8s.io/kubernetes/pkg/types.UID"`

	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"`

	DeletionTimestamp *Time `json:"deletionTimestamp,omitempty" protobuf:"bytes,9,opt,name=deletionTimestamp"`

	DeletionGracePeriodSeconds *int64 `json:"deletionGracePeriodSeconds,omitempty" protobuf:"varint,10,opt,name=deletionGracePeriodSeconds"`


	Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"`


	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"`
}
  • 那么接口实现的方法,其内容就不言而喻了:对结构体中相关字段的Get和Set,具体代码如下图所示,唯一要注意的是GetObjectMeta方法返回的是结构体自己
    在这里插入图片描述
  • 现在源码已经了解,接下来要看使用场景

使用场景

  • 对象属性是非常重要的,在官方资料中明确规定,MetaData中的一些字段是所有资源类型必须要有的,如下图所示
    在这里插入图片描述

  • 如下图,在kubernetes源码中搜索各种常见资源的定义,ObjectMeta是必不可少的(上一篇学到的TypeMeta也同样一定会有)
    在这里插入图片描述

  • 再打开client-go库的源码,看看client-go如何使用ObjectMeta,通过单元测试可以看到官方的标准用法,如下图,创建对象的操作在单元测试中随处可见,一样离不开ObjectMeta
    在这里插入图片描述

  • 看到这里,咱们把对象属性的源码和使用场景都看过了,是不是本章可以结束了?不就是一堆get和set方法嘛,以后想读写哪个字段,调用该字段对应的get和set方法就行了呗

  • 我的建议是:您先别离开,还有个重要内容即将呈现,那是官方的馈赠,那是很实用的工具

实用工具meta.Accessor

  • 试想一个场景:开发一个函数,此函数不关注资源对象的具体类型(例如可能是pod,也可能是deployment),只想获取这个对象的一些meta信息,例如namespace、label等,这个函数如何实现呢?
  • 看过前面的内容后,其实聪明的您应该能想到:ObjectMeta是嵌入到各个资源数据结构中的,所以这些资源对象都算是实现了meta1.Object接口了,只要能把对象转换成meta1.Object接口,上述函数就能做出来了
  • 和资源关系密切client-go库自然也会遇到上述场景,所以库中已经封装好了这个函数,源码如下所示
func Accessor(obj interface{}) (metav1.Object, error) {
	switch t := obj.(type) {
	case metav1.Object:
		return t, nil
	case metav1.ObjectMetaAccessor:
		if m := t.GetObjectMeta(); m != nil {
			return m, nil
		}
		return nil, errNotObject
	default:
		return nil, errNotObject
	}
}
  • 这个meta.Accessor方法很实用,来看client-go是怎么使用的,如下图,在从本地缓存中取得资源列表时,无需关注资源类型,也能得到对象的namespace、labels等字段的信息,因此这个ListAllByNamespace方法就更加通用了,各种资源都能用这个方法来获取
    在这里插入图片描述
  • 下面这个MetaNamespaceIndexFunc方法在client-go库中是被高频使用的,源码如下,很简单,任何资源类型都能用这个方法得到其namespace,也是借用了meta.Accessor来无视资源类型
// MetaNamespaceIndexFunc is a default index function that indexes based on an object's namespace
func MetaNamespaceIndexFunc(obj interface{}) ([]string, error) {
	meta, err := meta.Accessor(obj)
	if err != nil {
		return []string{""}, fmt.Errorf("object has no meta: %v", err)
	}
	return []string{meta.GetNamespace()}, nil
}

Unstructured的使用场景,也会用到meta.Accessor方法

  • meta.Accessor方法还有一处比较典型使用,就是利用Unstructured对象创建对象,先来看看什么是Unstructured
  • Unstructured是个map,在创建Deployment、Pod等对象的时候,除了使用Deployment、Pod等特定的数据结构,还可以直接用Unstructured对象作为创建的参数,这样写出的代码更有通用性,以下是个代码片段,用来创建Deployment对象,可见通过map就能完成Deployment资源的创建,那个Create方法的入参就是Unstructured
	deploymentRes := schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}

	deployment := &unstructured.Unstructured{
		Object: map[string]interface{}{
			"apiVersion": "apps/v1",
			"kind":       "Deployment",
			"metadata": map[string]interface{}{
				"name": "demo-deployment",
			},
			"spec": map[string]interface{}{
				"replicas": 2,
				"selector": map[string]interface{}{
					"matchLabels": map[string]interface{}{
						"app": "demo",
					},
				},
				"template": map[string]interface{}{
					"metadata": map[string]interface{}{
						"labels": map[string]interface{}{
							"app": "demo",
						},
					},

					"spec": map[string]interface{}{
						"containers": []map[string]interface{}{
							{
								"name":  "web",
								"image": "nginx:1.12",
								"ports": []map[string]interface{}{
									{
										"name":          "http",
										"protocol":      "TCP",
										"containerPort": 80,
									},
								},
							},
						},
					},
				},
			},
		},
	}

	// Create Deployment
	fmt.Println("Creating deployment...")
	result, err := client.Resource(deploymentRes).Namespace(apiv1.NamespaceDefault).Create(context.TODO(), deployment, metav1.CreateOptions{})
  • 进入Create方法内部看看,如下图所示,这个Create方法可以用来创建多种资源类型,但使用了meta.Accessor,无需知道资源类型也能得到资源名称
    在这里插入图片描述
  • 至此,对象属性的学习就完成了,相信您对metav1.Object和metav1.ObjectMeta都有了深入的理解,也会有动手写代码试试的冲动
  • 实战一直是欣宸原创的招牌,这里也不会缺席,碍于篇幅限制本篇就只聊理论,下一篇,咱们实战走起,写代码体验对象属性的操作

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

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

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

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

相关文章

vue3-03筛选任务

前置知识:生命周期函数在vue3不再是配置式的,而是一个普通函数。 步骤: 确认筛选条件是通过hash值声明filter函数:通过hash改变的筛选得到对应的任务列表userFilter.js文件:用于任务的筛选。 使用一个响应式变量visib…

copy和xcopy实现复制文件和文件目录

copy命令复制文件 语法 copy [/d] [/v] [/n] [/y | /-y] [/z] [/a | /b] <source> [/a | /b] [<source> [/a | /b] [ ...]] [<destination> [/a | /b]]参数说明 参数说明/d允许加密的源文件保存为解密的目标文件/v验证目标文件是否正确写入/n如果需要&…

kubesphere的CICD

安装 SonarQube 服务器 请先安装 Helm&#xff0c;以便后续使用该工具安装 SonarQube。例如&#xff0c;运行以下命令安装 Helm 3&#xff1a; curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash查看 Helm 版本 helm versionversion.Buil…

3D渲染速度慢,花重金买显卡还是用云渲染更划算

3D渲染对建筑师和设计师来说并不陌生&#xff0c;3D渲染的过程中出现渲染卡顿、特殊材质难以渲染&#xff0c;或者本地配置不足、本地渲染资源不够时&#xff0c;常常会影响工作效率。本文比较了3D渲染时&#xff0c;为提高工作效率&#xff0c;买显卡还是用云渲染更划算&#…

SystemVerilog 教程第二章数据类型:队列

SystemVerilog 队列 SystemVerilog queue&#xff08;队列&#xff09;是一种 First In First Out&#xff08;先入先出&#xff09;方案&#xff0c;您可为其设置变量大小&#xff0c;用于存储相同数据类型的各种元素。 它与一维解包阵列类似&#xff0c;同样可以自动伸缩调整…

zabbix 6.0 监控LNPM环境

这里的LNPM是指Linux&#xff0c;Nginx,php-fpm和Mysql.具体版本如下。 Linux : centos7.9Nginx: 1.22.1php-fpm:7.4Mysql: 8.0 一、centos7.9 编译安装Nginx 为了弄清楚Nginx各种配置&#xff0c;我们采用编译安装的形式部署Nginx。 1.下载安装包 首先下载Nginx软件包&am…

unity 调用C++ dll 有类和指针操作

这个在之前unity 调用C dll 操作升级套娃函数调用_天人合一peng的博客-CSDN博客的基础上&#xff0c;但实事时类相互嵌套&#xff0c;非常不好处理。 1 测试直接将main()生成dll程序能运行不。 发现是可以的。 2 那就是想方法把对象或指针的操作的下一级函数直接写到main里面&…

简单认识数据库用户管理

文章目录 一、数据库用户管理1、新建用户&#xff08;1&#xff09;创建用户使用明文设置密码&#xff08;2&#xff09;获取密文再给新用户设置密码&#xff08;3&#xff09;查看数据库用户和其他信息&#xff08;4&#xff09;查看当前登录用户信息 2.修改数据库用户相关信息…

漏洞复现-CVE-2023-33246 Apache RocketMQ RCE漏洞原理与复现

目录 漏洞原理漏洞描述影响范围 Apache RocketMQ学习文档学习代码审计 漏洞复现docker环境搭建exp代码 总结参考 漏洞原理 漏洞描述 For RocketMQ versions 5.1.0 and below, under certain conditions, there is a risk of remote command execution. Several components of…

Wine的调试方法

wine的运行管理 # 运行exe程序 wine <exe程序># 运行msi程序 wine msiexec /i <msi程序> wine start <msi程序># 静默安装 wine <exe程序> /q /doNotRequireDRMPrompt /noupdate# 杀掉wine进程 wineserver -k pkill wine配置wine 配置环境变量 # 配…

GD32f103系列外部晶振更改

GD32f103系列的芯片现在基本很普通了&#xff0c;外部很多资料都是使用8MHz晶振为CPU提供主频。很多的时候由于项目的原因&#xff0c;外部晶振会更换不同的频率&#xff0c;有4MHz或者12Mhz的&#xff0c;因此需要在系统文件中做一些更改。 以8MHz晶振转12MHz晶振为例&#x…

Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)

Redis系列文章 Redis&#xff08;一&#xff09;原理及基本命令&#xff08;柔性数组&#xff09; Redis&#xff08;二&#xff09;网络协议和异步方式&#xff08;乐观锁&悲观锁&#xff09; Redis&#xff08;三&#xff09;存储原理与数据模型&#xff08;hash冲突、渐…

chatGPT指令大全可免费使用网站列表chatGPT4试用方案

指令列表 写作助理 &#x1f449; 最常使用的 prompt&#xff0c;用于优化文本的语法、清晰度和简洁度&#xff0c;提高可读性。作为一名中文写作改进助理&#xff0c;你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性&#xff0c;同时分解长句&#xff0c;减少…

【CesiumJS入门】(7)绘制多段线(动态实时画线)

前言 鼠标左键添加点、右键完成绘制,单击右侧弹窗关闭按钮清空绘制。参考沙盒示例&#xff1a;Drawing on Terrain 直接上代码了 /** Date: 2023-07-12 18:47:18* LastEditors: ReBeX 420659880qq.com* LastEditTime: 2023-07-16 16:26:19* FilePath: \cesium-tyro-blog\s…

【动手学深度学习】--07.数值稳定性、模型初始化、激活函数

文章目录 数值稳定性、模型初始化、激活函数1.数值稳定性1.1举例1.2数值稳定性的常见两个问题1.3梯度爆炸1.4梯度消失1.5打破对称性 2.模型初始化2.1让训练更加稳定2.2权重初始化2.3Xavier初始 3.激活函数 数值稳定性、模型初始化、激活函数 学习视频&#xff1a;数值稳定性 …

vue3后台管理系统实现动态侧边导航菜单管理(ElementPlus组件)

记住 一级(el-sub-menu)的都是只是展示的 点击跳转的都是一级下的子级(el-menu-item) 完整展示 1:在登陆功能进行登陆 获取menu列表 注册路由表的时候 把文件进行创建好 因为注册的方法需要获取这个路径 整个router下的main product等等都要创建 //1:发送你的用户名和密码获…

Linux--进程终止

一、进程终止时&#xff0c;操作系统做了什么&#xff1f;&#xff1f; 释放进程申请的相关内核数据结构和对应的代码和数据 本质就是释放系统资源&#xff08;最主要的资源是内存&#xff09; 二、进程终止的常见方式&#xff1f; a.代码跑完&#xff0c;结果正确 b.代码跑完&…

【我的2023上半年总结】感谢CSDN:第一次100w+阅读,赚大了!

大家好&#xff0c;这里是程序员晚枫。 因为工作一般都是996的原因&#xff0c;今天是2023上半年少有的周六休息日&#xff0c;正好看到平台的#2023年中总结#活动&#xff0c;赶紧来分享一下这半年的自媒体收获~ 主要说一些开心的事情 1、CSDN CSDN账号&#x1f449;Python…

MySQL的循环语句分析

1.while循环 复制 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQL语句 DELIMITER //DROP PROCEDURE if EXISTS &lsquo;test&rsquo;; # 如果存在test存储过程则删除CREATE procedure test() # 创建无参存储过程,名称为testBEGIN DECLARE i I…

配置 Vite 的环境变量与模式 (.env mode)

目录 创建项目环境变量内建变量创建.env 文件定义变量HTML 环境变量替换 模式 创建项目 npm create vitelatest or yarn create vite or pnpm create vite 环境变量 Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。 console.log(import.meta.env)内建变量 import.met…