client-go源码结构及客户端对象

一、基础知识介绍

1、GVR 和 GVK

Goup资源组,包含一组资源操作的集合
VVersion资源版本,用于区分不同API的稳定程度及兼容性
RResource资源信息,用于区分不同的资源API
KKind资源对象类型,每个资源对象都需要Kind来区分它自身代表的资源类型

(1)通过GVR可以构造REST Api 进行接口调用,而GVK可以获取要读的资源的GVR进而构造REST Api

(2)GVK和GVR的映射叫做REST mapper,用于APIServer发起HTTP请求获取资源。

2、client-go简介

(1)client-go是一个调用kubernetes集群资源对象API的客户端,即通过client-go实现对kubernetes集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操作。

(2)client-go支持RESTClientClientSetDynamicClientDiscoveryClient四种客户端与Kubernetes Api Server进行交互。

3、client-go的开发流程

(1)通过配置创建config对象

(2)通过config对象创建对应的客户端对象(在这一步可以对环境上的原有资源进行管理)

(3)通过客户端对象创建informer,并添加对应的GVR

(4)添加监听事件处理函数

(5)启动informer

二、clietn-go源码结构

源码目录功能说明
discovery提供DiscoveryClient发现客户端,通过Kubernetes API 进行服务发现
dynamic提供 DynamicClient 客户端,可以实现对任意 Kubernetes 资源对象操作
kubernetes提供 ClientSet 客户端,可以对 Kubernetes 内置资源对象进行操作
rest提供 RESTClient 客户端,可以实现对 kube-apiserver 执行 REST 请求实现资源操作
scale提供 ScaleClient 客户端,主要用于 Deployment、ReplicaSet、Replication Controller 等资源的扩缩容
informers提供每种 Kubernetes 资源的 Informer 实现
listers为 Kubernetes 资源提供 Lister 功能,对 Get / List 请求提供只读的缓存数据
transport提供安全的TCP连接,支持Http Stream,某些操作需要在客户端和容器之间传输二进制流,例如exec、attach等操作。该功能由内部的spdy包提供支持
tools/cache提供常用工具;提供 Client 查询和缓存机制,以缓解 kube-apiserver 压力
plugin/pkg/client/auth包含用于从外部源获取凭证的认证插件
util提供常用方法

三、client客户端对象

1、客户端简介

RESTClient是最基础的客户端。RESTClient对HTTP Request进行了封装,实现了RESTful风格的API。ClientSet、DynamicClient及DiscoveryClient客户端都是基于RESTClient实现的。

参考:client-go源码结构及Client客户端对象 | client-go

image.png

2、客户端分类

(1)RESTClient

  • client-go 中最基础的客户端,其它 client 都基于 RESTClient 实现,RESTClient 实现了 RESTful 风格的 API 请求封装,

    • 可以实现对任意 Kubernetes 资源(包括内置资源及 CRDs)的 RESTful 风格交互,如 Post() / Delete() / Put() / Get()

    • 支持 Json 和 protobuf

  • 代码实现

    func TestRestClient(t *testing.T) {    
        //加载kubeconfig配置信息
        kubeconfig, err := clientcmd.BuildConfigFromFlags("", "code/config")
        if err != nil {
            panic(err)
        }
        //设置config.APIPath请求的HTTP路径
        kubeconfig.APIPath = "api"
        //设置config.GroupVersion请求的资源组/资源版本
        kubeconfig.GroupVersion = &corev1.SchemeGroupVersion
        //设置config.NegotiatedSerializer数据的解码器
        kubeconfig.NegotiatedSerializer = scheme.Codecs
        //实例化Client对象
        restClient, err := rest.RESTClientFor(kubeconfig)
        if err != nil {
            panic(err)
        }
        result := &corev1.PodList{}
        //构建HTTP请求参数
        //请求方法可以是Get、Post、Put、Delete、Patch等
        //Namespace函数设置请求的命名空间
        //Resource函数设置请求的资源名称
        //VersionParams函数将一些查询选项(如limit、TimeoutSeconds等)添加到请求参数中
        // Do函数执行请求,并将kube-apiserver返回的result对象解析到corev1.PodList对象中
        err = restClient.Get().
            Namespace("istio-system").
            Resource("pods").
            VersionedParams(&metav1.ListOptions{Limit: 500}, scheme.ParameterCodec).
            Do(context.Background()).
            Into(result)
        if err != nil {
            panic(err)
        }
        for _, d := range result.Items {
            fmt.Printf("NAMESPACE:%v \t NAME:%v \t STATU:%v\n", d.Namespace, d.Name, d.Status.Phase)
        }
    }

  • 源码分析:对http进行了封装

