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转换为PodListerr = 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)}}
    }

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

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

相关文章

冒泡排序c++

题目描述 编程输入n(1≤n≤20)个小于1000非负整数,然后自动按从大到小的顺序输出。(冒泡排序) 输入 第一行,数的个数n; 第二行,n个非负整数。 输出 由大到小的n个非负整数,每个数占一行。 样例输入 …

restful请求风格的增删改查-----修改and删除

一、修改&#xff08;和添加类似&#xff09; 前端&#xff1a; <script type"text/javascript">function update(){//创建user对象var user {id:$("#id").val(),username:$("#username").val(),password:$("#password").val…

探索VR数字展厅,对企业未来展示新模式

在数字化浪潮的推动下&#xff0c;企业展示也在经历着一场革命&#xff0c;VR数字展厅正在以一种全新的方式重塑我们的生活和工作空间&#xff0c;不仅重塑了客户的观展体验&#xff0c;也为企业营销打开了新的渠道。 VR数字展厅作为实体展厅的数字化延伸&#xff0c;正以其沉浸…

【论文笔记】基于预训练模型的持续学习(Continual Learning)(增量学习,Incremental Learning)

论文链接&#xff1a;Continual Learning with Pre-Trained Models: A Survey 代码链接&#xff1a;Github: LAMDA-PILOT 持续学习&#xff08;Continual Learning, CL&#xff09;旨在使模型在学习新知识的同时能够保留原来的知识信息了&#xff0c;然而现实任务中&#xff…

数据结构––kmp算法(串)

kmp算法作为串的一个重要内容&#xff0c;必然有一定的难度&#xff0c;而在看到各类教辅书里的概念与解释后&#xff0c;其晦涩难懂的内容直接劝退一部分人&#xff0c;现在&#xff0c;让我们来看看吧 KMP解决的问题类型 KMP算法的作用就是在一个已知的字符串中查找子串的位…

hive中建立MySQL表格时有乱码

我们启动hive 建立一个学生students表格 使用desc students查看表格结构时 发现有出现乱码的情况 遇到这种问题 我们可以修改一下 打开MySQL mysql -u root -p123456; 切换数据库 use hive; 执行 修改字段注释字符集 alter table COLUMNS_V2 modify column COMMENT varchar…

【算法一则】反转链表

目录 题目题解进阶 题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4…

天梯赛 L2-052 吉利矩阵

//r[n]:当前第几列的值。 //l[n]:当前第几行的值。 暴力减止 #include<bits/stdc.h> using namespace std; #define int long long const int n1e3; int a,b,c,l[n],r[n],an; void dfs(int x,int y) {if(xb1){an;return ;}for(int i0;i<a;i){l[x]i;r[y]i;if(l[x]&l…

JavaScript之模块化规范详解

文章的更新路线&#xff1a;JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题&#xff08;HTML基础知识和CSS基础知识已经更新完毕&#xff09; 正文 CommonJS、UMD、CMD和ES6是不同的模块…

详解Java中的五种IO模型

文章目录 前言1、内核空间和用户空间2、用户态和内核态3、上下文切换4、虚拟内存5、DMA技术6、传统 IO 的执行流程 一、阻塞IO模型二、非阻塞IO模型三、IO多路复用模型1、IO多路复用之select2、IO多路复用之epoll3、总结select、poll、epoll的区别 四、IO模型之信号驱动模型五、…

网络安全产品---态势感知EDR

态势感知 what SA&#xff0c;Situational Awareness 是对一定时间和空间内的环境元素进行感知&#xff0c;并对这些元素的含义进行理解&#xff0c;最终预测这些元素在未来的发展状态。 why 安全防护思想已经从过去的被动防御向主动防护和智能防护转变。如果不做到主动防御…

Hadoop1X,Hadoop2X和hadoop3X有很大的区别么?

Hadoop的演进从Hadoop 1到Hadoop 3主要是为了提供更高的效率、更好的资源管理、更高的可靠性以及对更多数据处理方式的支持。下面是Hadoop 1, Hadoop 2, 和 Hadoop 3之间的主要区别和演进的原因&#xff1a; Hadoop 1 特点&#xff1a; 主要包括两大核心组件&#xff1a;HDFS&a…

跨平台SIP 客户端-linphone下载、使用、开启视频H264

linphone 介绍 Linphone 是一种开源的语音和视频通信应用程序&#xff0c;它提供了基于互联网协议&#xff08;IP&#xff09;的实时通信功能。用于语音/视频通话、即时消息和电话会议的开源 SIP 电话。它适用于移动和桌面环境&#xff08;iOS、Android、GNU/Linux、macOS、Win…

【Linux】在centos快速搭建K8S1.18集群

使用 kubeadm 创建集群帮助文档 如果您需要以下几点&#xff0c;该工具是很好的选择&#xff1a;kubeadm 一种简单的方法&#xff0c;让你尝试 Kubernetes&#xff0c;可能是第一次。现有用户自动设置群集并测试其应用程序的一种方式。其他生态系统和/或安装程序工具中的构建…

SpringBoot集成Sleuth

引入Maven依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency> 配置yml文件 bootstrap.yml文件增加如下配置 注&#xff1a;这个配置不是必须要&#…

经典机器学习算法——决策树

优质博文&#xff1a;IT-BLOG-CN 树模型是机器学习中最常用的一类模型&#xff0c;包括随机森林、AdaBoost、GBDT&#xff08;XGBoost和Lightgbm&#xff09;等&#xff0c;基本原理都是通过集成弱学习器的即式来进一步提升准确度。这里的弱学习器包括线性模型和决策树模型&…

大sql mysql执行

先把sql 拆分 太大的执行失败 使用 SQLDumpSplitter3 拆分sql 执行拆分的sql 拆分的sql 打开发现很多 ; 开头的空行 替换掉 正则 ^; 修改数据库 my.cnf my,ini 执行可能会提示 [ERR] 2006 - Server has gone away 错误 在 [mysqld] 添加以下几行 wait_timeout2880000 inter…

上位机工作感想-从C#到Qt的转变-1

0.前言 接触Qt开发也有一年多的时间了&#xff0c;还记得去年初从杭州回合肥时&#xff0c;刚来公司面临的几个问题&#xff1a; 1.C#转上位机的迷茫2.新公司管理模式的差异3.试用期的各种紧急任务。 当时也是加班加点学习C和Qt的基础知识&#xff0c;做了两个考核项目后&am…

解决Mac使用Vscode无法调用外部终端

前言 今天遇到一个很奇怪的问题&#xff0c;之前好好的用Vscode还能调用外部终端&#xff0c;怎么今天不行了&#xff1f;问题出在哪里呢&#xff1f;请听我娓娓道来。 检查配置文件 我查看了一下配置文件&#xff0c;发现配置文件都是调用外部控制台&#xff0c;没毛病啊。 …

【AI开发:音频】二、GPT-SoVITS使用方法和过程中出现的问题(GPU版)

1.FileNotFoundError: [Errno 2] No such file or directory: logs/guanshenxxx/2-name2text-0.txt 这个问题中包含了两个&#xff1a; 第一个&#xff1a;No module named pyopenjtalk 我的电脑出现的就是这个 解决&#xff1a;pip install pyopenjtalk 第二个&#xff1a…