摘要:并且由外部控制器負(fù)責(zé)將資源轉(zhuǎn)移到這一狀態(tài)。在最后一個(gè)參數(shù),我們傳遞了個(gè)回調(diào)函數(shù)和。這些回調(diào)函數(shù)具有實(shí)際的邏輯,并且在節(jié)點(diǎn)上的鏡像占用存儲(chǔ)發(fā)生改變時(shí)觸發(fā)。一旦啟動(dòng),將會(huì)開始對(duì)和的監(jiān)控,并且調(diào)用回調(diào)函數(shù)。
Rancher Labs首席軟件工程師Alena Prokharchyk受邀在2017年12月6-8日的CNCF主辦的Kubernetes領(lǐng)域頂級(jí)盛會(huì)KubeCon + CloudNativeCon 2017北美峰會(huì)上進(jìn)行演講,本文由演講內(nèi)容整理而成。
隨著Kubernetes越來越受歡迎,圍繞它的集成和監(jiān)控服務(wù)的數(shù)量也在不斷增長(zhǎng)。Golang編寫的所有此類服務(wù)的關(guān)鍵組件是kubernetes / client-go——一個(gè)用于與Kubernetes集群API通信的軟件包。在本文中,我們將討論client-go使用的基本知識(shí),以及如何為開發(fā)人員節(jié)約編寫實(shí)際應(yīng)用程序邏輯所需的時(shí)間。我們還將展示使用該軟件包的最佳實(shí)踐,并從每天與Kubernetes進(jìn)行集成工作的開發(fā)人員的角度,分享我們已有的經(jīng)驗(yàn)。內(nèi)容將包括:
集群中的客戶端認(rèn)證 vs. 集群外的客戶端認(rèn)證
基本列表,使用client-go去創(chuàng)建和刪除Kubernetes對(duì)象的操作
如何使用ListWatch和Informers監(jiān)視K8s事件并做出反應(yīng)
如何管理軟件包依賴
Kubernetes是一個(gè)平臺(tái)Kubernetes有很多受歡迎的地方。用戶喜歡它的豐富功能、穩(wěn)定性和性能。對(duì)貢獻(xiàn)者來說,Kubernetes開源社區(qū)不僅規(guī)模龐大,還易于上手、反饋迅速。而真正讓Kubernetes吸引了第三方開發(fā)者的是它的可擴(kuò)展性。該項(xiàng)目提供了很多方式來添加新功能、擴(kuò)展現(xiàn)有功能而且不會(huì)中斷主代碼庫(kù)。正是這些,使得Kubernetes發(fā)展成為了一個(gè)平臺(tái)。
這里有一些方式來擴(kuò)展Kubernetes:
上圖所示,你可以發(fā)現(xiàn)每個(gè)Kubernetes集群組件無論是Kubelet還是API服務(wù)器,都可以以某種方式進(jìn)行擴(kuò)展。今天我們將重點(diǎn)介紹一種“自定義控制器”的方式,從現(xiàn)在起我將它稱為Kubernetes控制器(Kubernetes Controller),或者簡(jiǎn)單地稱為控制器(Controller)。
Kubernetes控制器究竟是什么?控制器最常見的定義是:使得系統(tǒng)的當(dāng)前狀態(tài)達(dá)到所期望的狀態(tài)的代碼。但這究竟是什么意思呢?我們以Ingress控制器為例。Ingress是一個(gè)Kubernetes資源,它能夠?qū)褐蟹?wù)的外部訪問進(jìn)行定義。通常采用HTTP并且有負(fù)載均衡支持。然而Kubernetes的核心代碼中并沒有ingress的實(shí)現(xiàn)。第三方控制器的實(shí)現(xiàn)將包含:
1.監(jiān)控ingress/services/endpoint 資源的事件(創(chuàng)建、更新、刪除)
2.程序內(nèi)部或外部的負(fù)載均衡器
3.使用負(fù)載均衡器的地址來更新Ingress
“所期望的狀態(tài)”在Ingress這里指的是IP地址指向運(yùn)行著的負(fù)載均衡器,該均衡器由用戶根據(jù)ingress規(guī)范定義的規(guī)則實(shí)現(xiàn)。并且由外部Ingress控制器負(fù)責(zé)將ingress資源轉(zhuǎn)移到這一狀態(tài)。
對(duì)相同的資源,控制器的實(shí)現(xiàn)以及部署他們的方式也可能會(huì)有所不同。你可以選擇nginx控制器并將其部署到集群中的每個(gè)節(jié)點(diǎn)上作為守護(hù)進(jìn)程集(Daemon Set),也可以選擇在Kubernetes集群外部運(yùn)行ingress控制器并且對(duì)F5編程作為負(fù)載均衡器。這里沒有嚴(yán)格的規(guī)定,Kubernetes就是如此靈活。
這里有幾種獲得Kubernetes集群及其資源相關(guān)信息的方法,你可以使用Dashboard、kubectl或者使用對(duì)Kubernetes API的編程式訪問來實(shí)現(xiàn)。Client-go所有用Go語言編寫的工具中使用最為廣泛的庫(kù),還有許多其他語言的版本(java、python等)。如果你還沒自己寫過控制器,我推薦你首先去嘗試go/client-go。Kubernetes是用Go編寫的,而且我發(fā)現(xiàn)使用和主項(xiàng)目相同的語言來開發(fā)插件會(huì)更加方便。
我們來搭建吧…要熟悉相關(guān)的平臺(tái)和工具,最好的辦法就是去實(shí)踐,去實(shí)現(xiàn)一些東西。我們從簡(jiǎn)單入手,先實(shí)現(xiàn)一個(gè)如下的控制器:
1.監(jiān)控Kubernetes節(jié)點(diǎn)
2.當(dāng)節(jié)點(diǎn)上的鏡像占用存儲(chǔ)空間時(shí)進(jìn)行警報(bào),并且可以更改
這部分的實(shí)現(xiàn),源碼可以在這里找到:https://github.com/alena1108/...
作為一名開發(fā)者,我和Rancher Labs的同事們更愿意使用輕便簡(jiǎn)易的工具,在這里我將分享3個(gè)我最喜歡的工具,它們將幫助我們完成第一個(gè)項(xiàng)目。
1.go-skel – Go語言的微服務(wù)skeleton,只需執(zhí)行run ./skel.sh test123即可,它會(huì)為新的go項(xiàng)目test123創(chuàng)建skeleton。
2.trash – Go語言的供應(yīng)商管理工具。實(shí)際上這兒有很多依賴項(xiàng)管理工具,但是在臨時(shí)依賴項(xiàng)管理方面,trash使用起來非常出色,而且簡(jiǎn)單。
3.dapper – 在一致性環(huán)境中對(duì)任何現(xiàn)有構(gòu)建工具進(jìn)行封裝的一種工具
為了方便使用client-go的代碼,我們必須要將其設(shè)置為項(xiàng)目的依賴項(xiàng)。將它添加到vendor.conf文件中:
接著運(yùn)行trash。它會(huì)將vendor.conf中定義的所有依賴項(xiàng)都拉到項(xiàng)目的vendor文件夾中。在這里需要確保client-go與你集群對(duì)應(yīng)的Kubernetes版本是兼容的。
創(chuàng)建一個(gè)客戶端在創(chuàng)建與Kubernetes API通信的客戶端之前,我們必須要先決定如何運(yùn)行我們的工具:是在Kubetnetes集群內(nèi)部還是外部。當(dāng)應(yīng)用程序在集群內(nèi)部運(yùn)行時(shí),對(duì)它進(jìn)行容器化,部署成為Kubernetes pod。它還提供了一些額外的功能:你可以選擇部署它的方式(Deamon set運(yùn)行在每個(gè)節(jié)點(diǎn)上,或者作為n個(gè)副本的部署),配置針對(duì)它的健康檢查等等。當(dāng)應(yīng)用程序在集群外部運(yùn)行時(shí),就需要自己來管理它。下面的配置可以讓我們的工具變得更靈活,并且支持基于config flag定義客戶端的兩種方式:
我們將在調(diào)試應(yīng)用程序時(shí)使用集群外部運(yùn)行的方式,這樣你不需要每次都構(gòu)建鏡像并且將其重新部署成Kubernetes pod。在測(cè)試好應(yīng)用程序后,我們就可以構(gòu)建鏡像并將其部署到集群中。
正如在截圖中看到的那樣,正在構(gòu)建配置,并將其傳遞到kubernetes.NewForConfig來生成客戶端。
我們的工具需要監(jiān)控節(jié)點(diǎn)。在實(shí)現(xiàn)邏輯流程之前,我們先來熟悉使用client-go執(zhí)行CRUD操作:
上面的截圖展示了:
1.List節(jié)點(diǎn)minikube,是經(jīng)過FieldSelector過濾器實(shí)現(xiàn)的
2.用新的標(biāo)注來更新節(jié)點(diǎn)
3.使用gracePerios=10秒指令刪除節(jié)點(diǎn)—意思是從該命令執(zhí)行后10秒才會(huì)執(zhí)行刪除操作
上面所有的步驟都是使用我們之前創(chuàng)建的用戶集(clientset)進(jìn)行的。
我們還需要節(jié)點(diǎn)上鏡像的相關(guān)信息;它可以通過訪問相應(yīng)的字段來檢索:
現(xiàn)在我們知道了如何從Kubernetes APIs中獲取節(jié)點(diǎn)并從中得到鏡像信息。那么我們?cè)撊绾伪O(jiān)控鏡像大小的變化呢?最簡(jiǎn)單的方法是周期性輪詢節(jié)點(diǎn),計(jì)算當(dāng)前的鏡像存儲(chǔ)容量,并將其和先前輪詢的結(jié)果比較。這里的不足之處在于:無論節(jié)點(diǎn)是否發(fā)生變化,我們執(zhí)行的列表調(diào)用都會(huì)獲取所有的節(jié)點(diǎn),這可能會(huì)很費(fèi)資源——特別是當(dāng)輪詢間隔很短的時(shí)候。而我們真正想要實(shí)現(xiàn)的是—在節(jié)點(diǎn)發(fā)生變化時(shí)得到通知,只有在這之后才執(zhí)行我們的邏輯流程。這些就是client-go的Informer來做的。
在這個(gè)例子中,我們經(jīng)過watchList指令為節(jié)點(diǎn)對(duì)象創(chuàng)建Informer來監(jiān)控節(jié)點(diǎn),設(shè)置對(duì)象類型為api.Node和30秒的同步周期來周期性地輪詢節(jié)點(diǎn),無論節(jié)點(diǎn)是否發(fā)生改變——這種方式在更新事件出于某種原因發(fā)生終止時(shí)可以很好的進(jìn)行撤回。在最后一個(gè)參數(shù),我們傳遞了2個(gè)回調(diào)函數(shù)——handleNodeAdd和handleNodeUpdate。這些回調(diào)函數(shù)具有實(shí)際的邏輯,并且在節(jié)點(diǎn)上的鏡像占用存儲(chǔ)發(fā)生改變時(shí)觸發(fā)。NewInformer返回2個(gè)對(duì)象——controller和store。一旦controller啟動(dòng),將會(huì)開始對(duì)node.update和node.add的監(jiān)控,并且調(diào)用回調(diào)函數(shù)。這部分代碼的存儲(chǔ)區(qū)位于內(nèi)存緩存中,由informer負(fù)責(zé)更新,另外你可以在緩存區(qū)中獲取節(jié)點(diǎn)對(duì)象而不用直接調(diào)用Kubernetes APIs:
我們的項(xiàng)目中只有一個(gè)控制器,使用常規(guī)的Informer就足夠了。不過,如果未來你的項(xiàng)目最終同一個(gè)對(duì)象擁有了多個(gè)控制器,我建議你使用SharedInformer。這樣一來你不用再一個(gè)一個(gè)為每個(gè)控制器配上Informer,只需要注冊(cè)一個(gè)Shared informer即可,并且讓每個(gè)控制器注冊(cè)自己的一組回調(diào)函數(shù),返回共享緩存,這可以減少內(nèi)存占用:
部署時(shí)間是時(shí)候來部署和測(cè)試代碼了!對(duì)于第一次運(yùn)行,我們只需要?jiǎng)?chuàng)建一個(gè)go的二進(jìn)制文件并且在集群外模式下運(yùn)行它即可:
如要更改消息輸出,那么使用鏡像部署一個(gè)pod,該鏡像是沒有在當(dāng)前節(jié)點(diǎn)顯示的鏡像。
在基本的功能通過測(cè)試之后,接下來就是按照集群模式嘗試運(yùn)行它了。為此我們必須先創(chuàng)建鏡像,定義它的Dockerfile:
并使用docker build創(chuàng)建一個(gè)鏡像,該命令將生成一個(gè)可用在Kubernetes中部署pod的鏡像?,F(xiàn)在你的應(yīng)用程序可以作為一個(gè)pod運(yùn)行在Kubernetes集群上了。這里是一個(gè)部署定義的例子,在之前的截圖中,我使用了該例部署我們的應(yīng)用程序:
在本文中我們做了如下工作:
1.創(chuàng)建go項(xiàng)目
2.為項(xiàng)目添加client-go包的依賴項(xiàng)
3.創(chuàng)建用于和Kubernetes api通信的客戶端
4.定義一個(gè)用于監(jiān)控節(jié)點(diǎn)對(duì)象改變,并且一旦發(fā)生就執(zhí)行回調(diào)函數(shù)的Informer
5.在回調(diào)函數(shù)中實(shí)現(xiàn)一個(gè)實(shí)際的邏輯
6.在集群外運(yùn)行二進(jìn)制文件來測(cè)試代碼,并把它部署到集群中
http://mp.weixin.qq.com/s/4-c...
http://mp.weixin.qq.com/s/2qZ...
http://mp.weixin.qq.com/s/prP...
http://mp.weixin.qq.com/s/FJ2...
如若轉(zhuǎn)載,請(qǐng)注明出處謝謝!
微信號(hào):RancherLabs
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/32625.html
摘要:相關(guān)基于項(xiàng)目和項(xiàng)目,并遵循應(yīng)用的十二因素風(fēng)格。相關(guān)在設(shè)計(jì)上,項(xiàng)目盡量保持驅(qū)動(dòng)和模塊化,以便模塊支持不同的實(shí)現(xiàn)方案。相關(guān)不僅可以管理眾多虛擬機(jī),其計(jì)算服務(wù)還支持對(duì)的驅(qū)動(dòng),管理引擎的子項(xiàng)目還可用于通過模板管理容器?,F(xiàn)已整合公司所支持的項(xiàng)目。 整理自《Docker技術(shù)入門與實(shí)踐》 PaaS(Platform as a Service) PaaS 是希望提供一個(gè)統(tǒng)一的可供所有軟件直接運(yùn)行而無需...
摘要:,托管于騰訊云容器平臺(tái)容器編排工具。適配我們目前的服務(wù)部署在騰訊云托管,節(jié)點(diǎn)使用核的網(wǎng)絡(luò)增強(qiáng)型機(jī)器,所有的后端服務(wù)都以部署,集群外部署高可用支持集群內(nèi)服務(wù)發(fā)現(xiàn),數(shù)據(jù)庫(kù)以為主,消息隊(duì)列采用。 距離2017年的見聞技術(shù)架構(gòu)調(diào)整接近2年,隨著業(yè)務(wù)線的發(fā)展,見聞技術(shù)部的項(xiàng)目數(shù)量、項(xiàng)目架構(gòu)類型、基礎(chǔ)設(shè)施規(guī)模、服務(wù)變更頻率都在不斷地增長(zhǎng),帶給SRE的挑戰(zhàn)是如何能更快地助力于開發(fā)人員更快更穩(wěn)定地部署...
摘要:升級(jí)注意事項(xiàng)使用推薦使用,但仍然支持和。如果內(nèi)核不支持,會(huì)包含一個(gè)無法使用的警告。在使用創(chuàng)建對(duì)象時(shí),如果不指定,使用讀取該字段會(huì)顯示中指定的默認(rèn)值。如果要,推薦使用中的命令。分配相關(guān)的問題。 之前,我們介紹了kubernetes 1.2.0的新特性,還不清楚的童鞋查看這里。 本文討論的是使用 kubernetes 1.2.0 的注意事項(xiàng),包括對(duì)周邊組件的要求(比如docker的兼容性)...
摘要:看過的應(yīng)該都知道項(xiàng)目中有大量代碼工具生成的代碼。執(zhí)行即腳本將自動(dòng)生成下面的文件和路徑腳本運(yùn)行后大體會(huì)建立如下的包管理結(jié)構(gòu)是不是很簡(jiǎn)單代碼是被完全生成的,就像包含我們的語言類型的文件下面的文件一樣然后你就可以基于生成的代碼寫自己的了。 CRD簡(jiǎn)介和使用姿勢(shì) CustomResourceDefinition(CRD)是 v1.7 + 新增的無需改變代碼就可以擴(kuò)展 Kubernetes AP...
摘要:看過的應(yīng)該都知道項(xiàng)目中有大量代碼工具生成的代碼。執(zhí)行即腳本將自動(dòng)生成下面的文件和路徑腳本運(yùn)行后大體會(huì)建立如下的包管理結(jié)構(gòu)是不是很簡(jiǎn)單代碼是被完全生成的,就像包含我們的語言類型的文件下面的文件一樣然后你就可以基于生成的代碼寫自己的了。 CRD簡(jiǎn)介和使用姿勢(shì) CustomResourceDefinition(CRD)是 v1.7 + 新增的無需改變代碼就可以擴(kuò)展 Kubernetes AP...
閱讀 1257·2021-09-27 13:34
閱讀 1072·2021-09-13 10:25
閱讀 568·2019-08-30 15:52
閱讀 3511·2019-08-30 13:48
閱讀 738·2019-08-30 11:07
閱讀 2228·2019-08-29 16:23
閱讀 2055·2019-08-29 13:51
閱讀 2391·2019-08-26 17:42