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

欢迎访问我的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接口// +optionalmetav1.ObjectMeta// Spec defines the behavior of a pod.// +optionalSpec PodSpec// Status represents the current information about a pod. This data may not be up// to date.// +optionalStatus PodStatus
}
  • 以上是从使用的角度了解属性,接下来深入属性相关的源码学习

接口metav1.Object

  • 先看接口metav1.Object的源码,可见前面咱们看到的annonations,labels等等信息,在metav1.Object中都有Get方法获取,也有Set方法来设置
type Object interface {GetNamespace() stringSetNamespace(namespace string)GetName() stringSetName(name string)GetGenerateName() stringSetGenerateName(name string)GetUID() types.UIDSetUID(uid types.UID)GetResourceVersion() stringSetResourceVersion(version string)GetGeneration() int64SetGeneration(generation int64)GetSelfLink() stringSetSelfLink(selfLink string)GetCreationTimestamp() TimeSetCreationTimestamp(timestamp Time)GetDeletionTimestamp() *TimeSetDeletionTimestamp(timestamp *Time)GetDeletionGracePeriodSeconds() *int64SetDeletionGracePeriodSeconds(*int64)GetLabels() map[string]stringSetLabels(labels map[string]string)GetAnnotations() map[string]stringSetAnnotations(annotations map[string]string)GetFinalizers() []stringSetFinalizers(finalizers []string)GetOwnerReferences() []OwnerReferenceSetOwnerReferences([]OwnerReference)GetClusterName() stringSetClusterName(clusterName string)GetManagedFields() []ManagedFieldsEntrySetManagedFields(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, nilcase metav1.ObjectMetaAccessor:if m := t.GetObjectMeta(); m != nil {return m, nil}return nil, errNotObjectdefault: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 Deploymentfmt.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.mzph.cn/news/4810.shtml

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

相关文章

LeetCode·每日一题·1851. 包含每个查询的最小区间·优先队列(小顶堆)

题目 示例 思路 离线查询: 输入的结果数组queries[]是无序的。如果我们按照输入的queries[]本身的顺序逐个查看,时间复杂度会比较高。 于是,我们将queries[]数组按照数值大小,由小到大逐个查询,这种方法称之为离线查询…

Ceph 服务的运用

目录 一、资源池 pool 管理 1.创建一个 Pool 资源池 2.查看集群 Pool 信息 3.查看资源池副本的数量 4.查看 PG 和 PGP 数量 5.修改 pg_num 和 pgp_num 的数量为 128 6.修改 Pool 副本数量为 2 7.修改默认副本数为 2 8.删除 Pool 资源池 8.1修改配置文件 8.2推送 ceph…

TypeScript 1 - 小记

文章目录 关于 TypeScript 关于 TypeScript TypeScript is a superset of JavaScript that compiles to clean JavaScript output. 官网:https://www.typescriptlang.orggithub : https://github.com/microsoft/TypeScriptplayground : https://www.typescriptlan…

BTP Integration Suite学习笔记 - (Unit3) Developing with SAP Integration Suite

BTP Integration Suite学习笔记 - (Unit1) Developing with SAP Integration Suite BTP Integration Suite学习笔记 - (Unit2) Developing with SAP Integration Suite 带着一个问题去学:明明可以直接访问一个后端系统的OData服务,为什么还要再多绕一道C…

Linux5.16 Ceph集群

文章目录 计算机系统5G云计算第四章 LINUX Ceph集群一、Ceph1.存储基础1)单机存储设备2)单机存储的问题3)商业存储解决方案4)分布式存储(软件定义的存储 SDS)5)分布式存储的类型 2.Ceph 简介3.C…

获得servlet相关API,获得请求头和cookie-spring23

后台能够成功打印 如何获得请求头 如何获得cookie 获取浏览器信息 把network下user Agent的值赋给他 这个值可以直接赋给Cookie 就是这个cookie 把cookie的值赋值给一边JasonId, 这里面的Value代表着名字,名字是cookie后面那一块:

nginx推流环境搭建

目录 1、创建安装文件夹2、安装编译 nginx 所需要的库3、下载 nginx-1.21.6.tar.gz下载 nginx-rtmp-module4、解压解压nginx文件解压rtmp模块5、编译6、安装7、启动nginx,检测nginx是否能成功运行8、配置nginx使用RTMP9、重启nginx服务器1、创建安装文件夹 cd ~ mkdir nginx …

