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.hqwc.cn/news/638326.html

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

相关文章

【UI】element-ui的el-dialog的遮罩层在模态框的前面bug

最近在写element ui 的时候使用dialog组件,偶然出现了这种情况 原因: 是因为遮罩层插入进了body标签下,z-index高于当前父元素。 解决:在el-dialog标签里加上:modal-append-to-body"false"就可以了。 饿了么官网文档&a…

Django模型的继承

Django模型的继承 Django模型的继承,包括模型的抽象基类、Meta继承、related_name和related_query_name属性、多表继承、Meta和多表继承、继承与反向关系、代理模型、代理模型继承和未托管模型,以及多重继承等内容。本文讲解一下抽象基类继承&#xff0…

如何完成三只青蛙任务?

如何完成三只青蛙任务? 本文介绍了如何有效完成 三只青蛙任务,包括匹配资源、保护青蛙和拒绝干扰事项。 同时,对于习惯缺乏动力的问题,建议考虑是否有必要去做这个习惯,或者寻找其他激励方法。 大家在践行过程中可能没…

嵌入式面试-回答UART

说明: 此文章是在阅读了一些列面试相关资料之后对于一些常见问题的整理,主要针对的是嵌入式软件面试中涉及到的问答,努力精准的抓住重点进行描述。若有不足非常欢迎指出,感谢!在总结过程中有些答案没标记参考来源&…

密码学 | 数字证书:应用

🥑原文:数字签名和数字证书的原理解读 - 知乎 🥑前文:密码学 | 数字签名 数字证书 - CSDN 🥑提示:把客户端想成 Alice,服务器端想成 Bob 即可。客户端实际上指的是客户端浏览器。 下面&#…

修改Ubuntu22.04系统图标

在Ubuntu 22.04中更改开机时显示的Ubuntu图标需要修改的设置。 主要思路是用自己图片替换系统图片,保持系统图片同名,同格式。 以下是一般的步骤: 修改启动界面的logo: sudo cp 新logo.png /usr/share/plymouth/themes/spinn…

MRHFR:基于不同阅读习惯的多模态虚假新闻检测

一、概述 在多模态领域中,主要存在两个核心问题:一致性对齐问题和交互融合问题。一致性对齐问题主要指不同模态的信息匹配,例如实体对齐、语义对齐,例子有:文本中的“男人”与图片中男子指代一个人。交互融合问题指不同…

Js-JavaScript-三种弹出提示框-alert-confirm-prompt-ai插件

文章目录 1.alert-提示框2.confirm-确认框3.prompt-输入框4.总结 1.alert-提示框 alert (message: string , title: string , errorIcon: Boolean ) Core JavaScript Classes Displays an alert box message: Data Type: string The text to display title (optional): Data Ty…

VSCode插件开发学习

一、环境准备 0、参考文档:VS Code插件创作中文开发文档 1、大于18版本的nodejs 2、安装Yeoman和VS Code Extension Generator: npm install -g yo generator-code 3、生成脚手架 yo code 选择内容: ? What type of extension do yo…

docker pull速度慢解决办法

在使用 Docker 时遇到拉取镜像速度慢的问题,可以使用国内的镜像源可以提高下载速度。 使用阿里镜像加速器 Docker 配置文件位于 /etc/docker/daemon.json。如果文件不存在,可以手动创建它。将以下内容添加到配置文件中: 整体复制执行命令&…

旋转数组的最小数字

旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com) 描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,…

如何封装Vue组件并上传到npm

前言 环境准备 1.注册npm账号:npm | Home (npmjs.com) 2.保证当前环境安装了vue、webpack、node,以下工作将在该环境下进行(没有的小伙伴自行百度安装哈~) 3.一下用到的环境版本 webpack:v5.1.4node:v…