client-go实战之二:RESTClient

client-go实战之二:RESTClient欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;系列文章链接client-go实战之一:准备工作client-go实战之二:RESTClientclient-go实战之三:Clientsetclient-go实战之四:dynamicClientclient-go实战之五:DiscoveryClient本篇概览本文是《client-go实战》系列的第二篇,前文咱们提到过client-go一共有四种客户端:RESTClient、ClientSet、DynamicClient、DiscoveryClient,而RESTClient是最基础的版本,其他三种都是基于RESTClient封装的,今天咱们通过实战编码来学习RESTClient,熟悉最基础的远程操作步骤;本篇由以下几部分组成:简介RESTClient每次编码前的准备工作正式编码验证关键源码分析RESTClient简介RESTClient是client-go最基础的客户端,主要是对HTTP Reqeust进行了封装,对外提供RESTful风格的API,并且提供丰富的API用于各种设置,相比其他几种客户端虽然更复杂,但是也更为灵活;使用RESTClient对kubernetes的资源进行增删改查的基本步骤如下:确定要操作的资源类型(例如查找deployment列表),去官方API文档中找到对于的path、数据结构等信息,后面会用到;加载配置kubernetes配置文件(和kubectl使用的那种kubeconfig完全相同);根据配置文件生成配置对象,并且通过API对配置对象就行设置(例如请求的path、Group、Version、序列化反序列化工具等);创建RESTClient实例,入参是配置对象;调用RESTClient实例的方法向kubernetes的API Server发起请求,编码用fluent风格将各种参数传入(例如指定namespace、资源等),如果是查询类请求,还要传入数据结构实例的指针,改数据结构用于接受kubernetes返回的查询结果;接下来的编码实战也是按照上述流程进行的;实战内容本次实战内容很简单:查询kube-system这个namespace下的所有pod,然后在控制台打印每个pod的几个关键字段;感谢您耐心听我啰嗦了一大堆,接下来开始实战吧;源码下载本篇实战中的源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议这个git项目中有多个文件夹,client-go相关的应用在client-go-tutorials文件夹下,如下图红框所示:

client-go-tutorials文件夹下有多个子文件夹,本篇对应的源码在restclientdemo目录下,如下图红框所示:

查看官方文档,获取编码所需内容浏览器打开官方API文档,地址:https://v1-19.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/找到pod的API文档,如下图,确定了path和namespace参数:

然后还要关注响应的数据结构,如下图红框,返回的是:

点击上图红框中的内容,可见PodList的详情,这就是我们编码时所需的数据结构:

