client-go源码结构及客户端对象

client-go源码结构及客户端对象1 client go 是一个调用 kubernetes 集群资源对象 API 的客户端 即通过 client go 实现对 kubernetes 集群中资源对象 包括 deployment service ing

大家好,欢迎来到IT知识分享网。

一、基础知识介绍

1、GVR 和 GVK

Goup 资源组,包含一组资源操作的集合
V Version 资源版本,用于区分不同API的稳定程度及兼容性
R Resource 资源信息,用于区分不同的资源API
K Kind 资源对象类型,每个资源对象都需要Kind来区分它自身代表的资源类型

(1)通过GVR可以构造REST Api 进行接口调用,而GVK可以获取要读的资源的GVR进而构造REST Api

(2)GVK和GVR的映射叫做REST mapper,用于APIServer发起HTTP请求获取资源。

2、client-go简介

(1)client-go是一个调用kubernetes集群资源对象API的客户端,即通过client-go实现对kubernetes集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操作。

(2)client-go支持RESTClientClientSetDynamicClientDiscoveryClient四种客户端与Kubernetes Api Server进行交互。

3、client-go的开发流程

(1)通过配置创建config对象

(2)通过config对象创建对应的客户端对象(在这一步可以对环境上的原有资源进行管理)

(3)通过客户端对象创建informer,并添加对应的GVR

(4)添加监听事件处理函数

(5)启动informer

二、clietn-go源码结构

源码目录 功能说明
discovery 提供DiscoveryClient发现客户端,通过Kubernetes API 进行服务发现
dynamic 提供 DynamicClient 客户端,可以实现对任意 Kubernetes 资源对象操作
kubernetes 提供 ClientSet 客户端,可以对 Kubernetes 内置资源对象进行操作
rest 提供 RESTClient 客户端,可以实现对 kube-apiserver 执行 REST 请求实现资源操作
scale 提供 ScaleClient 客户端,主要用于 Deployment、ReplicaSet、Replication Controller 等资源的扩缩容
informers 提供每种 Kubernetes 资源的 Informer 实现
listers 为 Kubernetes 资源提供 Lister 功能,对 Get / List 请求提供只读的缓存数据
transport 提供安全的TCP连接,支持Http Stream,某些操作需要在客户端和容器之间传输二进制流,例如exec、attach等操作。该功能由内部的spdy包提供支持
tools/cache 提供常用工具;提供 Client 查询和缓存机制,以缓解 kube-apiserver 压力
plugin/pkg/client/auth 包含用于从外部源获取凭证的认证插件
util 提供常用方法

三、client客户端对象

1、客户端简介

RESTClient是最基础的客户端。RESTClient对HTTP Request进行了封装,实现了RESTful风格的API。ClientSet、DynamicClient及DiscoveryClient客户端都是基于RESTClient实现的。

参考:client-go源码结构及Client客户端对象 | client-go

image.png

2、客户端分类

