client-go实战之二:RESTClient
歡迎訪問我的GitHub
這里分類和匯總了欣宸的全部原創(chuàng)(含配套源碼):https://github.com/zq2599/blog_demos
系列文章鏈接
本篇概覽
- 本文是《client-go實(shí)戰(zhàn)》系列的第二篇,前文咱們提到過client-go一共有四種客戶端:RESTClient、ClientSet、DynamicClient、DiscoveryClient,而RESTClient是最基礎(chǔ)的版本,其他三種都是基于RESTClient封裝的,今天咱們通過實(shí)戰(zhàn)編碼來學(xué)習(xí)RESTClient,熟悉最基礎(chǔ)的遠(yuǎn)程操作步驟;
- 本篇由以下幾部分組成:
RESTClient簡介
- RESTClient是client-go最基礎(chǔ)的客戶端,主要是對(duì)HTTP Reqeust進(jìn)行了封裝,對(duì)外提供RESTful風(fēng)格的API,并且提供豐富的API用于各種設(shè)置,相比其他幾種客戶端雖然更復(fù)雜,但是也更為靈活;
- 使用RESTClient對(duì)kubernetes的資源進(jìn)行增刪改查的基本步驟如下:
- 接下來的編碼實(shí)戰(zhàn)也是按照上述流程進(jìn)行的;
實(shí)戰(zhàn)內(nèi)容
- 本次實(shí)戰(zhàn)內(nèi)容很簡單:查詢kube-system這個(gè)namespace下的所有pod,然后在控制臺(tái)打印每個(gè)pod的幾個(gè)關(guān)鍵字段;
- 感謝您耐心聽我啰嗦了一大堆,接下來開始實(shí)戰(zhàn)吧;
源碼下載
- 本篇實(shí)戰(zhàn)中的源碼可在GitHub下載到,地址和鏈接信息如下表所示(https://github.com/zq2599/blog_demos):
| 項(xiàng)目主頁 | https://github.com/zq2599/blog_demos | 該項(xiàng)目在GitHub上的主頁 |
| git倉庫地址(https) | https://github.com/zq2599/blog_demos.git | 該項(xiàng)目源碼的倉庫地址,https協(xié)議 |
| git倉庫地址(ssh) | git@github.com:zq2599/blog_demos.git | 該項(xiàng)目源碼的倉庫地址,ssh協(xié)議 |
- 這個(gè)git項(xiàng)目中有多個(gè)文件夾,client-go相關(guān)的應(yīng)用在client-go-tutorials文件夾下,如下圖紅框所示:
- client-go-tutorials文件夾下有多個(gè)子文件夾,本篇對(duì)應(yīng)的源碼在restclientdemo目錄下,如下圖紅框所示:
查看官方文檔,獲取編碼所需內(nèi)容
- 瀏覽器打開官方API文檔,地址:https://v1-19.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/
- 找到pod的API文檔,如下圖,確定了path和namespace參數(shù):
- 然后還要關(guān)注響應(yīng)的數(shù)據(jù)結(jié)構(gòu),如下圖紅框,返回的是:
- 點(diǎn)擊上圖紅框中的內(nèi)容,可見PodList的詳情,這就是我們編碼時(shí)所需的數(shù)據(jù)結(jié)構(gòu):
- 掌握了請(qǐng)求和響應(yīng)的詳細(xì)信息,可以開始編碼了;
編碼
- 新建文件夾restclientdemo,在里面執(zhí)行以下命令,新建module:
- 添加k8s.io/api和k8s.io/client-go這兩個(gè)依賴,注意版本要匹配kubernetes環(huán)境:
- 新建main.go,內(nèi)容如下,已經(jīng)都添加了詳細(xì)的注釋,就不贅述了:
- 編碼完成,執(zhí)行go run main.go,即可獲取指定namespace下所有pod的信息,控制臺(tái)輸出如下:
- 至此,RESTClient客戶端從編碼到驗(yàn)證都完成了;
如何將收到的數(shù)據(jù)反序列化為PodList對(duì)象?
-
前面的代碼比較簡單,但是有一處引起了我的興趣,如下圖紅框所示,result是corev1.PodList類型的結(jié)構(gòu)體指針,restClient收到kubernetes返回的數(shù)據(jù)后,如何知道要將數(shù)據(jù)反序列化成corev1.PodList類型呢(Into方法入?yún)㈩愋蜑閞untime.Object)?
-
之前的代碼中有一行設(shè)置了編解碼工具:config.NegotiatedSerializer = scheme.Codecs,展開這個(gè)scheme.Codecs,可見設(shè)置的時(shí)候確定了序列化工具為runtime.Serializer:
-
Serializer的typer字段類型是runtime.ObjectTyper,這里實(shí)際上是runtime.Scheme,因此ObjectTyper.ObjectKinds方法,實(shí)際上就是Scheme.ObjectKinds方法,在里面根據(jù)s.typeToGVK[t]拿到了GVK,也就是v1.PodList:
-
有了這個(gè)GVK就確定的返回?cái)?shù)據(jù)的類型,最終調(diào)用caseSensitiveJSONIterator.Unmarshal(data, obj)完成byte數(shù)組到對(duì)象的反序列化操作:
-
最后還有一行關(guān)鍵代碼,將data的內(nèi)容寫到最外層的Into方法的入?yún)⒅?#xff1a;
-
源碼分析完成,簡單來說除了利用反射獲取實(shí)際類型,還有就是Scheme內(nèi)部維護(hù)的數(shù)據(jù)類型和GVK的關(guān)系映射表;
-
至此,RESTClient的實(shí)戰(zhàn)就完成了,希望本篇能幫助您打好基礎(chǔ),這樣后面在體驗(yàn)其他三種客戶端時(shí)已對(duì)其底層的實(shí)現(xiàn)原理了然于胸;
你不孤單,欣宸原創(chuàng)一路相伴
歡迎關(guān)注公眾號(hào):程序員欣宸
微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢游Java世界…
總結(jié)
以上是生活随笔為你收集整理的client-go实战之二:RESTClient的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: A. Captain Flint and
- 下一篇: 2.2、云计算FusionCompute