client-go实战之二:RESTClient
欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
系列文章链接
本篇概览
- 本文是《client-go实战》系列的第二篇,前文咱们提到过client-go一共有四种客户端:RESTClient、ClientSet、DynamicClient、DiscoveryClient,而RESTClient是最基础的版本,其他三种都是基于RESTClient封装的,今天咱们通过实战编码来学习RESTClient,熟悉最基础的远程操作步骤;
- 本篇由以下几部分组成:
RESTClient简介
- RESTClient是client-go最基础的客户端,主要是对HTTP Reqeust进行了封装,对外提供RESTful风格的API,并且提供丰富的API用于各种设置,相比其他几种客户端虽然更复杂,但是也更为灵活;
- 使用RESTClient对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:
- 添加k8s.io/api和k8s.io/client-go这两个依赖,注意版本要匹配kubernetes环境:
- 新建main.go,内容如下,已经都添加了详细的注释,就不赘述了:
- 编码完成,执行go run main.go,即可获取指定namespace下所有pod的信息,控制台输出如下:
- 至此,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世界…
总结
以上是生活随笔为你收集整理的client-go实战之二:RESTClient的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: A. Captain Flint and
- 下一篇: 2.2、云计算FusionCompute