如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet

這篇文章將為大家詳細(xì)講解有關(guān)如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),十多年企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都超過(guò)千家客戶提供網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站開(kāi)發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營(yíng)銷型網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),同時(shí)也為不同行業(yè)的客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)建站。

處理調(diào)度Jobs

單一的應(yīng)用程序,就是之前在單個(gè)節(jié)點(diǎn)上運(yùn)行的單個(gè)實(shí)例,包括了很多在數(shù)據(jù)庫(kù)更新?tīng)顟B(tài)的調(diào)度jobs(現(xiàn)在也同樣發(fā)布商務(wù)events)。單體程序創(chuàng)建在java中,并且大量使用Spring,所以job看起來(lái)是這個(gè)樣子的:

如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet

Spring之后會(huì)確認(rèn)提到過(guò)的 doSomethingEveryMinute方法每分鐘執(zhí)行一次。問(wèn)題是,如果我們目前不在Kubernetes上主持單體程序,并且跟多個(gè)實(shí)例一起運(yùn)行,這個(gè)job就每分鐘會(huì)在每個(gè)實(shí)例上被執(zhí)行一次,而不僅僅只是每分鐘執(zhí)行了一次而已。如果job有類似發(fā)送通知郵件或更新數(shù)據(jù)庫(kù)這樣的副作用的話,這就是一個(gè)問(wèn)題了。所以我們要怎樣避免這個(gè)?當(dāng)然,解決方案還是很多的,顯而易見(jiàn)的選擇就是利用Kubernetes Jobs,讓Kubernetes自己周期性調(diào)度jobs。問(wèn)題就是這個(gè)作用只在Kubernetes1.3版本及以上版本中可用,但是1.3還沒(méi)有發(fā)布。但是即使我們能夠使用這樣一個(gè)功能,從技術(shù)角度來(lái)說(shuō),這也是不太可行的。我們的jobs被高度耦合到已經(jīng)存在的代碼庫(kù),并且提取每個(gè)job到它自己的應(yīng)用程序,程序可能會(huì)有錯(cuò)誤,而且如果一次性完成的話會(huì)非常耗費(fèi)時(shí)間。所以我們最初的計(jì)劃是提取所有的調(diào)度jobs到一個(gè)應(yīng)用程序,這個(gè)應(yīng)用程序在Kubernetes中只能作為一個(gè)實(shí)例來(lái)運(yùn)行。但由于現(xiàn)有代碼的本質(zhì),和高耦合性,即使是這樣也很難實(shí)現(xiàn)。那么,有沒(méi)有一種很輕松的辦法允許我們目前在單體應(yīng)用中保持jobs,并且當(dāng)我們從這個(gè)應(yīng)用中提取功能到獨(dú)立的服務(wù)的時(shí)候,逐漸替代他們呢?其實(shí)還是有的。

Kubernetes中的Leader選舉

要解決這個(gè),我們需要做一些分布式協(xié)調(diào),比如,當(dāng)jobs被Spring執(zhí)行的時(shí)候,如果這個(gè)節(jié)點(diǎn)不是“l(fā)eader節(jié)點(diǎn)”,為運(yùn)行調(diào)度jobs負(fù)責(zé),我們就只需要傳回信息(而且,不要和job一起運(yùn)行代碼)。有一些項(xiàng)目能夠幫助我們來(lái)處理諸如zookeeper和hazelcast之類的東西。但是僅僅只是為了決定哪個(gè)節(jié)點(diǎn)執(zhí)行調(diào)度jobs,以此來(lái)設(shè)置、保留zookeeper集群就太勞師動(dòng)眾了。我們需要一些易于管理的東西,假如我們能夠利用Kubernetes會(huì)怎么樣呢?Kubernetes已經(jīng)在cover下(使用 RAFT consensus algorithm)處理了leader選舉。結(jié)果證明,這個(gè)功能通過(guò)使用gcr.io/google_containers/leader-elector Docker鏡像已經(jīng)被暴露給了終端用戶。之前已經(jīng)有一個(gè)很棒的博客帖子很細(xì)節(jié)地描述過(guò)這個(gè)是如何運(yùn)行的了,點(diǎn)擊這個(gè)網(wǎng)址查看:http://blog.kubernetes.io/2016/01/simple-leader-election-with-Kubernetes.html。所以在這里我就不多加贅述了,但是我會(huì)講一講我們是如何利用鏡像來(lái)解決我們的問(wèn)題的。