(1)RESTClient

  • client-go 中最基础的客户端,其它 client 都基于 RESTClient 实现,RESTClient 实现了 RESTful 风格的 API 请求封装,
    • 可以实现对任意 Kubernetes 资源(包括内置资源及 CRDs)的 RESTful 风格交互,如 Post() / Delete() / Put() / Get()
    • 支持 Json 和 protobuf
  • 代码实现
    func TestRestClient(t *testing.T) { //加载kubeconfig配置信息 kubeconfig, err := clientcmd.BuildConfigFromFlags("", "code/config") if err != nil { panic(err) } //设置config.APIPath请求的HTTP路径 kubeconfig.APIPath = "api" //设置config.GroupVersion请求的资源组/资源版本 kubeconfig.GroupVersion = &corev1.SchemeGroupVersion //设置config.NegotiatedSerializer数据的解码器 kubeconfig.NegotiatedSerializer = scheme.Codecs //实例化Client对象 restClient, err := rest.RESTClientFor(kubeconfig) if err != nil { panic(err) } result := &corev1.PodList{} //构建HTTP请求参数 //请求方法可以是Get、Post、Put、Delete、Patch等 //Namespace函数设置请求的命名空间 //Resource函数设置请求的资源名称 //VersionParams函数将一些查询选项(如limit、TimeoutSeconds等)添加到请求参数中 // Do函数执行请求,并将kube-apiserver返回的result对象解析到corev1.PodList对象中 err = restClient.Get(). Namespace("istio-system"). Resource("pods"). VersionedParams(&metav1.ListOptions{Limit: 500}, scheme.ParameterCodec). Do(context.Background()). Into(result) if err != nil { panic(err) } for _, d := range result.Items { fmt.Printf("NAMESPACE:%v \t NAME:%v \t STATU:%v\n", d.Namespace, d.Name, d.Status.Phase) } }

  • 源码分析:对http进行了封装

(2)ClientSet

  • RESTClient是最基础的客户端,使用时需要指定Resource和Version等信息,编写代码时需要提前知道Resource所在的Group和对应的Version信息(GVR)。
    • 不能用于处理CRD资源
    • ClientSet在RESTClient的基础上封装了对Resource和Version的管理方法,每个Resource可以理解为一个客户端,而ClientSet则是多个客户端的集合

      image.png

    • ClientSet 的操作代码是通过 client-gen 代码生成器自动生成的
  • 代码实现
    func TestClientSet(t *testing.T) { config, err := clientcmd.BuildConfigFromFlags("", "F:\\code\\env\\config") if err != nil { fmt.Printf("The kubeconfig cannot be loaded: %v\n", err) panic(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err) } //请求core核心资源组v1资源版本下的pod资源对象,其内部设置了APIPath请求的HTTP路径 //GroupVersion请求的资源组、资源版本,NegotiatedSerializer数据的编解码器 //Pods函数是个资源接口对象,用于管理Pod资源对象的管理,包括Create、Update、Delete、Get、List、Watch、Pathc等操作 podCliet := clientset.CoreV1().Pods(corev1.NamespaceDefault) list, err := podCliet.List(context.Background(), metav1.ListOptions{Limit: 500}) for _, d := range list.Items { fmt.Printf("NAMESPACE:%v \t NAME:%v \t STATU:%v\n", d.Namespace, d.Name, d.Status.Phase) } }

(3)DynamicClient客户端

  • DynamicClient客户端是一种动态客户端,可以对任意的Kubernetes资源进行RESTful操作,包括CRD资源。
    • 任意资源
    • 返回的对象是一个 map[string]interface{}
    • DynamicClient 只支持JSON序列化
    • DynamicClient不是类型安全的
  • 代码示例
    func TestDynamicClient(t *testing.T) { config, err := clientcmd.BuildConfigFromFlags("", "F:\\code\\env\\config") if err != nil { panic(err) } dynamicClient, err := dynamic.NewForConfig(config) if err != nil { panic(err) } gvr := schema.GroupVersionResource{Version: "v1", Resource: "pods"} //用于设置请求的资源组,资源版本,资源名称即命名空间;List函数用于获取Pod列表 unstructObj, err := dynamicClient.Resource(gvr).Namespace(corev1.NamespaceDefault). List(context.Background(), metav1.ListOptions{Limit: 500}) if err != nil { panic(err) } podList := &corev1.PodList{} //通过runtime的函数将unstructured.UnstructuredList转换为PodList err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(), podList) if err != nil { panic(err) } for _, d := range podList.Items { fmt.Printf("NAMESPACE:%v \t NAME:%v \t STATU:%v\n", d.Namespace, d.Name, d.Status.Phase) } }

(4)DiscoveryClient客户端

  • DiscoveryClient是发现客户端,主要用于发现Kubenetes API Server所支持的资源组、资源版本、资源信息

    image.png

  • 代码示例
    func TestDiscoveryClient(t *testing.T) { config, err := clientcmd.BuildConfigFromFlags("", "F:\\code\\env\\config") if err != nil { panic(err) } discoveryClient, err := discovery.NewDiscoveryClientForConfig(config) if err != nil { panic(err) } _, APIResourceList, err := discoveryClient.ServerGroupsAndResources() if err != nil { panic(err) } for _, list := range APIResourceList { gv, err := schema.ParseGroupVersion(list.GroupVersion) if err != nil { panic(err) } for _, resource := range list.APIResources { fmt.Printf("name:%v,group:%v,version:%v\n", resource.Name, gv.Group, gv.Version) } } }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/107696.html

(0)
上一篇 2026-02-10 16:20
下一篇 2023-12-19 16:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信