掌握了请求和响应的详细信息,可以开始编码了;编码新建文件夹restclientdemo,在里面执行以下命令,新建module:go mod init restclientdemo添加k8s.io/api和k8s.io/client-go这两个依赖,注意版本要匹配kubernetes环境:go get k8s.io/api@v0.20.0go get k8s.io/client-go@v0.20.0新建main.go,内容如下,已经都添加了详细的注释,就不赘述了:package mainimport ("context""flag""fmt""k8s.io/client-go/kubernetes/scheme""k8s.io/client-go/rest""k8s.io/client-go/tools/clientcmd""k8s.io/client-go/util/homedir"corev1 "k8s.io/api/core/v1"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1""path/filepath")func main() {var kubeconfig *string// home是家目录,如果能取得家目录的值,就可以用来做默认值if home:=homedir.HomeDir(); home != "" {// 如果输入了kubeconfig参数,该参数的值就是kubeconfig文件的绝对路径,// 如果没有输入kubeconfig参数,就用默认路径~/.kube/configkubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")} else {// 如果取不到当前用户的家目录,就没办法设置kubeconfig的默认目录了,只能从入参中取kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")}flag.Parse()// 从本机加载kubeconfig配置文件,因此第一个参数为空字符串config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)// kubeconfig加载失败就直接退出了if err != nil {panic(err.Error())}// 参考path : /api/v1/namespaces/{namespace}/podsconfig.APIPath = "api"// pod的group是空字符串config.GroupVersion = &corev1.SchemeGroupVersion// 指定序列化工具config.NegotiatedSerializer = scheme.Codecs// 根据配置信息构建restClient实例restClient, err := rest.RESTClientFor(config)if err!=nil {panic(err.Error())}// 保存pod结果的数据结构实例result := &corev1.PodList{}//  指定namespacenamespace := "kube-system"// 设置请求参数,然后发起请求// GET请求err = restClient.Get().//  指定namespace,参考path : /api/v1/namespaces/{namespace}/podsNamespace(namespace).// 查找多个pod,参考path : /api/v1/namespaces/{namespace}/podsResource("pods").// 指定大小限制和序列化工具VersionedParams(&metav1.ListOptions{Limit:100}, scheme.ParameterCodec).// 请求Do(context.TODO()).// 结果存入resultInto(result)if err != nil {panic(err.Error())}// 表头fmt.Printf("namespace\t status\t\t name\n")// 每个pod都打印namespace、status.Phase、name三个字段for _, d := range result.Items {fmt.Printf("%v\t %v\t %v\n",d.Namespace,d.Status.Phase,d.Name)}}编码完成,执行go run main.go,即可获取指定namespace下所有pod的信息,控制台输出如下:(base) zhaoqindeMBP:restclientdemo zhaoqin$ go run main.gonamespace status namekube-system Running coredns-7f89b7bc75-5pdwckube-system Running coredns-7f89b7bc75-nvbvmkube-system Running etcd-hedykube-system Running kube-apiserver-hedykube-system Running kube-controller-manager-hedykube-system Running kube-flannel-ds-v84vckube-system Running kube-proxy-hlppxkube-system Running kube-scheduler-hedy至此,RESTClient客户端从编码到验证都完成了;如何将收到的数据反序列化为PodList对象?前面的代码比较简单,但是有一处引起了我的兴趣,如下图红框所示,result是corev1.PodList类型的结构体指针,restClient收到kubernetes返回的数据后,如何知道要将数据反序列化成corev1.PodList类型呢(Into方法入参类型为runtime.Object)?

之前的代码中有一行设置了编解码工具:config.NegotiatedSerializer = scheme.Codecs,展开这个scheme.Codecs,可见设置的时候确定了序列化工具为runtime.Serializer:

Serializer的typer字段类型是runtime.ObjectTyper,这里实际上是runtime.Scheme,因此ObjectTyper.ObjectKinds方法,实际上就是Scheme.ObjectKinds方法,在里面根据s.typeToGVK[t]拿到了GVK,也就是v1.PodList:

有了这个GVK就确定的返回数据的类型,最终调用caseSensitiveJSONIterator.Unmarshal(data, obj)完成byte数组到对象的反序列化操作:

最后还有一行关键代码,将data的内容写到最外层的Into方法的入参中:

源码分析完成,简单来说除了利用反射获取实际类型,还有就是Scheme内部维护的数据类型和GVK的关系映射表;至此,RESTClient的实战就完成了,希望本篇能帮助您打好基础,这样后面在体验其他三种客户端时已对其底层的实现原理了然于胸;你不孤单,欣宸原创一路相伴Java系列Spring系列Docker系列kubernetes系列数据库+中间件系列DevOps系列你不孤单,欣宸原创一路相伴Java系列Spring系列Docker系列kubernetes系列数据库+中间件系列DevOps系列www.bdsoba.comwww.awaedu.com

(0)

相关推荐

  • 完整的二进制安装Kubernetes高可用集群

    一.服务器配置环境 192.168.20.41 k8s-master 192.168.20.42 k8s-node1 192.168.20.43 k8s-node2 二.master节点上配置证书 1 ...

  • 016.Kubernetes二进制部署所有节点kube-proxy

    一部署 kube-proxy kube-proxy 运行在所有节点上,它监听 apiserver 中 service 和 endpoint 的变化情况,创建路由规则以提供服务 IP 和负载均衡功能. ...

  • 009.Kubernetes二进制部署kube-apiserver

    一部署master节点 1.1master节点服务 kubernetes master 节点运行如下组件: kube-apiserver kube-scheduler kube-controller- ...

  • 涨停实战十二招

    涨停板实战第一招:鱼跃龙门 涨停板实战第二招:高位洗散 涨停实战第三招:密集反弹 涨停实战第四招:极度收缩 涨停实战第五招:阶梯拉升 实战涨停第六招:柱量拉升 实战涨停第七招:拔高建仓 实战涨停第八招 ...

  • dubbo实战之二:与SpringBoot集成

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  • 高考数学导数临考冲刺实战:二模汇总江苏,...

    高考数学导数临考冲刺实战:二模汇总 江苏,广东,四川,湖南湖北- 每天至少从10套模考导数真题 刷完了,好的再与你分享,提前过滤,提高效率.限于个人局限,也希望有好的题,能够分享. 有一说一,几个大城 ...

  • 污水厂实战篇二---春节难消停(下)

    A污水厂,工艺为卡鲁赛尔2000型氧化沟和改良型氧化沟工艺,日处理水量为35000~40000吨,冬季的污泥浓度一直控制在25000~3000mg/L,日常三套卧螺式离心机24小时脱泥,每日脱出去的剩 ...

  • 污水厂实战篇二---春节难消停(上)

    中国人最看重的一年一度的春节随着正月十五的到来,中国人传统意义上的春节放假状态终于收尾了.在春节状态中,有中国人最传统的各种过年习俗,最重要的是中国人在春节前后的一个月里,是有一种观念上的一年到头终于 ...

  • 涨停板实战十二招图解

    2018-08-07拾荒网 编辑:裙摆飞扬

  • 抄底实战十二招#股票# #股票大势# #...

    抄底实战十二招#股票# #股票大势# #...

  • 实战教程二之快速排查前大灯不亮的故障

    一.快速排除 摩托车 前大灯不亮的故障 摩托车 前大灯不亮的主要原因是导线连接处松动.接触不良.短路.搭铁.断路和稳压器电压调整过高等.诊断时,常采用试灯法.搭铁试火法或电源短接法等. 当前大灯不亮时 ...

  • PythonGUI项目实战(二)主窗体的界面设计与实现

    https://m.toutiao.com/is/JWh9DXg/ 前言 上一节我们介绍了Python GUI项目实战(一)登录窗体的设计与实现,实现了该项目登录窗体的GUI的搭建,用户的账号和密码校 ...