client-go實(shí)戰(zhàn)之五:DiscoveryClient

歡迎訪問(wèn)我的GitHub

https://github.com/zq2599/blog_demos

內(nèi)容:所有原創(chuàng)文章分類(lèi)匯總及配套源碼,涉及Java弧腥、Docker醒叁、Kubernetes洒忧、DevOPS等漩绵;

關(guān)于DiscoveryClient

  • 本文是《client-go實(shí)戰(zhàn)》系列的第五篇鼻由,主角是最后一種客戶端:DiscoveryClient寇仓,咱們之前學(xué)習(xí)的Clientset和dynamicClient都是面向資源對(duì)象的(例如創(chuàng)建deployment實(shí)例你雌、查看pod實(shí)例)器联,而DiscoveryClient則不同,它聚焦的是資源,例如查看當(dāng)前kubernetes有哪些Group拨拓、Version肴颊、Resource,下面是DiscoveryClient數(shù)據(jù)結(jié)構(gòu)的字段和關(guān)聯(lián)方法千元,再次看到了熟悉的restClient字段苫昌,還有一眾方法皆是與Group、Version幸海、Resource有關(guān):
在這里插入圖片描述
  • 從上圖可見(jiàn)祟身,DiscoveryClient數(shù)據(jù)結(jié)構(gòu)有兩個(gè)字段:restClient和LegacyPrefix,這個(gè)<font color="blue">LegacyPrefix</font>是啥呢物独?去看看新建DiscoveryClient實(shí)例的方法袜硫,如下圖紅框,原來(lái)是個(gè)固定字符串<font color="red">/api</font>挡篓,看起來(lái)像是url中的一部分:
在這里插入圖片描述
  • 挑一個(gè)DiscoveryClient的關(guān)聯(lián)方法看看婉陷,如下圖紅框,果然官研,LegacyPrefix就是url中的一部分:
在這里插入圖片描述
  • 相比其他幾個(gè)客戶端秽澳,DiscoveryClient要更簡(jiǎn)單一些,干脆直接實(shí)戰(zhàn)吧戏羽!

需求確認(rèn)

  • 本次實(shí)戰(zhàn)的需求很簡(jiǎn)單:從kubernetes查詢所有的Group担神、Version、Resource信息始花,在控制臺(tái)打印出來(lái)妄讯;

源碼下載

名稱 鏈接 備注
項(xiàng)目主頁(yè) https://github.com/zq2599/blog_demos 該項(xiàng)目在GitHub上的主頁(yè)
git倉(cāng)庫(kù)地址(https) https://github.com/zq2599/blog_demos.git 該項(xiàng)目源碼的倉(cāng)庫(kù)地址酷宵,https協(xié)議
git倉(cāng)庫(kù)地址(ssh) git@github.com:zq2599/blog_demos.git 該項(xiàng)目源碼的倉(cāng)庫(kù)地址亥贸,ssh協(xié)議
  • 這個(gè)git項(xiàng)目中有多個(gè)文件夾,client-go相關(guān)的應(yīng)用在<font color="blue">client-go-tutorials</font>文件夾下浇垦,如下圖紅框所示:
在這里插入圖片描述
  • client-go-tutorials文件夾下有多個(gè)子文件夾炕置,本篇對(duì)應(yīng)的源碼在<font color="blue">discoveryclientdemo</font>目錄下,如下圖紅框所示:
在這里插入圖片描述

編碼

  • 新建文件夾discoveryclientdemo男韧,在里面執(zhí)行以下命令朴摊,新建module:
go mod init discoveryclientdemo
  • 添加k8s.io/api和k8s.io/client-go這兩個(gè)依賴,注意版本要匹配kubernetes環(huán)境:
