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种客户端对象。
- RESTClient
RESTClient对HTTP Request进行封装,是最基础的客户端,相当于底层的基础结构。顾名思义,RESTClient实现了RESTful风格的API,可以通过RESTClient提供的RESTful方法(如Get、Put、Post、Delete)对Kubernetes集群资源对象进行增、删、改、查。Clientset、DynamicClient、DiscoveryClient等几个客户端对象都是基于RESTClient来实现的。RESTClient的主要特点如下。
- 同时支持JSON和Protobuf。
- 支持所有的原生资源和CRD。
一般而言,为了更为优雅的处理请求,需要进一步将RESTClient封装为Clientset,然后对外提供接口和服务。
- DynamicClient
DynamicClient是一种动态的客户端,能处理Kubernetes所有的资源,返回的是map[string]interface{}。如果一个控制器中需要控制所有的API,则可以使用DynamicClient,目前它主要在Garbage Collector和Namespace Controller中使用。DynamicClient的主要特点如下。
- 只支持JSON。
- 支持处理自定义CRD。
- DiscoveryClient
DiscoveryClient是发现客户端,用于发现API Server支持的所有资源组(Group)、资源版本(Version)、资源信息(Resource)。
- 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