(2)ClientSet

  • RESTClient是最基础的客户端,使用时需要指定Resource和Version等信息,编写代码时需要提前知道Resource所在的Group和对应的Version信息(GVR)。

    • 不能用于处理CRD资源

    • ClientSet在RESTClient的基础上封装了对Resource和Version的管理方法,每个Resource可以理解为一个客户端,而ClientSet则是多个客户端的集合

      image.png

    • ClientSet 的操作代码是通过 client-gen 代码生成器自动生成的

  • 代码实现

    func TestClientSet(t *testing.T) {
        config, err := clientcmd.BuildConfigFromFlags("", "F:\\code\\env\\config")
        if err != nil {
            fmt.Printf("The kubeconfig cannot be loaded: %v\n", err)
            panic(err)
        }
        clientset, err := kubernetes.NewForConfig(config)
        if err != nil {
            panic(err)
        }
        //请求core核心资源组v1资源版本下的pod资源对象,其内部设置了APIPath请求的HTTP路径
        //GroupVersion请求的资源组、资源版本,NegotiatedSerializer数据的编解码器
        //Pods函数是个资源接口对象,用于管理Pod资源对象的管理,包括Create、Update、Delete、Get、List、Watch、Pathc等操作
        podCliet := clientset.CoreV1().Pods(corev1.NamespaceDefault)
        list, err := podCliet.List(context.Background(), metav1.ListOptions{Limit: 500})
        for _, d := range list.Items {
            fmt.Printf("NAMESPACE:%v \t NAME:%v \t STATU:%v\n", d.Namespace, d.Name, d.Status.Phase)
        }
    }

(3)DynamicClient客户端

  • DynamicClient客户端是一种动态客户端,可以对任意的Kubernetes资源进行RESTful操作,包括CRD资源。

    • 任意资源

    • 返回的对象是一个 map[string]interface{}

    • DynamicClient 只支持JSON序列化

    • DynamicClient不是类型安全的

  • 代码示例

    func TestDynamicClient(t *testing.T) {
        config, err := clientcmd.BuildConfigFromFlags("", "F:\\code\\env\\config")
        if err != nil {
            panic(err)
        }
        dynamicClient, err := dynamic.NewForConfig(config)
        if err != nil {
            panic(err)
        }
        gvr := schema.GroupVersionResource{Version: "v1", Resource: "pods"}
        //用于设置请求的资源组,资源版本,资源名称即命名空间;List函数用于获取Pod列表
        unstructObj, err := dynamicClient.Resource(gvr).Namespace(corev1.NamespaceDefault).
            List(context.Background(), metav1.ListOptions{Limit: 500})
        if err != nil {
            panic(err)
        }
        podList := &corev1.PodList{}
        //通过runtime的函数将unstructured.UnstructuredList转换为PodList
        err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(), podList)
        if err != nil {
            panic(err)
        }
        for _, d := range podList.Items {
            fmt.Printf("NAMESPACE:%v \t NAME:%v \t STATU:%v\n", d.Namespace, d.Name, d.Status.Phase)
        }
    }