Comparator.comparing()实现中文排序及空指针处理

一、 Comparator.comparing()的用法请详见以下上一篇文章的汇总介绍。 Comparator用法_乞力马扎罗の黎明的博客-CSDN博客 二、应用示例: 1、中文排序、空值处理 Collator instance Collator.getInstance(Locale.CHINA); checkItemVoList.stream().sorted(Compar…

每日科技分享-POE新增文件和链接发送功能

POE推出新功能 注意POE需要魔法上午才能进去。 实测 实测可以发送论文给chatgpt,然后和AI进行共享的对话。 POE网站链接: 也可以发送链接,实测了一下,似乎有时候并不准确,我发送了关于分层强化的文章,但是…

<数据结构>NO11.归并排序|递归|非递归|优化

文章目录 归并排序递归写法非递归写法修正方案1.归并一段拷贝一段修正方案2.修正区间 算法优化算法分析 归并排序的应用外排序和内排序 归并排序 递归写法 思路: 如果给出两个有序数组,我们很容易可以将它们合并为一个有序数组。因此当给出一个无序数组时&#xf…

华为无线ac+ap旁挂二层组网常用配置案例

AC控制器理解配置步骤: capwap source interface Vlanif 100 //源IP回包地址 wlan ssid-profile name test //新建个模版名称为test ssid test //wifi名称 wlan security-profile name test //建立安全模版也叫test security wpa-wpa2 psk pass-phrase admin123 a…

linux 安装 cuda

需求: inux 下安装 cuda 进程: 先查看一下系统版本 uname -a查看能支持什么版本的cudacuda toolkit 下载 wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run sudo sh cuda_11.1.0_4…

API 接口是什么?怎么对接 API?

一、API接口是什么? API接口即应用编程接口,是一些预先定义的函数,可以提供应用程序与开发人员基于某软件或硬件以访问一组例程的能力。简单来说,API接口相当于信息的桥梁,它可以让不同平台、应用程序或系统共享数据&…

对Element DatePicker时间组件的封装,时间组件开始时间和结束时间绑定

背景 我们时常有时间范围选择,需要选择一个开始时间和一个结束时间给后端,但我们给后端的是两个字段, 分别是开始时间和结束时间,现在使用element绑定的值是一个数组,我们还要来回处理,很麻烦列表也的查询…

JAVA集成国密SM2

JAVA集成国密SM2加解密 一、pom配置二、代码集成2.1、目录结构2.2、源码2.3、测试 三、相关链接 国密算法概述:https://blog.csdn.net/qq_38254635/article/details/131801527 SM2椭圆曲线公钥密码算法 为非对称加密,基于ECC。该算法已公开。由于该算法…

react使用SVGA特效 常用api

下载插件 npm install svgaplayerweb --save react中代码 import React, { useEffect } from react; import SVGA from svgaplayerweb const Svga () > {const bofang () > {var player new SVGA.Player(#demoCanvas);//创建实例var parser new SVGA.Parser(#demo…

centos7安装 mongodb

一、rpm安装 1.1、配置MongoDB Enterprise的yum 源文件 [mongodb-enterprise] nameMongoDB Enterprise Repository baseurlhttps://repo.mongodb.com/yum/redhat/$releasever/mongodb-enterprise/3.4/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://www.mongodb.org/static/pgp…

【Maven三】——maven生命周期和插件

系列文章目录 Maven之POM介绍 maven命令上传jar包到nexus 【Maven二】——maven仓库 maven生命周期和插件 系列文章目录前言一、什么是生命周期&why1.三套生命周期2.clean生命周期3.default生命周期4.site生命周期5.命令行与生命周期 二、插件目标三、插件绑定1.内置绑定2…

libevent:windows环境配置+QT使用

目录 libevent是什么 编译 QT使用 测试代码 libevent是什么 Fast portable non-blocking network programming with Libevent http://www.wangafu.net/~nickm/libevent-book/TOC.html 这篇文档讲的很清楚,尤其是Chapter 1: A tiny introduction to asynchro…

matlab入门

命名规则: clc:清除命令行的所有命令 clear all:清除所有工作区的内容 注释:两个% 空格 %% matlab的数据类型 1、数字 3 3 * 5 3 / 5 3 5 3 - 52、字符与字符串 s a %% 求s的ascill码 abs(s) char(97) num2str(65) str I…