关于client-go
client-go是一个golang的client,我们可以通过client-go与K8S apiServer进行交互,对k8s集群中资源对象,包括内置资源(例如:Pod、Deployment、Service等)和CRD进行增删改查等操作。
client-go地址
: https://github.com/kubernetes/client-go
目录结构:
- kubernetes: 该包包含了可以访问kubernetes集群的api,通过这些API可以与apiServer进行通信,对集群的资源对象进行增删改查。比如,我们可以通过kubectl来创建一个deployment,同样的,我们可以使用kubernetes中的clientset来创建一个Deployment。
- discovery: 该包用于发现Kubernetes apiServer支持的API。
- dynamic:该包包含一个动态客户端,可以对任意Kubernetes API对象执行通用操作。
- plugin/pkg/client/auth:该包包含可选的身份验证插件,用于从外部源获取凭证。
- transport:该包用于设置认证并启动连接。
- informers:每种k8s资源的informer实现。
- listers:为每一个k8s资源提供list功能,将数据缓存到本地,然后get和list时从本地获取,减轻apiServer的压力。
- tools:提供常用工具,例如SharedInformer、Reflector、DeltaFifo已经Indexers等。提供client查询和缓存机制,主要子目录为cache。
- util:提供常用方法。例如WorkQueue工作队列,Certificate证书管理等。
确定要用的client-go版本
client-go官方提供了多个版本,并且给出了和kubernetes版本的匹配列表,如下所示:
解释一下表格中的✓
、+
、-
的含义:
✓
表示精确匹配,如下图红框,表示v0.20.0版本可以精确匹配1.20.0版本的kubernetes;- + 表示有的新特性是client-go支持的,但是此kubernetes版本却不支持;
- - 表示有的新特性是kubernetes支持的,但是此client-go版本却不支持;
client-go中的client
client-go中提供了四种与k8s apiServer交互的客户端,分别是 Rest Client、ClientSet、 Discovery Client和Dynamic Client:
- RestClient:最基础的client,底层是对标准库的net/http的封装,下面的client都是对rest client的封装。
- ClientSet:基于Rest Client进行了封装,通过clientset可以更加方便地操作K8S地资源对象。
- DiscoveryClient:发现客户端,负责发现apiServer支持地资源组、资源版本和资源信息,相当于使用kubectl api-resources
- DynamicClient:动态客户端,用于发现kubernetes的API Server支持的Group、Version、Resources等信息;可以对任意的K8S资源对象进行操作,包括CRD.
GVK和GVR
- G(Group组):资源组,包含一组资源操作的集合,比如apps下面有deployment、demonset等。
- V(Version版本):资源版本,用于区分不同API的稳定程度和兼容性,比如v1、v1alpha1等。
- R(Resources资源):资源信息,用于区别不同的资源API,k8s中有很多资源,比如pod、deployment、ingress等。
- K(Kind类别):资源对象的类型,每个资源对象都需要Kind来区分它自身代表的资源类型。
一般在调用接口时,我们只需要知道GVR即可,通过GVR操作对应的资源对象。