go get k8s.io/api@v0.20.0
go get k8s.io/client-go@v0.20.0
  • 新建main.go煌抒,內(nèi)容如下仍劈,內(nèi)部已有詳細(xì)注釋?zhuān)攸c(diǎn)關(guān)注的是ServerGroupsAndResources方法的第二個(gè)返回值厕倍,它的數(shù)據(jù)結(jié)構(gòu)中有切片寡壮,切片的每個(gè)元素里面又有切片,這才是每個(gè)資源的信息:
package main

import (
    "flag"
    "fmt"
    "k8s.io/apimachinery/pkg/runtime/schema"
    "k8s.io/client-go/discovery"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
    "path/filepath"
)

func main() {

    var kubeconfig *string

    // home是家目錄,如果能取得家目錄的值况既,就可以用來(lái)做默認(rèn)值
    if home:=homedir.HomeDir(); home != "" {
        // 如果輸入了kubeconfig參數(shù)这溅,該參數(shù)的值就是kubeconfig文件的絕對(duì)路徑,
        // 如果沒(méi)有輸入kubeconfig參數(shù)棒仍,就用默認(rèn)路徑~/.kube/config
        kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
    } else {
        // 如果取不到當(dāng)前用戶的家目錄悲靴,就沒(méi)辦法設(shè)置kubeconfig的默認(rèn)目錄了,只能從入?yún)⒅腥?        kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
    }

    flag.Parse()

    // 從本機(jī)加載kubeconfig配置文件莫其,因此第一個(gè)參數(shù)為空字符串
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)

    // kubeconfig加載失敗就直接退出了
    if err != nil {
        panic(err.Error())
    }

    // 新建discoveryClient實(shí)例
    discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)

    if err != nil {
        panic(err.Error())
    }

    // 獲取所有分組和資源數(shù)據(jù)
    APIGroup, APIResourceListSlice, err := discoveryClient.ServerGroupsAndResources()

    if err != nil {
        panic(err.Error())
    }

    // 先看Group信息
    fmt.Printf("APIGroup :\n\n %v\n\n\n\n",APIGroup)

    // APIResourceListSlice是個(gè)切片癞尚,里面的每個(gè)元素代表一個(gè)GroupVersion及其資源
    for _, singleAPIResourceList := range APIResourceListSlice {

        // GroupVersion是個(gè)字符串,例如"apps/v1"
        groupVerionStr := singleAPIResourceList.GroupVersion

        // ParseGroupVersion方法將字符串轉(zhuǎn)成數(shù)據(jù)結(jié)構(gòu)
        gv, err := schema.ParseGroupVersion(groupVerionStr)

        if err != nil {
            panic(err.Error())
        }

        fmt.Println("*****************************************************************")
        fmt.Printf("GV string [%v]\nGV struct [%#v]\nresources :\n\n", groupVerionStr, gv)

        // APIResources字段是個(gè)切片乱陡,里面是當(dāng)前GroupVersion下的所有資源
        for _, singleAPIResource := range singleAPIResourceList.APIResources {
            fmt.Printf("%v\n", singleAPIResource.Name)
        }
    }
}
  • 執(zhí)行<font color="blue">go run main.go</font>浇揩,截取部分執(zhí)行結(jié)果如下,所有資源都被打印出來(lái)了:
...
*****************************************************************
GV string [discovery.k8s.io/v1beta1]
GV struct [schema.GroupVersion{Group:"discovery.k8s.io", Version:"v1beta1"}]
resources :

endpointslices
*****************************************************************
GV string [flowcontrol.apiserver.k8s.io/v1beta1]
GV struct [schema.GroupVersion{Group:"flowcontrol.apiserver.k8s.io", Version:"v1beta1"}]
resources :

flowschemas
flowschemas/status
prioritylevelconfigurations
prioritylevelconfigurations/status
  • 以上就是DiscoveryClient的基本用法憨颠,您是否覺(jué)得這樣的實(shí)戰(zhàn)太easy了胳徽,那咱們就來(lái)個(gè)延伸閱讀,看看DiscoveryClient的周邊場(chǎng)景爽彤;

