国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Rancher event機制及其實踐指南

hightopo / 777人閱讀

摘要:本次分享就介紹一下的機制,由于相關(guān)內(nèi)容文檔極其欠缺,本人也只是通過實踐和代碼閱讀分析其原理,如有謬誤歡迎指正。能夠管理多的同時又拆分出各種服務(wù)組件,機制是必不可少的。為實現(xiàn)機制,通常我們會采用等中間件來實現(xiàn)。

我們的Rancher官方技術(shù)社區(qū)已經(jīng)創(chuàng)立些許時日了,相信通過我們的線下meetup和線上布道工作,很多朋友對Rancher的使用已經(jīng)掌握得很純熟了。一些高級用戶開始真正把自己的業(yè)務(wù)進行微服務(wù)化并向Rancher遷移,在遷移的過程中,由于業(yè)務(wù)本身的復(fù)雜性特殊性,可能需要利用Rancher的一些高級特性甚至要對Rancher進行一定的擴展,這就需要對Rancher的一些組件的實現(xiàn)機制有些許了解。

本次分享就介紹一下Rancher的event機制,由于相關(guān)內(nèi)容文檔極其欠缺,本人也只是通過實踐和代碼閱讀分析其原理,如有謬誤歡迎指正。

在大規(guī)模系統(tǒng)架構(gòu)中,event機制通常采用消息驅(qū)動 ,它對提升分布式架構(gòu)的容錯性靈活性有很大幫助,同時也是各個組件之間解耦的利器。Rancher能夠管理N多的agent同時又拆分出各種服務(wù)組件,event機制是必不可少的。為實現(xiàn)event機制,通常我們會采用RabbitMQ、ActiveMQ、ZeroMQ等中間件來實現(xiàn)。而Rancher則采用了基于websocket協(xié)議的一種非常輕量級的實現(xiàn)方式,它的好處就是極大程度的精簡了Rancher的部署,Rancher無需額外維護一個MQ集群,畢竟websocket的消息收發(fā)實現(xiàn)是非常簡單的,各種語言庫均可以支持。

這里我們會考慮一個問題,websocket畢竟不是真正工業(yè)級MQ的實現(xiàn),消息不能持久化,一旦某個event的處理出現(xiàn)問題,或者發(fā)生消息丟失,Rancher如何保證各個資源的原子性一致性?Rancher中有一個processpool的概念,它可以看做一個所有event的執(zhí)行池,當(dāng)API/UI/CLI有操作時,Rancher會把操作分解成多個event并放入processpool中。比如刪除一個容器時會把 compute.instance.remove 放入processpool中,這個event會發(fā)送到對應(yīng)的host agent上,agent處理完成后會發(fā)送reply給rancher-server。如果在這個過程中,由于網(wǎng)絡(luò)問題消息丟失,或者agent上執(zhí)行出現(xiàn)問題,rancher-server沒有收到reply信息,cattle會把這個event重新放到processpool中再次重復(fù)上面的過程,直到 compute.instance.remove 完成操作,這個容器的狀態(tài)才會在DB中更新,否則該容器狀態(tài)會一直處于lock不能被其他服務(wù)更新。當(dāng)然cattle不會把這些event不停的重復(fù)執(zhí)行下去,通常會設(shè)置一下TIMEOUT超出后便不再執(zhí)行(有些資源沒有TIMEOUT機制)。

上面的表述,我們其實可以在UI上看到這個過程,RancherUI上的Processes的Running Tab頁上就能實時得看到這些信息,Processes 在排查一些Rancher的相關(guān)問題是非常有用的,大家可以養(yǎng)成 ”查問題先查Processes“的好習(xí)慣:

那么監(jiān)聽event的URL怎么設(shè)定呢?非常簡單:

ws://:8080/v1/projects//subscribe?eventNames=xxxx

除此之外還需要加上basic-auth的header信息

Authorization: Basic +base64encode(:)

如果是Host上的agent組件,還需要添加agentId參數(shù)

ws://:8080/v1/projects//subscribe?eventNames=xxxx&agentId=xxxx

agentId 是注冊Host時生成的,如果沒有agentId參數(shù),任何有關(guān)無關(guān)的event都會發(fā)送到所有的Host agent上,這樣就會發(fā)生類似“廣播風(fēng)暴”的效果。

Host agent上運行很多組件,其中python-agent是負責(zé)接收和回執(zhí)event信息的,其運行日志可以在Host上的/var/log/rancher/agent.log文件中查看。

