ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用client-go提供的客户端连接apiserver

2022-02-23 10:03:17  阅读:243  来源: 互联网

标签:Resource err namespace apiserver client go config 资源 客户端


 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)}

ClientSet内部的数据都是结构化数据(即已知数据结构),已经预先实现每种Resource和Version的操作,因此只能够处理Kubernetes内置资源(即Client集合内的资源),要访问CRD需要通过client-gen代码生成器自动生成CRD操作相关的接口。

 

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)

注意:DynamicClient不是类型安全的,因此在访问CRD自定义资源时需要特别注意。例如,在操作指针不当的情况下可能会导致程序崩溃。

 

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等资源对象

标签:Resource,err,namespace,apiserver,client,go,config,资源,客户端
来源: https://www.cnblogs.com/cheyunhua/p/15925978.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有