解決問(wèn)題

我們做的就是帶來(lái)gcr.io/google_containers/leader-elector容器到我們的pod,這樣就可以讓單體應(yīng)用的實(shí)例都運(yùn)行一個(gè)leader選舉的實(shí)例。這是證明Kubernetes pod有用的典型例子。

以下是一個(gè)在我們的配置resource中定義好的pod的摘錄:

如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet

我們開(kāi)啟leader選舉以及我們的單體應(yīng)用程序。注意,我們將 --election=monolith-jobs當(dāng)作第一個(gè)參數(shù)。這就意味著leader選舉知道容器屬于哪一個(gè)組。所以指定這個(gè)組的容器會(huì)是leader選舉進(jìn)程中的一部分,這個(gè)組之中只有一個(gè)容器會(huì)被選舉為leader。 --http=localhost:4040的第二個(gè)參數(shù)同樣是非常重要的。它在4040端口打開(kāi)了一個(gè)網(wǎng)頁(yè)服務(wù)器,在這個(gè)端口,我們可以查詢到目前l(fā)eader的pod名字,然后以這個(gè)格式返回:

如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet

這是我們決定要不要運(yùn)行我們的job的一個(gè)小把戲。我們要做的事情就是檢查即將執(zhí)行調(diào)度pod的名字是否跟選舉出來(lái)的leader一致,如果一致,我們就應(yīng)該繼續(xù)執(zhí)行,并且執(zhí)行job,或者其它的我們應(yīng)該返回的東西。比如:

如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet

所以我們來(lái)看看ClusterLeaderService是如何被實(shí)施的。首先,我們必須從應(yīng)用程序獲得pod的名字。Kubernetes將pod名字存儲(chǔ)在/etc/hostname ,Java將這個(gè)/etc/hostname暴露在HOSTNAME環(huán)境變量,這就是我們將在這個(gè)例子中引用的。另一個(gè)方法就是使用 Downward API將pod名字暴露到環(huán)境變量選擇。比如:

如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet

從這里,我們可以看到 metadata.name (也就是pod的名字)會(huì)與 MY_POD_NAME環(huán)境變量聯(lián)系在一起。但是現(xiàn)在讓我們來(lái)看看 ClusterLeaderService的實(shí)施是看起來(lái)是怎么樣的:

如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet

在這里例子中,我們正在從 RESTAssured 項(xiàng)目使用 JsonPath來(lái)查詢選舉者網(wǎng)頁(yè)服務(wù),并且從回應(yīng)中提取pod的名字。然后我們簡(jiǎn)單地將本地容器的名字跟leader相比較,如果他們是相同的,那么我們就知道這個(gè)實(shí)例就是leader!就是這樣!

結(jié)論

事實(shí)證明,上述工作運(yùn)行地很不錯(cuò)!如果leader節(jié)點(diǎn)要掛掉了,那么另一個(gè)就會(huì)自動(dòng)選舉上。但這個(gè)過(guò)程會(huì)花上一點(diǎn)時(shí)間,要一分鐘左右。所以這個(gè)還是要權(quán)衡一下的。假如你的工作中不允許錯(cuò)過(guò)任意一個(gè)job執(zhí)行,那么這個(gè)選擇對(duì)你來(lái)說(shuō)是不合適的。但在我們上述的例子中,中間有那么一分鐘job沒(méi)有被準(zhǔn)確執(zhí)行,對(duì)我們來(lái)說(shuō)無(wú)傷大雅。所以我覺(jué)得這個(gè)方法十分簡(jiǎn)單,而且當(dāng)移植一個(gè)現(xiàn)有的包含調(diào)度jobs的應(yīng)用程序的時(shí)候很有價(jià)值,因?yàn)檎{(diào)度jobs總有各種各樣很難提取的原因。

關(guān)于“如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

新聞標(biāo)題:如何實(shí)現(xiàn)分布式協(xié)調(diào)Kubernet
網(wǎng)站鏈接:http://muchs.cn/article12/ihecdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、網(wǎng)站內(nèi)鏈、動(dòng)態(tài)網(wǎng)站、建站公司、外貿(mào)建站、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)