使用Kubernetes和Docker进行简单的leader选举
生活随笔
收集整理的這篇文章主要介紹了
使用Kubernetes和Docker进行简单的leader选举
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文講的是使用Kubernetes和Docker進(jìn)行簡單的leader選舉,【編者的話】Kubernetes簡化了運(yùn)行在集群中的服務(wù)部署和運(yùn)維管理,然而,它也簡化了這些管理工作的部署。本篇文章將會(huì)展示如何在分布式應(yīng)用系統(tǒng)中使用Kubernetes來簡單地運(yùn)行l(wèi)eader選舉。
通常在leader選舉中,一組有機(jī)會(huì)成為leader的候選者都是可以確認(rèn)的。這些候選者都競(jìng)相宣布自己是leader,其中會(huì)有一個(gè)候選者脫穎而出成為leader。一旦贏了選舉之后,leader將會(huì)繼續(xù)以leader身份發(fā)送“心跳”來更新他們的位置。而其它的候選者將會(huì)周期性地作出嘗試來成為leader,這套機(jī)制確保了如果當(dāng)前的leader由于某些原因失效了,可以快速指定新的leader。
leader選舉的實(shí)現(xiàn)通常需要任一一套分布式協(xié)調(diào)系統(tǒng)比如ZooKeeper、etcd或者Consul,使用它們來取得共識(shí),或者交替實(shí)現(xiàn)自己的共識(shí)算法。接下來我們將會(huì)看到Kubernetes如何使得在應(yīng)用中進(jìn)行l(wèi)eader選舉明顯更容易。
執(zhí)行l(wèi)eader選舉將使用Kubernetes API中的兩個(gè)屬性:
鑒于這些原語,使用選主的代碼相對(duì)簡單,可以在這兒找到相關(guān)代碼,運(yùn)行如下:
$?kubectl?run?leader-elector?--image=gcr.io/google_containers/leader-elector:0.4?--replicas=3?--?--election=example
這將會(huì)創(chuàng)建一個(gè)有三個(gè)副本的leader選舉組:
$?kubectl?get?pods NAME???????????????????READY?????STATUS????RESTARTS???AGE leader-elector-inmr1???1/1???????Running???0??????????13s leader-elector-qkq00???1/1???????Running???0??????????13s leader-elector-sgwcq???1/1???????Running???0??????????13s
為了查看哪一個(gè)Pod被選為了leader,用戶可以訪問Pods的日志,在下面的位置替換為你自己的Pod的名字:
${pod_name},?(e.g.?leader-elector-inmr1?from?the?above)$?kubectl?logs?-f?${name} leader?is?(leader-pod-name)
或者,用戶可以直接檢查Endpoints對(duì)象:
#?‘example’?is?the?name?of?the?candidate?set?from?the?above?kubectl?run?…?command $?kubectl?get?endpoints?example?-o?yams
現(xiàn)在需要驗(yàn)證leader選舉是否生效,在另外一個(gè)終端中執(zhí)行:
$?kubectl?delete?pods?(leader-pod-name)
這個(gè)命令將會(huì)刪除已有的leader,因?yàn)镽eplication Controller管理Pods組,一個(gè)新的Pod將會(huì)替換掉已經(jīng)刪除的,從而確保副本數(shù)目仍然為3。通過leader選舉,這三個(gè)Pod中將會(huì)有一個(gè)被選為leader,并且leader角色還會(huì)失效轉(zhuǎn)移到不同的Pod上。因?yàn)镵ubernetes框架中Pod在終止前會(huì)有一個(gè)寬限期,通常是持續(xù)30~40秒。
leader選舉容器提供了一個(gè)簡單的Web服務(wù)器,可以運(yùn)行在任何地址上(比如http://localhost:4040),我們可以通過刪除一個(gè)已有的leader選舉組并創(chuàng)建一個(gè)新的來測(cè)試這個(gè)容器,此處可以另外傳入一個(gè)形如-http=(host):(port) 規(guī)格的配置到鏡像中,這樣就會(huì)導(dǎo)致每一個(gè)組成員通過Webhook來獲得有關(guān)leader的服務(wù)信息。
#?delete?the?old?leader?elector?group $?kubectl?delete?rc?leader-elector#?create?the?new?group,?note?the?--http=localhost:4040?flag $?kubectl?run?leader-elector?--image=gcr.io/google_containers/leader-elector:0.4?--replicas=3?--?--election=example?--http=0.0.0.0:4040#?create?a?proxy?to?your?Kubernetes?api?server $?kubectl?proxy
接著可以訪問:
http://localhost:8001/api/v1/proxy/namespaces/default/pods/(leader-pod-name):4040/
然后就會(huì)看到:
{"name":"(name-of-leader-here)"}?
leader選舉容器可以作為一個(gè)Sidecars來從自己的應(yīng)用中使用,Pod中的任何容器對(duì)誰是當(dāng)前的選主感興趣的都可以簡單地通過http://localhost:4040?來訪問,然后返回一個(gè)簡單的JSON對(duì)象,其中包含了當(dāng)前選主的名字。既然Pod中的所有容器共享了相同的網(wǎng)絡(luò)命名空間,就不再需要服務(wù)發(fā)現(xiàn)了!
舉個(gè)例子,有一個(gè)簡單的Node.js應(yīng)用程序連接到leader選舉Sidecar,然后打印出這個(gè)是否是當(dāng)前的選主,領(lǐng)導(dǎo)人選舉Sidecar將其標(biāo)識(shí)符設(shè)置為默認(rèn)的主機(jī)名。
var?http?=?require('http'); //?This?will?hold?info?about?the?current?master var?master?=?{};//?The?web?handler?for?our?nodejs?application var?handleRequest?=?function(request,?response)?{ response.writeHead(200); response.end("Master?is?"?+?master.name); };//?A?callback?that?is?used?for?our?outgoing?client?requests?to?the?sidecar var?cb?=?function(response)?{ var?data?=?''; response.on('data',?function(piece)?{?data?=?data?+?piece;?}); response.on('end',?function()?{?master?=?JSON.parse(data);?}); };//?Make?an?async?request?to?the?sidecar?at?http://localhost:4040 var?updateMaster?=?function()?{ var?req?=?http.get({host:?'localhost',?path:?'/',?port:?4040},?cb); req.on('error',?function(e)?{?console.log('problem?with?request:?'?+?e.message);?}); req.end(); };//?Set?up?regular?updates updateMaster(); setInterval(updateMaster,?5000);//?set?up?the?web?server var?www?=?http.createServer(handleRequest); www.listen(8080);?
當(dāng)然,可以使用任何語言,選擇支持HTTP和JSON來使用這個(gè)Sidecar。
原文鏈接:Simple leader election with Kubernetes and Docker(翻譯:胡震)
原文發(fā)布時(shí)間為:2016-01-19 本文作者:國會(huì)山上的貓TuxHu? 本文來自云棲社區(qū)合作伙伴DockerOne,了解相關(guān)信息可以關(guān)注DockerOne。 原文標(biāo)題:使用Kubernetes和Docker進(jìn)行簡單的leader選舉
概述
為了可靠性和伸縮性,分布式系統(tǒng)通常會(huì)復(fù)制多個(gè)服務(wù)任務(wù),但往往有必要指定一個(gè)副本作為leader負(fù)責(zé)協(xié)調(diào)所有的副本。通常在leader選舉中,一組有機(jī)會(huì)成為leader的候選者都是可以確認(rèn)的。這些候選者都競(jìng)相宣布自己是leader,其中會(huì)有一個(gè)候選者脫穎而出成為leader。一旦贏了選舉之后,leader將會(huì)繼續(xù)以leader身份發(fā)送“心跳”來更新他們的位置。而其它的候選者將會(huì)周期性地作出嘗試來成為leader,這套機(jī)制確保了如果當(dāng)前的leader由于某些原因失效了,可以快速指定新的leader。
leader選舉的實(shí)現(xiàn)通常需要任一一套分布式協(xié)調(diào)系統(tǒng)比如ZooKeeper、etcd或者Consul,使用它們來取得共識(shí),或者交替實(shí)現(xiàn)自己的共識(shí)算法。接下來我們將會(huì)看到Kubernetes如何使得在應(yīng)用中進(jìn)行l(wèi)eader選舉明顯更容易。
Kubernetes中l(wèi)eader選舉的實(shí)現(xiàn)
leader選舉的第一個(gè)要求是對(duì)于有意成為leader的一組候選者的規(guī)范,Kubernetes已經(jīng)使用了Endpoints來表示一組包含服務(wù)的Pods副本,所以我們將重用這個(gè)相同的對(duì)象(旁白:你可能會(huì)認(rèn)為我們將使用ReplicationControllers,但它們被綁定到一個(gè)特定的二進(jìn)制軟件包,即使在執(zhí)行滾動(dòng)更新的過程中也通常需要一個(gè)leader)。執(zhí)行l(wèi)eader選舉將使用Kubernetes API中的兩個(gè)屬性:
- ResourceVersions——每個(gè)API都有一個(gè)唯一的ResourceVersions,用戶可以使用這些版本在Kubernetes對(duì)象上執(zhí)行Compare-and-Swap操作。
- Annotations——每個(gè)API都可以被用于客戶端的任意鍵/值對(duì)注解。
鑒于這些原語,使用選主的代碼相對(duì)簡單,可以在這兒找到相關(guān)代碼,運(yùn)行如下:
$?kubectl?run?leader-elector?--image=gcr.io/google_containers/leader-elector:0.4?--replicas=3?--?--election=example
這將會(huì)創(chuàng)建一個(gè)有三個(gè)副本的leader選舉組:
$?kubectl?get?pods NAME???????????????????READY?????STATUS????RESTARTS???AGE leader-elector-inmr1???1/1???????Running???0??????????13s leader-elector-qkq00???1/1???????Running???0??????????13s leader-elector-sgwcq???1/1???????Running???0??????????13s
為了查看哪一個(gè)Pod被選為了leader,用戶可以訪問Pods的日志,在下面的位置替換為你自己的Pod的名字:
${pod_name},?(e.g.?leader-elector-inmr1?from?the?above)$?kubectl?logs?-f?${name} leader?is?(leader-pod-name)
或者,用戶可以直接檢查Endpoints對(duì)象:
#?‘example’?is?the?name?of?the?candidate?set?from?the?above?kubectl?run?…?command $?kubectl?get?endpoints?example?-o?yams
現(xiàn)在需要驗(yàn)證leader選舉是否生效,在另外一個(gè)終端中執(zhí)行:
$?kubectl?delete?pods?(leader-pod-name)
這個(gè)命令將會(huì)刪除已有的leader,因?yàn)镽eplication Controller管理Pods組,一個(gè)新的Pod將會(huì)替換掉已經(jīng)刪除的,從而確保副本數(shù)目仍然為3。通過leader選舉,這三個(gè)Pod中將會(huì)有一個(gè)被選為leader,并且leader角色還會(huì)失效轉(zhuǎn)移到不同的Pod上。因?yàn)镵ubernetes框架中Pod在終止前會(huì)有一個(gè)寬限期,通常是持續(xù)30~40秒。
leader選舉容器提供了一個(gè)簡單的Web服務(wù)器,可以運(yùn)行在任何地址上(比如http://localhost:4040),我們可以通過刪除一個(gè)已有的leader選舉組并創(chuàng)建一個(gè)新的來測(cè)試這個(gè)容器,此處可以另外傳入一個(gè)形如-http=(host):(port) 規(guī)格的配置到鏡像中,這樣就會(huì)導(dǎo)致每一個(gè)組成員通過Webhook來獲得有關(guān)leader的服務(wù)信息。
#?delete?the?old?leader?elector?group $?kubectl?delete?rc?leader-elector#?create?the?new?group,?note?the?--http=localhost:4040?flag $?kubectl?run?leader-elector?--image=gcr.io/google_containers/leader-elector:0.4?--replicas=3?--?--election=example?--http=0.0.0.0:4040#?create?a?proxy?to?your?Kubernetes?api?server $?kubectl?proxy
接著可以訪問:
http://localhost:8001/api/v1/proxy/namespaces/default/pods/(leader-pod-name):4040/
然后就會(huì)看到:
{"name":"(name-of-leader-here)"}?
leader選舉與sidecars
太好了,現(xiàn)在可以通過HTTP來進(jìn)行l(wèi)eader選舉和找出leader,但怎么能在您自己的應(yīng)用程序中使用它們呢?這就需要引入Sidecars的概念。在Kubernetes中,Pods由一個(gè)或者多個(gè)容器組成,通常,這意味著添加sidecars容器到主應(yīng)用程序中組成一個(gè)Pod(對(duì)于這個(gè)主題的更詳細(xì)的處理,請(qǐng)看我以前的博客文章)。leader選舉容器可以作為一個(gè)Sidecars來從自己的應(yīng)用中使用,Pod中的任何容器對(duì)誰是當(dāng)前的選主感興趣的都可以簡單地通過http://localhost:4040?來訪問,然后返回一個(gè)簡單的JSON對(duì)象,其中包含了當(dāng)前選主的名字。既然Pod中的所有容器共享了相同的網(wǎng)絡(luò)命名空間,就不再需要服務(wù)發(fā)現(xiàn)了!
舉個(gè)例子,有一個(gè)簡單的Node.js應(yīng)用程序連接到leader選舉Sidecar,然后打印出這個(gè)是否是當(dāng)前的選主,領(lǐng)導(dǎo)人選舉Sidecar將其標(biāo)識(shí)符設(shè)置為默認(rèn)的主機(jī)名。
var?http?=?require('http'); //?This?will?hold?info?about?the?current?master var?master?=?{};//?The?web?handler?for?our?nodejs?application var?handleRequest?=?function(request,?response)?{ response.writeHead(200); response.end("Master?is?"?+?master.name); };//?A?callback?that?is?used?for?our?outgoing?client?requests?to?the?sidecar var?cb?=?function(response)?{ var?data?=?''; response.on('data',?function(piece)?{?data?=?data?+?piece;?}); response.on('end',?function()?{?master?=?JSON.parse(data);?}); };//?Make?an?async?request?to?the?sidecar?at?http://localhost:4040 var?updateMaster?=?function()?{ var?req?=?http.get({host:?'localhost',?path:?'/',?port:?4040},?cb); req.on('error',?function(e)?{?console.log('problem?with?request:?'?+?e.message);?}); req.end(); };//?Set?up?regular?updates updateMaster(); setInterval(updateMaster,?5000);//?set?up?the?web?server var?www?=?http.createServer(handleRequest); www.listen(8080);?
當(dāng)然,可以使用任何語言,選擇支持HTTP和JSON來使用這個(gè)Sidecar。
總結(jié)
希望我已經(jīng)向你展示了是多么容易為分布式應(yīng)用程序使用Kubernetes來構(gòu)建leader選舉。在以后的部分我們將向您展示Kubernetes是如何使得構(gòu)建分布式系統(tǒng)更容易。與此同時(shí),還前往Google容器引擎或kubernetes.io來開始使用Kubernetes。原文鏈接:Simple leader election with Kubernetes and Docker(翻譯:胡震)
原文發(fā)布時(shí)間為:2016-01-19 本文作者:國會(huì)山上的貓TuxHu? 本文來自云棲社區(qū)合作伙伴DockerOne,了解相關(guān)信息可以關(guān)注DockerOne。 原文標(biāo)題:使用Kubernetes和Docker進(jìn)行簡單的leader選舉
總結(jié)
以上是生活随笔為你收集整理的使用Kubernetes和Docker进行简单的leader选举的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【贪心】Codeforces Round
- 下一篇: String是一个很普通的类 - Jav