带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理(七)-阿里云开发者社区

开发者社区> 人民邮电出版社> 正文

带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理(七)

简介: 带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理
+关注继续查看

4. DiscoveryClient

 

RESTClient、DynamicClient、DiscoveryClient 都是面向资源对象的(例如,Deployment、PodCRD,而DiscoveryClient则聚焦资源,用于查看当前Kubernetes集群支持哪些资源组(Group、资源版本(Version)、资源信息(Resource)。

DiscoveryClient代码示例见代码清单2-23。

packagemain

 

import(

"fmt"

 

"k8s.io/apimachinery/pkg/runtime/schema""k8s.io/client-go/discovery""k8s.io/client-go/tools/clientcmd"

)

 

funcmain(){

//加载 kubeconfig⽂件,⽣成 config对象

config,err:=clientcmd.BuildConfigFromFlags("","/root/.kube/config")

iferr!=nil{

panic(err)

}

//通过 config实例化 DiscoveryClient对象

discoveryClient,err:=discovery.NewDiscoveryClientForConfig(config)

iferr!=nil{

panic(err)

}

//返回  KubernetesAPIServer所⽀持的资源组、资源版本和资源信息

_,APIResourceList,err:=discoveryClient.ServerGroupsAndResources()iferr!=nil{

panic(err)

}

//输出所有资源信息

for_,list:=rangeAPIResourceList{

gv,err:=schema.ParseGroupVersion(list.GroupVersion)iferr!=nil{

panic(err)

}

for_,resource:=rangelist.APIResources{

fmt.Printf("NAME:%v,GROUP:%v,VERSION:%v\n",resource.

Name,gv.Group,gv.Version)

}

}


}

 

运行以上代码会获得 KubernetesAPIServer支持的 GVR 等相关信息,部分信息打印


 

输出见代码清单 2-24。

运⾏输出

NAME:bindings,GROUP:,VERSION:v1

NAME:componentstatuses,GROUP:,VERSION:v1

NAME:configmaps,GROUP:,VERSION:v1

...

 

DiscoveryClient发起请求的过程见代码清单 2-25。

NewDiscoveryClientForConfig获取客户端对象,其中 DiscoveryClient中封装了REST-Client类型的客户端, 且赋值 LegacyPrefix为 /api, 该变量在之后请求KubernetesAPIServer时会被用到。

funcNewDiscoveryClientForConfig(c*restclient.Config)(*DiscoveryClient,error){

//...

client,err:=restclient.UnversionedRESTClientFor(&config)

return&DiscoveryClient{restClient:client,LegacyPrefix:"/api"},err

}

 

ServerGroupsAndResources方法中会调用 ServerGroupsAndResources函数,该函数主要关注ServerGroups方法和fetchGroupVersionResources函数(见代码清单2-26)。

funcServerGroupsAndResources(dDiscoveryInterface)([]*metav1.APIGroup,[]*metav1.APIResourceList,error){

sgs,err:=d.ServerGroups()

//...

 

groupVersionResources,failedGroups:=fetchGroupVersionResources(d,sgs)

 

//...

}

 

ServerGroups方法通过 RESTClient来访问 KubernetesAPIServer的 /api接口

(d.LegacyPrefix/apis接口,获得其所支持的Group和Version信息(见代码清单2-27)。

func(d*DiscoveryClient)ServerGroups()(apiGroupList*metav1.APIGroupList,errerror){

//GetthegroupVersionsexposedat/api

v:=&metav1.APIVersions{}

err=d.restClient.Get().AbsPath(d.LegacyPrefix).Do(context.TODO()).Into(v)

 

//...

 

//GetthegroupVersionsexposedat/apisapiGroupList=&metav1.APIGroupList{}

err=d.restClient.Get().AbsPath("/apis").Do(context.TODO()).Into(apiGroupList)

 

//...


}

 

fetchGroupVersionResources函数调用 ServerResourcesForGroupVersion   方法,同样通过 RESTClient获取特定 Group和 Version中所包含的所有 Resource(见代码清单2-28)。

func(d*DiscoveryClient)ServerResourcesForGroupVersion(groupVersionstring)

(resources*metav1.APIResourceList,errerror){

//...

iflen(d.LegacyPrefix)>0&&groupVersion=="v1"{url.Path=d.LegacyPrefix+"/"+groupVersion

}else{

url.Path="/apis/"+groupVersion

}

resources=&metav1.APIResourceList{GroupVersion:groupVersion,

}

err=d.restClient.Get().AbsPath(url.String()).Do(context.TODO()).Into(resources)

 

//...}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
NLP之TopicModel:朴素贝叶斯NB的先验概率之Dirichlet分布的应用
NLP之TopicModel:朴素贝叶斯NB的先验概率之Dirichlet分布的应用
11 0
阿里巴巴的云原生与开发者 | 10月15号栖夜读
今天的首篇文章,讲述了 : 利用云原生技术构建应用简便快捷,部署应用轻松自如,运行应用按需伸缩。如今,云原生已经成为下一代技术发展的趋势。在 2019 杭州云栖大会开发者峰会上,阿里巴巴资深技术专家李响就为大家分享了阿里巴巴的云原生技术与开发者的那些故事。
2880 0
KubeMeet 杭州站报名:「云原生应用管理」开发者专场来啦!
4月17日杭州,云原生基金会CNCF和阿里巴巴联合主办的「KubeMeet 开发者沙龙·云原生应用管理专场」来啦!这里有Kubernetes 生态开发者都在关注的开源项目,以及阿里巴巴、携程、第四范式的一线云原生落地实践。赶紧报名吧!
781 0
Apache HttpClient 4.3开发指南
《Apache HttpClient 4.3开发指南》 一、概述 Apache HttpClient 4系列已经发布很久了,但由于它与HttpClient 3.x版本完全不兼容,以至于业内采用此库的公司较少,在互联网上也少有相关的文档资料分享。
862 0
472
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载