GVR和GVK
kubernetes API是通过Http协议以RESTful的形式提供的,同时支持JSON和Protobuf的数据格式,Protobuf是为了方便集群内部调用而支持的。我们自己平时调用kubernetes接口,一版都是使用json数据格式。
在 kubernetes API中一版使用GVR或GVK来区分特定的资源,更具不同的分组,版本及资源,进行URL的定义,有了分组和多版本的支持,即便是后续的版本中,需要去掉资源对象的某些字段或者重构API资源,也可以保证版本之间的兼容性。
kubernetes API的分组可以分为无组名资源组
和有组名资源组
,无组名资源组也被称为核心资源组
,Core Group
。
有组名资源组:
无组名资源组:
GVR/GVK含义
G(Group):资源组,包含一组资源操作的集合。
V(version):资源版本,用于区分不同API的稳定程度及兼容性。
R(Resource):资源信息,用于区分不同的资源API。
K(Kind):资源对象的类型,每个资源对象都需要Kind来区分他自身代表的资源类型。
一般在接口调用的时候,我们只需要知道GVR即可。通过GVR操作对应的资源对象。
通过GVR组成RESTful API
请求路径,例如,针对apps/v1下面的Deployment的RESTful API
请求路径如下。
GET /apis/apps/v1/namespaces/{namespace}/deployments/{name}
GVK相反通过GVK信息则可以获取要读取的资源对象的GVR,进而构建RESTful API
请求获取对应的资源。这种GVK与GVR的映射叫做RESTMapper
。
RESTMapper
其主要作用是在ListerWatcher时,根据Schema定义的类型GVK解析出GVR,向APIServer发起HTTP请求获取资源,然后watch。
client-go
client-go是负责与kubernetes APIServer
服务进行交互的客户端库,利用Client-go与Kubernetes APIServer
进行交互访问,由此对k8s中的各类资源对象进行管理操作,包括内置的资源对象及CRD。
client-go不仅被k8s进行使用,其他围绕k8s的生态也被大量使用,例如:kubectl ETCD-operator等。
client-go一共提供了4种与kubernetes APIServer
交互的客户端对象,分别为RESTClient
,DiscoveryClient
,ClientSet
,DynamicClient
。
RESTClient::最基础的客户端,主要对HTTP请求进行了封装,支持json和protobuf格式的数据。
DiscoveryClient:发现客户端,负责发现APIServer支持的资源组、资源版本和资源信息。
ClientSet:负责操作k8s内置的资源对象,比如:pod,service。
DynamicClient:动态客户端,可以对任意的k8s资源对象进行通用操作,包括CRD。