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

这篇具有很好参考价值的文章主要介绍了client-go源码结构及客户端对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基础知识介绍

1、GVR 和 GVK

Goup 资源组,包含一组资源操作的集合
V Version 资源版本,用于区分不同API的稳定程度及兼容性
R Resource 资源信息,用于区分不同的资源API
K Kind 资源对象类型,每个资源对象都需要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

client-go源码结构及客户端对象,云原生,golang,开发语言,云原生,k8s

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则是多个客户端的集合

      client-go源码结构及客户端对象,云原生,golang,开发语言,云原生,k8s

    • 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不是类型安全的

  • 代码示例文章来源地址https://www.toymoban.com/news/detail-858750.html

    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所支持的资源组、资源版本、资源信息

    client-go源码结构及客户端对象,云原生,golang,开发语言,云原生,k8s

  • 代码示例

    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)
            }
        }
    }

到了这里,关于client-go源码结构及客户端对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python - 【socket】 客户端client重连处理简单示例Demo(一)

    在Python中,使用socket进行网络通信时,如果连接断开,可以通过以下步骤实现重连处理 这个函数使用一个while循环,不断地尝试建立 socket 连接,如果出现 socket.error 异常,则打印异常信息并等待5秒钟重试。当连接成功时,函数会返回一个连接套接字。 在主程序中,可以使用

    2024年02月14日
    浏览(30)
  • Zookeeper中的客户端配置认证(zoo_client.conf)

    Zookeeper中的客户端配置认证可以使用两种方法:digest和Kerberos。 客户端鉴权配置 该配置是用于启用Zookeeper SASL认证提供程序的选项,它是Zookeeper中一种基于Kerberos的身份验证方式。SASL(Simple Authentication and Security Layer)是一种通用的安全联接层协议,通常用于安全认证。 具体

    2024年02月13日
    浏览(40)
  • Linux网络编程:Socket套接字编程(Server服务器 Client客户端)

    文章目录: 一:定义和流程分析 1.定义 2.流程分析  3.网络字节序 二:相关函数  IP地址转换函数inet_pton inet_ntop(本地字节序 网络字节序) socket函数(创建一个套接字) bind函数(给socket绑定一个服务器地址结构(IP+port)) listen函数(设置最大连接数或者说能同时进行三次握手的最

    2024年02月12日
    浏览(67)
  • Spring MVC学习随笔-控制器(Controller)开发详解:接受客户端(Client)请求参数

    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅 💡 1. 接受客户端(client)请求参数[讲解]2. 调用业务对象3. 页面跳转 所谓简单变量:指的就是8种基本类型+String这些类型的变量。把这些类型的变量,作为控制器方法的形参,用于接受

    2024年02月05日
    浏览(37)
  • 在Spring Boot微服务集成Kafka客户端(kafka-clients)操作Kafka

    记录 :459 场景 :在Spring Boot微服务集成Kafka客户端kafka-clients-3.0.0操作Kafka。使用kafka-clients的原生KafkaProducer操作Kafka生产者Producer。使用kafka-clients的原生KafkaConsumer操作Kafka的消费者Consumer。 版本 :JDK 1.8,Spring Boot 2.6.3,kafka_2.12-2.8.0,kafka-clients-3.0.0。 Kafka安装 :https://blog.csdn.ne

    2024年02月12日
    浏览(32)
  • SpringBoot中使用Spring integration加Eclipse Paho Java Client 实现MQTT客户端

    Spring Integration 是一个开源的集成消息处理框架,它提供了消息传递、消息过滤、消息转换、消息路由等功能,可以用于构建异步、分布式的系统。 Spring-integration-stream是Spring Integration框架的一个组件,用于在不同的系统和应用之间进行消息传递、集成和流处理。 它提供了一套

    2024年02月10日
    浏览(35)
  • 使用Kafka客户端(kafka-clients)的Java API操作Kafka的Topic

    记录 :460 场景 :在Spring Boot微服务集成Kafka客户端kafka-clients-3.0.0操作Kafka的Topic的创建和删除。 版本 :JDK 1.8,Spring Boot 2.6.3,kafka_2.12-2.8.0,kafka-clients-3.0.0。 Kafka安装 :https://blog.csdn.net/zhangbeizhen18/article/details/129071395 1.微服务中 配置Kafka信息 1.1在pom.xml添加依赖 pom.xml文件: 解析

    2024年02月09日
    浏览(51)
  • NexNoSQL Client:Elasticsearch、Redis、MongoDB三合一的可视化客户端管理工具

    工作中我们使用了Elasticsearch作为存储,来支持内容的搜索,Elasticsearch这个软件大家都耳熟能详,它是一个分布式、高扩展、高实时的搜索与数据分析引擎,不仅仅支持文本索引,还支持聚合操作,使用它既可以做数据搜索,还可以做报表分析,非常的方便。 在使用过程中我

    2024年02月15日
    浏览(98)
  • Elasticsearch8.x版本Java客户端Elasticsearch Java API Client中常用API练习

    在Es7.15版本之后,es官方将它的高级客户端RestHighLevelClient标记为弃用状态。同时推出了全新的java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端。 Elasticsearch Java API Client支持除Vector title search API和Find structure API之外的所有

    2024年04月11日
    浏览(35)
  • 使用Go语言的HTTP客户端进行负载均衡

    负载均衡是分布式系统中的重要概念,它用于将流量分散到多个服务器或服务上,以实现更好的性能、可靠性和可扩展性。在Go语言中,可以使用HTTP客户端进行负载均衡,确保请求被均匀地分配到多个服务器或服务上。 下面是一个使用Go语言HTTP客户端进行负载均衡的示例:

    2024年01月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包