写点什么

三分钟了解 client-go

  • 2022-11-28
    北京
  • 本文字数:1548 字

    阅读完需:约 5 分钟

三分钟了解client-go

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 去查询。

发布于: 刚刚阅读数: 5
用户头像

InfoQ签约作者 2018-11-30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
三分钟了解client-go_Client-go_穿过生命散发芬芳_InfoQ写作社区