歡迎訪問(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)妄讯;
源碼下載
- 本篇實(shí)戰(zhàn)中的源碼可在GitHub下載到,地址和鏈接信息如下表所示(https://github.com/zq2599/blog_demos):
名稱 | 鏈接 | 備注 |
---|---|---|
項(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)一路相伴
歡迎關(guān)注公眾號(hào):程序員欣宸
微信搜索「程序員欣宸」凳忙,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos