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

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

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

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

(4)  具体处理 WorkerQueue中对象的流程,见代码清单 2-57

func(c*Controller)runWorker(){

//启动⽆限循环,接收并处理消息

forc.processNextItem(){

}

}

//Workqueue中获取对象,并打印信息。

func(c*Controller)processNextItem()bool{key,shutdown:=c.queue.Get()

//退出

ifshutdown{

returnfalse

}

//标记此Key已经处理

deferc.queue.Done(key)

//打印Key对应的Object的信息

err:=c.syncToStdout(key.(string))c.handleError(err,key)

returntrue

}

 

//获取Key对应的Object,并打印相关信息

func(c*Controller)syncToStdout(keystring)error{obj,exists,err:=c.indexer.GetByKey(key)

iferr!=nil{

klog.Errorf("Fetchingobjectwithkey%sfromstorefailedwith%v",key,err)

returnerr

}

if!exists{

fmt.Printf("Pod%sdoesnotexistanymore\n",key)

}else{

fmt.Printf("Sync/Add/UpdateforPod%s\n",obj.(*core_v1.Pod).

GetName())

}


 

returnnil


}

 

(5)  Main 函数逻辑,见代码清单2-58

funcmain(){

varkubeconfigstring

varmasterstring

//从外部获取集群信息 (kube.config)

flag.StringVar(&kubeconfig,"kubeconfig","","kubeconfigfile")

//获取集群masterurl

flag.StringVar(&master,"master","","masterurl")

//读取构建 config

config,err:=clientcmd.BuildConfigFromFlags(master,kubeconfig)

iferr!=nil{

klog.Fatal(err)

}

//创建k8sClient

clientset,err:=kubernetes.NewForConfig(config)

iferr!=nil{

klog.Fatal(err)

}

//从指定的客户端、资源、命名空间和字段选择器创建⼀个新的List-Watch

podListWatcher := cache.NewListWatchFromClient(clientset.CoreV1().RESTClient(),"pods",v1.NamespaceDefault,fields.Everything())

//构造⼀个具有速率限制排队功能的新的Workqueue

queue:=workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter())

//创建IndexerInformer

indexer,informer:=cache.NewIndexerInformer(podListWatcher,&v1.Pod{},

0,cache.ResourceEventHandlerFuncs{

//当有Pod创建时,根据DeltaQueue弹出的Object⽣成对应的Key,并加⼊Workqueue中。此处可以根据Object的⼀些属性进⾏过滤

AddFunc:func(objinterface{}){

key,err:=cache.MetaNamespaceKeyFunc(new)

iferr==nil{queue.Add(key)

}

},

//Pod删除操作

DeleteFunc:func(objinterface{}){

//在⽣成Key之前检查对象。因为资源删除后有可能会进⾏重建等操作,如果监听时错过了删除信息,会导致该条记录是陈旧的

key,err:=cache.DeletionHandlingMetaNamespaceKeyFunc(obj)


 

 

iferr==nil{queue.Add(key)

}

},

},cache.Indexers{})

//创建新的Controller

controller:=NewController(queue,indexer,informer)stop:=make(chanstruct{})

deferclose(stop)

//启动 Controller

gocontroller.Run(1,stop)select{}

}

 

至此一个简单的Controller就完成了,然后我们从已有的k8s环境中复制Config文件,将 Config文件存放在/root/.kube/目录下,配置运行代码,运行结果见代码清单 2-59。

I031215:46:38.849495     25524main.go:125]StartingPodcontrollerSync/Add/UpdateforPodcurl-666-6f68d49784-r2gln

Sync/Add/UpdateforPodbusybox

Poddefault/mypoddoesnotexistanymore

 

结果显示:程序启动了一个 PodController,Controller监听到在 Default命名空间下有两个 Pod:busybox和 curl-666-6f68d49784-r2gln,缓存中的 mypod已经不存在了。

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

相关文章
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
7272 0
阿里巴巴的云原生与开发者 | 10月15号栖夜读
今天的首篇文章,讲述了 : 利用云原生技术构建应用简便快捷,部署应用轻松自如,运行应用按需伸缩。如今,云原生已经成为下一代技术发展的趋势。在 2019 杭州云栖大会开发者峰会上,阿里巴巴资深技术专家李响就为大家分享了阿里巴巴的云原生技术与开发者的那些故事。
2883 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
8104 0
extjs desktop 应用项目:教学资源库云平台
采用extjs desktop  界面截图网址: http://www.linbsoft.com/LinBSoft/zykpreview/ demo网址: http://demo.
950 0
Elasticsearch Top5典型应用场景
题记 刚接触Elasticsearch的朋友,或多或少会遇到一个问题,Elasticsearch在实际公司应用中除了搜索到底能做什么? 本文给出了答案。 除了“You Know, for Search”,Elasticsearch的使用会不断增长和变化。ObjectRocket作为一家托管云计算公司,已经在ObjectRocket平台上提供托管Elasticsearch一段时间了,并且能够看到我们客户之间的一些明确趋势以及他们如何使用该产品。以下是我们在平台上看到的Top5场景用例:
13 0
Apache HttpClient 4.3开发指南
《Apache HttpClient 4.3开发指南》 一、概述 Apache HttpClient 4系列已经发布很久了,但由于它与HttpClient 3.x版本完全不兼容,以至于业内采用此库的公司较少,在互联网上也少有相关的文档资料分享。
862 0
【云开发小课】云原生体系下Serverless弹性探索与实践
篇内容分享了云开发小课的云原生体系下serverless弹性探索与实践。
111 0
472
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载