一、K8S四种client简单介绍

client-go支持RESTClient、ClientSet、DynamicClient、DiscoveryClient四种客户端与Kubernetes Api Server进行交互

RESTClient客户端

restclient客户端为其他客户端的父类

kubernetes 注册到 nacos kubernetes client_自定义

RESTClient案例

clientcmd.BuildConfigFromFlags的返回值config可以进行一些处理

// 从本机加载kubeconfig配置文件,因此第一个参数为空字符串
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)

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

// 参考path : /api/v1/namespaces/{namespace}/pods
config.APIPath = "api"
// pod的group是空字符串
config.GroupVersion = &corev1.SchemeGroupVersion
// 指定序列化工具
config.NegotiatedSerializer = scheme.Codecs

// 根据配置信息构建restClient实例
restClient, err := rest.RESTClientFor(config)
if err!=nil {
	panic(err.Error())
}

// 保存pod结果的数据结构实例
result := &corev1.PodList{}

//  指定namespace
namespace := "kube-system"
// 设置请求参数,然后发起请求
// GET请求
err = restClient.Get().
//  指定namespace,参考path : /api/v1/namespaces/{namespace}/pods
	Namespace(namespace).
// 查找多个pod,参考path : /api/v1/namespaces/{namespace}/pods
	Resource("pods").
		// 指定大小限制和序列化工具
	VersionedParams(&metav1.ListOptions{Limit:100}, scheme.ParameterCodec).
	// 请求
	Do(context.TODO()).
	// 结果存入result
	Into(result)

ClientSet客户端

ClientSet是在RESTClient的基础上封装了对Resource和Version的管理方法。每一个Resource可以理解为一个客户端,而ClientSet是多个客户端的集合,每一个Resource和

Version都以函数的方式暴露出来。ClientSer仅能访问Kubernetes自身内置的资源,不能直接访问CRD自定义的资源

DynamicClient客户端

DynamicClient是一个动态客户端,可以对任意Kubernetes资源进行RESTFful操作,包括CRD自定义资源。DynamicClient与ClientSet操作类似,同样是封装了RESTClient。

DiscoveryClient客户端

DiscoveryClient是发现客户端,主要用于发现Kubernetes API Server所支持的资源组、资源版本、资源信息。除此之外,还可以将这些信息存储到本地,用户本地缓存,以减轻对Kubernetes API Server访问的压力。

kubectl的api-versions和api-resources命令输出也是通过DiscoversyClient实现的