使用client-go提供的客户端连接apiserver
k8s.io/client-go的代码目录:
rest
|
提供RESTClient客户端
|
restmapper
|
用于管理所有对象的信息
|
kubernetes
|
提供ClientSet客户端
|
dynamic
|
提供DynamicClient客户端
|
discovery
|
提供DiscoveryClient客户端
|
scale
|
提供ScaleClient客户端
|
tools
|
提供常用工具,如SharedInformer、Reflector、DealtFIFO、Indexer、events、leaderelection、clientcmd
|
informers
|
每种资源的informer实现
|
listers
|
为每种资源提供Lister功能
|
plugin/pkg/client/auth
|
提供OpenStack、GCP、Azure等云服务商授权插件
|
transport
|
提供安全的TCP连接,支持Http Stream
|
util
|
提供常用方法,如WorkQueue、Certificate证书管理
|
pkg
|
源码 |
metadata
|
元数据
|
examples
|
client-go的使用用例
|
client-go支持5种客户端对象与apiserver交互的方式,它们都是通过kubeconfig配置信息连接到指定的apiserver。
首先都要读取kubeconfig文件并实例化config对象:
config, err := clientcmd.BuildConfigFromFlags(
""
,
"/root/.kube/config"
)
//
第一个参数是apiserver地址,可省略
读取时是调用tools/clientcmd/api/loader.go中的Load函数读取配置文件。
不管是根据路径还是环境变量读取,最后都是LoadFromFile函数读取数据并把读取到的数据反序列化到Config对象中
RESTClient
RESTClient是最基础的客户端,其它客户端都是基于它实现的。RESTClient对HTTP Request(Go语言标准库net/http)进行了封装,实现了RESTful风格的API。
使用时需要指定Group、Version等信息以生成restClient对象:
config.APIPath= "api" //设置请求的HTTP路径 config.GroupVersion = &corev1.SchemeGroupVersion //设置请求的资源版本和资源组 config.NegotiatedSerializer = scheme.Codecs //设置config.NegotiatedSerializer数据的编解码器 restClient, err :=rest.RESTClientFor(config) //通过config对象实例化restClient对象
result := &corev1.PodList{} err = restClient.Get(). Namespace("cns-test"). Resource("pods"). VersionedParams(&metav1.ListOptions{Limit:500}, scheme.ParameterCodec). Do(context.TODO()). Into(result)
metav1.ListOptions结构体,用于存放list操作时的参数,如Limit表示最多检索多少条信息;同理也有metav1.GetOptions等 通过Do函数执行该请求,会调用rest/request.go的request函数,由r.URL.String生成实际请求的Restful URL
result是corev1.PodList结构体,用于存放结果。result.Items是[]Pod切片,可以遍历读取:
for _, d := range result.Items{ //读取d.Namespace、d.Name、d.Status.Phase等即可 }
ClientSet
ClientSet在RESTClient的基础上封装了对Resource和Version的管理方法。每一个Resource可以理解为一个客户端,而ClientSet则是多个客户端的集合,每一个Resource和Version都以函数的方式暴露给开发者。
生成clientset对象:
clientset, err := kubernetes.NewForConfig(config)
List所有Pod列表:
pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
请求core核心资源组的v1资源版本的Pod资源对象,其内部设置了APIPath请求的HTTP路径、GroupVersion请求的资源组、资源版本、NegotiatedSerializer数据的编解码器
Get一个Pod:
namespace := "xxxx" pod := "xxxx" _, err = clientset.CoreV1().Pods(namespace).Get(context.TODO(), pod, metav1.GetOptions{}) if errors.IsNotFound(err) { fmt.Printf("Pod %s in namespace %s not found\n", pod, namespace) } else if statusError, isStatus := err.(*errors.StatusError); isStatus { fmt.Printf("Error getting pod %s in namespace %s: %v\n", pod, namespace, statusError.ErrStatus.Message) } else if err != nil { panic(err.Error()) } else { fmt.Printf("Found pod %s in namespace %s\n", pod, namespace) }
DynamicClient
DynamicClient是一种动态客户端,它内部实现了Unstructured,用于处理非结构化数据结构(即无法提前预知数据结构)。它同样封装了RESTClient,同样提供了Create、Update、Delete、Get、List、Watch、Patch等方法。因此可以对任意Kubernetes资源进行RESTful操作,包括CRD自定义资源。
生成dynamicClient对象:
dynamicClient, err := dynamic.newForConfig(config)
处理过程将Resource(内置资源或自定义资源)转换成Unstructured结构类型(通过map[string]interface{}转换):
gvr := schema.GroupVersionResource{Version:"v1",Resource:"pods"} unstructObj, err := dynamicClient.Resource(gvr).Namespace(corev1.NamespaceDefault).List(context.TODO(),metav1.ListOptions{Limit:500})
FromUnstrucured函数将unstructured.UnstructuredList转换成PodList类型:
PodList := &corev1.PodList{} err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(),PodList)
DiscoveryClient
DiscoveryClient发现客户端,用于发现kube-apiserver所支持的资源组、资源版本、资源信息(即Group、Versions、Resources)。
通过RESTClient分别请求/api和/apis接口,从而获取Kubernetes API Server所支持的资源组、资源版本、资源信息
kubectl api-resources命令使用的就是DiscoveryClient
生成discoveryClient对象:
discoveryClient, err := discovery.NewDiscoveryClientForConfig(config) ServerGroupsAndResources返回APIResourceList(TypeMeta、GroupVersion、[]APIResource) _, APIResourceList, err := discoveryClient.ServerGroupsAndResources()
遍历APIResourceList获得资源信息:
for _, list := range APIResourceList{ gv, err := schema.ParseGroupVersion(list.GroupVersion) //把形如group/version的字符串转换成结构体 if err != nil{ panic(err) } for _, resource := range list.APIResources{ fmt.Println(resource.Name, ",", gv.Group, ",", gv.Version) } }
除了可以发现Kubernetes API Server所支持的资源组、资源版本、资源信息,还可以将这些信息存储到本地,用于本地缓存(Cache),以减轻对Kubernetes API Server访问的压力。
在运行Kubernetes组件的机器上,缓存信息默认存储于~/.kube/cache和~/.kube/http-cache下。
ScaleClient
用于扩缩容Deployment、ReplicaSet、Replication Controller等资源对象