細心的朋友可能會有疑問,我們在添加Host時執(zhí)行agent容器時并沒有指定cattle-access-key和cattle-secret-key,也就是說python-agent運行時如何獲取這兩個秘鑰信息呢?

其實Rancher有兩種apikey:一種是我們熟知的在UI上手動創(chuàng)建的apikey;另外一種就是agentApikey,它是系統(tǒng)級的,專門為agent設(shè)定,添加Host時會先把agentApikey發(fā)送到Host上。在cattle的credential表中可以查詢到相關(guān)信息:

eventNames都定義了哪些呢?下面兩個文件可以參考:

https://github.com/rancher/ca...系統(tǒng)級的event定義

https://github.com/rancher/ca... 詳細到每種資源(host、volume、instance、stack、service等)的event定義。

此外,一旦我們在UI/CLI/API上的某個操作都會被分解成多個event來執(zhí)行,每個event信息都會被保存在mysql中,每個event執(zhí)行成功后會設(shè)置成purged狀態(tài),所以表中記錄并不會真正刪除,這就會導(dǎo)致相應(yīng)的表(container_event表、service_event表、process_instance表)會無限膨脹下去。

Rancher為解決此問題提供了周期性清理機制

events.purge.after.seconds 可以清理container_event和service_event,每兩周清理一次;process_instance.purge.after.seconds可以清理process_instance,每天清理一次。這兩個配置我們都可以在 http://

下面我們來實踐一下,看看如何在程序中實現(xiàn)對Rancher event的監(jiān)聽。

Rancher提供了resource.change事件,這個事件是不用reply的,就是說不會影響Rancher系統(tǒng)的運行,它是專門開放給開發(fā)者用來實現(xiàn)一些自己的定制功能,所以我們就以resource.change作為例子實踐一下。

Rancher的組件大部分都是基于Golang編寫,所以我們也采用相同的語言。

為了能夠快速實現(xiàn)這個程序,我們需要了解一些輔助快速開發(fā)的小工具。

Trash,Golang package管理的小工具,可以幫助我們定義依賴包的路徑和版本,非常輕量且方便

Dapper,這個是基于容器實現(xiàn)Golang編譯的工具,主要是可以幫助我們統(tǒng)一編譯環(huán)境

go-skel,它可以幫我們快速創(chuàng)建一個Rancher式的微服務(wù)程序,可以為我們省去很多的基本代碼,同時還集成了Trash和Dapper這兩個實用的小工具

使用詳情可以參考我之前寫的一篇內(nèi)容:

扒一扒Rancher社區(qū)中的小工具

回到本文的主題,首先我們基于go-skel創(chuàng)建一個工程名為 scale-subscriber (名字很隨意),執(zhí)行過程需要耐心的等待:

執(zhí)行完畢后,我們把工程放到GOPATH中,開始添加相關(guān)的邏輯代碼。

在這之前我們可以考慮添加一個healthcheck的服務(wù)端口,其實縱觀Rancher所有的微服務(wù)組件,基本上除了主程序之外都會添加healthcheck port,這個主要是為了與Rancher中的healthcheck功能配合,通過設(shè)定對這個端口的檢查機制來保證微服務(wù)的可靠性。

我們利用Golang的goroutine機制,分別添加主服務(wù)和healthcheck服務(wù):

主服務(wù)的核心就是監(jiān)聽resource.change的信息,同時注冊handler來獲取event的payload信息,從而可以定制擴展自己的邏輯,這里需要利用Rancher提供的 https://github.com/rancher/ev... 庫來快速實現(xiàn)。

如下圖,在 reventhandlers.NewResourceChangeHandler().Handler 中就可以實現(xiàn)自己的邏輯:

這里我們只是演示監(jiān)聽event的機制,所以我們就不做過多的業(yè)務(wù)邏輯處理,打印輸出event信息即可。

然后在項目根目錄下執(zhí)行make,make會自動調(diào)用dapper,在bin目錄下生成scale-subscriber,我們執(zhí)行scale-subscriber就可以監(jiān)聽resource.change的信息:

這里我們可以看到分別啟動了healthcheck功能和event listener。然后可以在UI上隨意刪除一個stack,scale-subsciber就可以獲取event信息:

如要將其部署在Rancher中,那就可以將scale-subsciber執(zhí)行程序打包放到鏡像中,通過compose來啟動。

但是我們知道scale-subsciber啟動需要指定CATTLE_URL、CATTLE_ACCESS_KEY、CATTLE_SECRET_KEY,正常的做法就是我們需要先生成好apikey,然后啟動service的時候設(shè)置對應(yīng)的環(huán)境變量。