kubectl中如何使用DiscoveryClient

  • <font color="blue">kubectl api-versions</font>命令养盗,大家應(yīng)該不陌生吧,可以返回當(dāng)前kubernetes環(huán)境的所有Group+Version的組合适篙,如下:
zhaoqin@zhaoqindeMBP-2 discoveryclientdemo % kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
...
  • 通過(guò)查看kubectl源碼可見(jiàn)往核,上述命令的背后就是使用了DiscoveryClient來(lái)實(shí)現(xiàn)的,如下圖紅框所示:
在這里插入圖片描述
  • 還有一處沒(méi)有明確:上圖紅框2中的o.discoveryClient究竟是不是DiscoveryClient呢匙瘪?雖然名字很像铆铆,但還是瞅一眼才放心,結(jié)果這一瞅有了新發(fā)現(xiàn)丹喻,如下所示薄货,discoveryClient的數(shù)據(jù)結(jié)構(gòu)是<font color="blue">CachedDiscoveryInterface</font>:
type APIVersionsOptions struct {
    discoveryClient discovery.CachedDiscoveryInterface

    genericclioptions.IOStreams
}
  • 從名稱CachedDiscoveryInterface來(lái)看,kubectl對(duì)GVR數(shù)據(jù)是做了本地緩存的碍论,想想也是谅猾,GVR不經(jīng)常變化,沒(méi)必要每次都去API Server拉取鳍悠,關(guān)于緩存的細(xì)節(jié)請(qǐng)參考:staging/src/k8s.io/client-go/discovery/cached/disk/cached_discovery.go 税娜,這里就不展開(kāi)了;

  • 至此藏研,client-go的四種客戶端工具實(shí)戰(zhàn)以及相關(guān)源碼的淺層次分析就全部完成了敬矩,在您做client-go開(kāi)發(fā)的時(shí)候,希望這些內(nèi)容能給您提供一些參考蠢挡;

你不孤單弧岳,欣宸原創(chuàng)一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 數(shù)據(jù)庫(kù)+中間件系列
  6. DevOps系列

歡迎關(guān)注公眾號(hào):程序員欣宸

微信搜索「程序員欣宸」凳忙,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末禽炬,一起剝皮案震驚了整個(gè)濱河市涧卵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腹尖,老刑警劉巖柳恐,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異热幔,居然都是意外死亡乐设,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)绎巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伤提,“玉大人,你說(shuō)我怎么就攤上這事认烁≈啄校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵却嗡,是天一觀的道長(zhǎng)舶沛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窗价,這世上最難降的妖魔是什么如庭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮撼港,結(jié)果婚禮上坪它,老公的妹妹穿的比我還像新娘。我一直安慰自己帝牡,他們只是感情好往毡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著靶溜,像睡著了一般开瞭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罩息,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天嗤详,我揣著相機(jī)與錄音,去河邊找鬼瓷炮。 笑死葱色,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娘香。 我是一名探鬼主播苍狰,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恐锣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了舞痰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诀姚,失蹤者是張志新(化名)和其女友劉穎响牛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赫段,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呀打,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糯笙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贬丛。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖给涕,靈堂內(nèi)的尸體忽然破棺而出豺憔,到底是詐尸還是另有隱情,我是刑警寧澤够庙,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布恭应,位于F島的核電站,受9級(jí)特大地震影響耘眨,放射性物質(zhì)發(fā)生泄漏昼榛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一剔难、第九天 我趴在偏房一處隱蔽的房頂上張望胆屿。 院中可真熱鬧,春花似錦偶宫、人聲如沸非迹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)彻秆。三九已至,卻和暖如春结闸,著一層夾襖步出監(jiān)牢的瞬間唇兑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工桦锄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扎附,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓结耀,卻偏偏與公主長(zhǎng)得像留夜,于是被迫代替她去往敵國(guó)和親匙铡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容