首页 > 其他分享 >三分钟了解client-go

三分钟了解client-go

时间:2022-11-28 23:03:34浏览次数:70  
标签:Kubernetes 对象 三分钟 client API go Informer 资源

Kubernetes的大多数组件(如控制器、Kubelet、调度器等)都不直接操作ETCD存储,组件之间也不直接通信,而是统一通过API Server通信并间接实现对ETCD的存储和查询,而这些组件与API Server通信使用的工具包就是client-go

client-go是官方提供的用于调用Kubernetes集群资源对象API的客户端。通过client-go可以对Kubernetes集群中的资源对象(包括Deployment、ReplicaSet、Pod、Service、Ingress、Pod、Namespace、Node以及自定义CRD等)进行增、删、改、查和事件监听等操作。业界主流的PaaS平台对Kubernetes前置API的封装都是通过client-go这个第三方包来实现的。

client-go项目地址为​​https://github.com/kubernetes/client-go/​​。client-go提供了4种客户端对象。

  1. RESTClient

RESTClient对HTTP Request进行封装,是最基础的客户端,相当于底层的基础结构。顾名思义,RESTClient实现了RESTful风格的API,可以通过RESTClient提供的RESTful方法(如Get、Put、Post、Delete)对Kubernetes集群资源对象进行增、删、改、查。Clientset、DynamicClient、DiscoveryClient等几个客户端对象都是基于RESTClient来实现的。RESTClient的主要特点如下。

  • 同时支持JSON和Protobuf。
  • 支持所有的原生资源和CRD。

一般而言,为了更为优雅的处理请求,需要进一步将RESTClient封装为Clientset,然后对外提供接口和服务。

  1. DynamicClient

DynamicClient是一种动态的客户端,能处理Kubernetes所有的资源,返回的是map[string]interface{}。如果一个控制器中需要控制所有的API,则可以使用DynamicClient,目前它主要在Garbage Collector和Namespace Controller中使用。DynamicClient的主要特点如下。

  • 只支持JSON。
  • 支持处理自定义CRD。
  1. DiscoveryClient

DiscoveryClient是发现客户端,用于发现API Server支持的所有资源组(Group)、资源版本(Version)、资源信息(Resource)。

  1. Clientset

Clientset是在实际开发过程中使用频率最高的客户端,通常使用Clientset来对集群资源对象进行增、删、改,搭配Informer的缓存查询使用最为优雅。Clientset的主要特点如下。

  • 访问资源时,需要按照/group/version/resourceName的格式使用资源对象。
  • 只支持处理Kubernetes的内置资源(不包括自定义的CRD)。
  • 操作的Kubernetes资源对象都有相应的结构体定义。

由于Clientset操作的Kubernetes资源对象都有相应的结构体定义,并且有大量的结构体方法,因此在实际的PaaS系统开发中,使用频率最高的组合是Clientset+Informer的优雅搭配。

Kubernetes组件在工作过程中需要大量监控并查询集群中的资源对象。以Deployment控制器为例,它需要实时关注Deployment和要控制的ReplicaSet的状态变更,实时收敛ReplicaSet的状态,使ReplicaSet与用户自定义的Deployment的状态保持一致。其他控制器也是如此,它们需要频繁查询所关注的资源对象,这势必会对API Server和ETCD造成查询负担。这些问题都可以通过client-go的组件Informer来解决。

Informer的核心机制是List/Watch,当连接到API Server时,Informer会先获取(List模式)Kubernetes中所有用户关心的资源对象并存储到本地缓存中,之后会对这些资源对象进行监听(Watch模式),监控资源对象的变化,当资源对象发生变更时,会修改当前缓存中的数据,保证其与ETCD的数据一致。在Kubernetes的开发中,Informer的使用场景和优势如下。

  • 当用户使用Informer查询Kubernetes中的资源对象时,查询的是本地的缓存,速度非常快,并且减轻了API Server和ETCD集群的查询压力。
  • Informer支持用户使用ShareInformer的AddEventHandler进行事件订阅和回调处理。事件订阅和回调处理是Kubernetes内置资源对象(Pod、Deployment、Service等)控制器、用户为自定义CRD编写控制器时需要使用的。

最优雅的开发实践是使用Clientset进行资源对象的增、删、改,并使用Informer去查询。

标签:Kubernetes,对象,三分钟,client,API,go,Informer,资源
From: https://blog.51cto.com/key3feng/5893759

相关文章

  • 一文熟悉 Go 函数
    耐心和持久胜过激烈和狂热。哈喽大家好,我是陈明勇,今天分享的知识是Go的函数。如果本文对你有帮助,不妨点个赞,如果你是Go语言初学者,不妨点个关注,一起成长一起进步,如果本文......
  • 0130-Go-数值解析
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/number-parsing目标使用Go语言的数值解析。示例packagemainimport("fmt""st......
  • 0129-Go-随机数
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/random-numbers目标使用Go语言的随机数。示例packagemainimport("fmt""math......
  • 0131-Go-URL 解析
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/url-parsing目标使用Go语言的URL解析。示例packagemainimport("fmt""net"......
  • 0132-Go-SHA256
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/sha256-hashes目标使用Go语言的SHA256。示例packagemainimport("crypto/sha256"......
  • 0133-Go-Base64
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/base64-encoding目标使用Go语言的Base64。示例packagemainimport(b64"encoding......
  • 0121-Go-字符串格式化
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/string-formatting目标使用Go语言的字符串格式化。示例packagemainimport("fmt"......
  • 0120-Go-字符串函数
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/string-functions目标使用Go语言的字符串函数。示例packagemainimport("fmt"......
  • 0122-Go-模板字符串
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/text-templates目标使用Go语言的模板字符串。示例packagemainimport("os""t......
  • 0123-Go-正则表达式
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/regular-expressions目标使用Go语言的正则表达式。示例packagemainimport( "bytes" ......