目录

Client-go简单教程(七)-DiscoveryClient

DiscoveryClient 关注于发现资源,例如查看当前集群里面注册了哪些资源各个资源的版本信息等.

DiscoveryClient 简介

之前学习的 ClientSetDynamicClient 都是面向资源对象的(例如创建 Deployment 实例、查看 pod 实例),而 DiscoveryClient 则不同,它聚焦的是资源,例如查看当前 kubernetes 有哪些 GroupVersionResource

DiscoveryClient 也封装了 restClient 并由它来真正地与 kube-apiserver 进行交互。

DiscoveryClient 编码

使用方式基本与静态客户端和动态客户端类似,我们来看一个使用 DiscoveryClient 的例子

新建main.go,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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是家目录,如果能取得家目录的值,就可以用来做默认值
	if home:=homedir.HomeDir(); home != "" {
		// 如果输入了kubeconfig参数,该参数的值就是kubeconfig文件的绝对路径,
		// 如果没有输入kubeconfig参数,就用默认路径~/.kube/config
		kubeconfig = 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())
	}

	// 新建discoveryClient实例
	discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)

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

	// 获取所有分组和资源数据
	APIGroup, APIResourceListSlice, err := discoveryClient.ServerGroupsAndResources()

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

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

	// APIResourceListSlice是个切片,里面的每个元素代表一个GroupVersion及其资源
	for _, singleAPIResourceList := range APIResourceListSlice {

		// GroupVersion是个字符串,例如"apps/v1"
		groupVerionStr := singleAPIResourceList.GroupVersion

		// ParseGroupVersion方法将字符串转成数据结构
		gv, err := schema.ParseGroupVersion(groupVerionStr)

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

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

		// APIResources字段是个切片,里面是当前GroupVersion下的所有资源
		for _, singleAPIResource := range singleAPIResourceList.APIResources {
			fmt.Printf("resources : %v\n", singleAPIResource.Name)
		}
	}
}

编码完成,执行go run main.go,所有资源都被打印出来了,控制台部分输出如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ go run main.go
...
GV string [apiregistration.k8s.io/v1]
GV struct [schema.GroupVersion{Group:"apiregistration.k8s.io", Version:"v1"}]
resources :

apiservices
apiservices/status
*****************************************************************
GV string [apiregistration.k8s.io/v1beta1]
GV struct [schema.GroupVersion{Group:"apiregistration.k8s.io", Version:"v1beta1"}]
resources :

apiservices
apiservices/status
*****************************************************************
GV string [apps/v1]
GV struct [schema.GroupVersion{Group:"apps", Version:"v1"}]
resources :

controllerrevisions
daemonsets
daemonsets/status
deployments
deployments/scale
...
注意
需要说明的是,kubectl api-resourceskubectl api-versions 命令正是使用 DiscoveryClient 来发现集群中的资源以及分组版本信息。

至此,DiscoveryClient 客户端介绍完毕。