這樣做就會有弊端,就是apikey這種私密的信息不得不對外暴露,而且還要手動維護這些apikey,非常不方便。

Rancher提供了一個非常方便的做法,就是在service中添加兩個label,

io.rancher.container.create_agent: true
io.rancher.container.agent.role: environment

設(shè)定這兩個label后,Rancher引擎會自動創(chuàng)建apikey,并把相應(yīng)的值設(shè)置到容器的ENV中,只要你的程序通過系統(tǒng)環(huán)境變量來讀取這些值,就會非常順利的運行起來。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/27965.html

相關(guān)文章

  • 關(guān)于Subscribe Rancher Events的思考

    摘要:年月日社區(qū)技術(shù)支持計劃全面啟動,本文是研發(fā)人員在社區(qū)答疑過程中關(guān)于的一些心得和思考。初識基于的消息總線可以很好的與前端兼容,讓消息的傳遞不再是后端的專利。 2016年2月14日「Rancher社區(qū)技術(shù)支持計劃」全面啟動,本文是Rancher研發(fā)人員在社區(qū)答疑過程中關(guān)于Subscribe Rancher Events的一些心得和思考。 引言 幾乎每個大型的分布式的集群軟件,都離不開一樣?xùn)|...

    yuxue 評論0 收藏0
  • Rancher v1.2基礎(chǔ)設(shè)施引擎整體架構(gòu)分析

    摘要:官方于月日發(fā)布了其容器部署與管理平臺的最新版本,。架構(gòu)總覽在版本的整體架構(gòu)圖如下圖所示上,引擎向下深入演化成了基礎(chǔ)設(shè)施引擎,這一點上在時代也早有體現(xiàn)。基礎(chǔ)設(shè)施引擎初次安裝版本,會發(fā)現(xiàn)多了如下圖所示的明顯標(biāo)識,默認(rèn)的引擎需要安裝等服務(wù)。 Rancher Labs官方于12月1日發(fā)布了其容器部署與管理平臺Rancher的最新版本,Rancher v1.2。Rancher v1.2可以說是一...

    Sike 評論0 收藏0
  • Rancher v1.2基礎(chǔ)設(shè)施引擎整體架構(gòu)分析

    摘要:官方于月日發(fā)布了其容器部署與管理平臺的最新版本,。架構(gòu)總覽在版本的整體架構(gòu)圖如下圖所示上,引擎向下深入演化成了基礎(chǔ)設(shè)施引擎,這一點上在時代也早有體現(xiàn)。基礎(chǔ)設(shè)施引擎初次安裝版本,會發(fā)現(xiàn)多了如下圖所示的明顯標(biāo)識,默認(rèn)的引擎需要安裝等服務(wù)。 Rancher Labs官方于12月1日發(fā)布了其容器部署與管理平臺Rancher的最新版本,Rancher v1.2。Rancher v1.2可以說是一...

    tianhang 評論0 收藏0
  • 微服務(wù)運行指南——For Cattle

    摘要:微服務(wù)基礎(chǔ)層主要是為容器提供計算存儲網(wǎng)絡(luò)等基礎(chǔ)資源。微服務(wù)訪問層,目前服務(wù)對外暴露訪問主要以綁定或是負載均衡方式。除此之外,內(nèi)置的負載均衡是基于實現(xiàn)的,支持。私有云場景中,很多行業(yè)用戶在內(nèi)部都使用硬件負載均衡來暴露服務(wù)訪問地址。 站在微服務(wù)的角度看容器的基礎(chǔ)設(shè)施服務(wù)可以分為三層: 微服務(wù)基礎(chǔ)層 微服務(wù)構(gòu)建層 微服務(wù)訪問層 showImg(https://segmentfault.c...

    wzyplus 評論0 收藏0
  • 實踐指南-快速解鎖Rancher v1.2

    摘要:引言已經(jīng)發(fā)布,相信眾多容器江湖的伙伴們正魔拳擦準(zhǔn)備好好體驗一番。為了更好的體驗的完整特性,我們選取了測試比較嚴(yán)格的運行環(huán)境。 引言 Rancher v1.2已經(jīng)發(fā)布,相信眾多容器江湖的伙伴們正魔拳擦準(zhǔn)備好好體驗一番。由于Docker能夠落地的操作系統(tǒng)眾多,各種Docker版本不同的Graph driver,所以通常大版本的第一個release都會在兼容性上有一些小問題。為了更好的體驗R...

    KavenFan 評論0 收藏0

發(fā)表評論

0條評論

hightopo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<