(4)DiscoveryClient客户端

  • DiscoveryClient是发现客户端,主要用于发现Kubenetes API Server所支持的资源组、资源版本、资源信息

    image.png

  • 代码示例

    func TestDiscoveryClient(t *testing.T) {
        config, err := clientcmd.BuildConfigFromFlags("", "F:\\code\\env\\config")
        if err != nil {
            panic(err)
        }
        discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)
        if err != nil {
            panic(err)
        }
        _, APIResourceList, err := discoveryClient.ServerGroupsAndResources()
        if err != nil {
            panic(err)
        }
        for _, list := range APIResourceList {
            gv, err := schema.ParseGroupVersion(list.GroupVersion)
            if err != nil {
                panic(err)
            }
            for _, resource := range list.APIResources {
                fmt.Printf("name:%v,group:%v,version:%v\n", resource.Name, gv.Group, gv.Version)
            }
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

老化测试电源作用及选购标准

老化测试电源作用及选购标准 为了保证电子产品的稳定性和可靠性,我们需要对产品进行老化测试。老化测试电源是一种专门用于测试电子元器件、电源模块等产品在长时间、持续负载工作状态下稳定性和可靠性的电源设备,也被称为“测试电源”、“老化电源”等。…

【Linux】进程的程序地址空间①

目录 前言: 1.什么是地址空间 区域划分 页表: 2.为什么要有地址空间 2.1 进程与内存解耦合 2.2安全 3.凭什么说进程具有独立性: 4.用地址空间解释一下申请内存 前言: 在C语言中,我们说我们将内存分为,栈区…

【目标跟踪】ByteTrack详解与代码细节

文章目录 一、前言二、代码详解2.1、新起航迹2.2、预测2.3、匹配2.4、结果发布2.5、总结 三、流程图四、部署 一、前言 论文地址:https://arxiv.org/pdf/2110.06864.pdf git地址:https://github.com/ifzhang/ByteTrack ByteTrack 在是在 2021 年 10 月…

同元软控专业模型库系列——热流篇

一、引言 传热与流动是自然界与科学技术领域最普遍的物理现象。聚焦工业领域,传热、流体流动和燃烧问题是热工、核能、动力机械等行业所需研究解决的主要问题。复杂热流系统往往具有高复杂性、高成本性和高可靠性的特点,传统研制模式已逐渐无法满足现有…

【UE5.1 C++】提升编译速度

步骤 1. 在“C:\Users\用户\AppData\Roaming\Unreal Engine\UnrealBuildTool”目录下找到“BuildConfiguration.xml”文件 打开“BuildConfiguration.xml”&#xff0c;添加如下部分内容 <?xml version"1.0" encoding"utf-8" ?> <Configuratio…

干货:40个数据统计和分析的术语,让你的可视化大屏有理有据

1. 总体&#xff08;Population&#xff09;&#xff1a;指研究对象的全体&#xff0c;即研究问题所涉及的所有个体或事物的集合。 2. 样本&#xff08;Sample&#xff09;&#xff1a;从总体中选取的一部分个体或事物&#xff0c;用于代表总体进行研究。 3. 参数&#xff08…

MySQl-8.3.0版本安装下载教程(超详细保姆级教程)

第一步&#xff0c;去百度找到MySQl官网 第二步,找到DOWNLOAD&#xff08;下载&#xff09; 第三步 第四步 第五步 第六步.选择倒数第2个 第七步 第八步然后根据步骤安装就好了

我最重要的三个女人都生病了,两个已经住院了

往年的金三银四&#xff0c;大部分时间我都在面试&#xff0c;今年的金三银四&#xff0c;却一直往医院跑了。 我最重要的三个女人全生病了&#xff0c;病毒感染&#xff0c;20号我妈办理了住院&#xff0c;21 号我闺女小白牙办理了住院&#xff0c;她俩还不是同一家医院媳妇儿…

2024Xtu程设第一次练习题解

程设练习题谢大会专门查重 1.1531奇怪的数字 题目让我们从小到大输出1e6以内所有的答案&#xff0c;其实也没什么好的思路 就是将一个数n的所有位都拆出来&#xff0c;遍历这些位&#xff08;每次取一个x&#xff09;&#xff0c;然后通过作除法&#xff08;y n / x&#xf…

研究助理(博士后),院所两级共同资助经费80万

一、声学所介绍 1964年&#xff0c;为落实国家声学规划&#xff0c;满足国家迫切需要&#xff0c;形成全国声学学科研究中心&#xff0c;经国务院副总理聂荣臻元帅批准&#xff0c;成立中国科学院声学研究所。 声学所是从事声学和信息处理技术研究的综合性研究所&#xff0c;…

在React项目中试用Tailwind

TailwindCSS TailwindCSS 是一个套 CSS 的工具类&#xff0c;把常用的功能都进行了定义&#xff0c;下面是一个官网的例子&#xff0c;可以看到Tailwind对一元页面素写了很多类&#xff0c;日常开发中只要定义一两个类就可以搞定类似的功能了。这里写了这么多 p-6 max-w-sm mx…

线程池的核心参数有哪些???

线程池的核心参数包括以下七个&#xff1a; corePoolSize&#xff1a; 这是线程池中的核心线程数&#xff0c;即池中会保留的最少线程数。当提交任务时&#xff0c;如果当前线程数小于核心线程数&#xff0c;线程池会创建新的线程来执行任务。如果当前线程数等于或大于核心线程…

#天空星按键点灯(不中断与中断方式)

&#xff08;1&#xff09;非中断按键点灯 &#xff0c;弹起阻塞&#xff08;天空星的用户按键为PA0&#xff0c;按下高电平&#xff0c;不按下低电平&#xff0c;含有硬件消抖&#xff09; /** 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源* 开发板官网&#xff1…

MySQL修改数据表的结构

创建数据库 -- create database 创建的数据库名; create database test; 这里创建了一个名为 test 的数据库 选择需要使用的数据库 -- use 数据库名; use test; 这里使用 test 数据库 创建数据表 -- create table 表名(字段名1 数据类型(长度) 约束,字段名2 数据类型(长…

辽宁梵宁教育设计培训:赋能大学生,新技能学习再升级

辽宁梵宁教育设计培训&#xff1a;赋能大学生&#xff0c;新技能学习再升级 在当今这个日新月异、信息爆炸的时代&#xff0c;大学生们面临着前所未有的挑战与机遇。为了帮助他们更好地适应社会的快速变化&#xff0c;提升个人的综合素质和竞争力&#xff0c;辽宁梵宁教育设计…

【Node.js】01 —— fs模块全解析

&#x1f525;【Node.js】 fs模块全解析 &#x1f4e2; 引言 在Node.js开发中&#xff0c;fs模块犹如一把万能钥匙&#xff0c;解锁着整个文件系统的操作。从读取文件、写入文件、检查状态到目录管理&#xff0c;无所不能。接下来&#xff0c;我们将逐一揭开fs模块中最常用的那…

高级数据结构—树状数组

引入问题&#xff1a; 给出一个长度为n的数组&#xff0c;完成以下两种操作&#xff1a; 1. 将第i个数加上k 2. 输出区间[i,j]内每个数的和 朴素算法&#xff1a; 单点修改&#xff1a;O( 1 ) 区间查询&#xff1a;O( n ) 使用树状数组&#xff1a; 单点修改&#xff1a…

文档分享怎么用二维码?扫码获得文档的制作方法

现在日常工作和生活中&#xff0c;经常会看到可以用于展示文件的二维码图片&#xff0c;使用这种方式可以向其他人传递一些资料、通知、数据等情况。比如常见的内容有企业介绍、产品内容、使用说明、活动流程等类型的内容&#xff0c;那么这些不同类型的文件该如何制作二维码呢…

医学图像三维重建与可视化系统 医学图像分割 区域增长

医学图像的三维重建与可视化&#xff0c;这是一个非常有趣且具有挑战性的课题&#xff01;在这样的项目中&#xff0c;可以探索不同的医学图像技术&#xff0c;比如MRI、CT扫描等&#xff0c;然后利用这些图像数据进行三维重建&#xff0c;并将其可视化以供医生或研究人员使用。…

el-select多选非空校验

一、首先是前端版本&#xff08;不建立在版本上的bug修改就是耍流氓&#xff01;&#xff09;&#xff1a; 二、原来页面是下拉单选&#xff0c;新需求要改成下拉多选&#xff0c;改成多选后就发现非空校验失效了。 三、el-select多选&#xff0c;绑定v-model的就是一个数组了…