天天看點

DockOne微信分享( 九十):獵豹移動基于CoreOS在AWS上的項目實踐

本文講的是<b>DockOne微信分享( 九十):獵豹移動基于CoreOS在AWS上的項目實踐</b>【編者的話】本次分享介紹基于AWS的EC2服務如何設計和搭建适合自己業務的架構方案實作全球多region部署,介紹模型案例:CoreOS的使用技巧與運維經驗,把一個叢集當成一台機器管理心得,包括:

為什麼選擇AWS和Docker

為什麼選擇CoreOS部署我們的應用

CoreOS在AWS平台上如何快速建構叢集并且進行管理

應用過程中遇到的問題與解決方案

<a href="http://dockerone.com/uploads/article/20161103/fb0a859856e997cf35eadc25ac5eb994.png" target="_blank"></a>

首先我先介紹一下獵豹移動的一些業務,如圖, 我們在海外有着龐大的使用者群體,接近16E下載下傳量,月活使用者4.94E,71%來自海外,戰略合作夥伴主要以阿裡、百度、騰訊、小米…… 

<a href="http://dockerone.com/uploads/article/20161103/ea97b0738b238b97373e2ba92330c1e2.png" target="_blank"></a>

這麼大的海外使用者量我們是這麼做業務部署和服務的呢?

首先在選擇服務商的方面我們選擇了實力最強的亞馬遜AWS作為我們的雲服務商,我們海外幾乎所有的服務都是架構在AWS的平台上面。

這給我們帶來了什麼好處呢,總結起來有3點:

便捷的全球化部署

因為我們的使用者遍布全球,是以便捷的全球化部署是我們非常看重的,我們使用了AWS全球9個地區的region,其中包括美國3個,歐洲1個,亞太地區3個,南美洲1個,遍布全球 。

彈性的擴充

對于雲服務,彈性的擴充是最為便捷的,可以在幾分鐘(而不是幾小時或幾天)内增加或減少伺服器。可以同時管理一個、數百個,甚至數千個伺服器執行個體。當然,因為這全是通過Web服務或API控制。

成本的優化

而且無需前期的投資,持續的成本優惠與調整;提高了資源使用率,按需付費;無需出國,管理世界各地的伺服器,節約人力成本。

介紹完我們基礎平台的選擇後,為了更好的自動化,叢集化,我們開始接觸容器技術,而且是如何在AWS平台上實作容器化。

我們把容器的概念進行了解:給你的應用程式“打包”,能夠執行一個“程序”,同時能把你執行的内容和其他“程序隔離”開來的東西,容器化有什麼好處呢? 

<a href="http://dockerone.com/uploads/article/20161103/a09ae27a6cfa5db8a26f1542289566c8.jpg" target="_blank"></a>

這些好處在所有網站上看到的東西,聽完這個介紹,感覺有點空洞,還是不知道是什麼,我們用到的一些package,我再所有的系統裡面都可以運作這些程序,而且程序隔離開,為什麼還要Docker,這也是我們團隊剛剛接觸時遇到的困惑,除了Linux系統,最早提出容器化的VMware、Microsoft都有這方面的嘗試,隻不過他們的容器是虛拟機,而網際網路的發展需要一個輕量級的容器。

<a href="http://dockerone.com/uploads/article/20161103/c91f68b58b6b14494761845bca3c4fa6.jpg" target="_blank"></a>

這個圖是借鑒了Yahoo的架構,非常的可愛形象,比普通的架構圖更加生動,我們獵豹有很多廣告業務,商業的開發同學做的ADserver,也會有很多流式資料實時處理的系統,通過data highway彙聚到大資料處理系統,Hadoop、Spark計算,後端儲存我們用的是aws-s3。如果要完成這套系統,基礎架構,需要多少人力物力呢?可想而知,單單運維方面上百人的團隊就這樣建立起來了。

以往,我們一批機器隻做一件事,比如100個adserver隻做廣告接口,另外100台機器隻做廣告檢索,再有100台機器做資料傳輸處理,某個子產品出問題去擴容或者處理某個子產品,這是大家最常見的方法。這對架構的高可用設計是個很大學問,需要多機房備援,多地部署等等。如果引入微服務的概念呢? 

<a href="http://dockerone.com/uploads/article/20161103/4c4268395d919a4f47a8cc58775bf7f9.jpg" target="_blank"></a>

如左邊圖,一台機器上面隻運作各自的子產品和依賴,不同機器各司其職,出問題處理問題子產品。而右邊微服務的設計,我無所謂我的程式如何分布,每台host都可以部署多個子產品混合複用,自定義哪些子產品可以和哪些配置設定到同一台host,哪些子產品不能和哪些子產品配置設定到同一台host,一旦某個子產品挂掉,排程編排工具可以幫助馬上啟動一個新的docker替代工作。擴容的時候不需要針對不通子產品去部署和釋出,隻需要調整一下各個docker的數量即可。

下面我介紹一下我們線上穩定運作很久的一個RCV日志處理叢集的容器化改造過程,下圖是我們開始的架構圖: 

<a href="http://dockerone.com/uploads/article/20161103/79f605d25d93a634b733a60e143769b2.jpg" target="_blank"></a>

開始我們的架構很簡單,前端接收,經過各個子產品處理後存儲,然後統一進行處理分析,報表延遲很長,而且經常出問題需要手動補資料。

<a href="http://dockerone.com/uploads/article/20161103/d7493db53ac481a469f17a9317e4f0d2.png" target="_blank"></a>

後來我們對架構進行了容器話的改造,而且引入了資料流式處理,每個region部署一個收集叢集,frontend的資料可以buffer一周的時間,并且可以故障後續傳,通過Kafka彙總到我們的中央region的nrt系統進行準實時的資料彙總和分析,報表延遲可以控制到5分鐘以内,而且每個region的叢集都可以像管理一台機器一樣管理。 

<a href="http://dockerone.com/uploads/article/20161103/8deb3c8e984b7de1e868a8de187b1b45.png" target="_blank"></a>

這套系統我們團隊為他命名為Meissa,是獵戶座最亮的一顆星,他底層搭建在CoreOS上,用CoreOS隻帶的etcd和Fleet進行叢集的服務發現和編排管理,程式使用Docker進行打包,利用Jenkins進行釋出,images儲存在自建的docker-registry裡面供叢集使用。

<a href="http://dockerone.com/uploads/article/20161103/3d3e6af2037a854af5264365fa9cdf34.png" target="_blank"></a>

<a href="http://dockerone.com/uploads/article/20161103/ffb370673267041a9bebefea5731d058.png" target="_blank"></a>

在AWS上面開通一套CoreOS 的叢集非常友善,隻需要在AWS的鏡像倉庫裡面 選擇合适的CoreOS版本,編寫好user-data(Linux的cloud-init)傳入正确的cloud-config即可,這個可以參考CoreOS的官網。這裡說一下etcd token的使用,etcd的功能和ZooKeeper很相似,可以在私網自己通過IP定義leader的節點和數量,也可以通過官網進行token注冊,比較友善。

這裡舉個例子:

<a href="http://dockerone.com/uploads/article/20161103/d828dae707dd57ae7465f93c3657750c.png" target="_blank"></a>

一個叢集都用這個配置檔案(可以根據不同用途修改metadata的名字),開機後會自動發現叢集并且注冊到一起,如下圖:

<a href="http://dockerone.com/uploads/article/20161103/2d1ea7742d776b54462f8ba82a2d6864.png" target="_blank"></a>

這個是叢集清單,标注每個host的名字友善排程

<a href="http://dockerone.com/uploads/article/20161103/ab2a70dd80f51a0b8923155ec39d8285.png" target="_blank"></a>

這個是units清單,看這個@符号,後面有1234,4台機器上運作,之前服務端的同學寫個while true 腳本或者使用supervisor去判斷程式是否啟動,挂了拉起來,而且不可以跨伺服器去守護程序,fleet可以幫你在符合條件的units任意一台上面啟動這個服務,可以跨伺服器。

<a href="http://dockerone.com/uploads/article/20161103/c302d2be776bd487d9d00f8dae4b2f28.jpg" target="_blank"></a>

etcd的discovery key已經把各個leader節點資訊記錄到token的url裡面,同步到各個節點,去個各個節點做服務注冊和發現。 

<a href="http://dockerone.com/uploads/article/20161103/cbf9554161b6f6195c6657c8beccb644.png" target="_blank"></a>

使用fleetctl可以随需求安排程式的啟動,fleet相當于叢集版systemd。

<a href="http://dockerone.com/uploads/article/20161103/b6f5c9d72c2edecf50711d4bef7c22c7.png" target="_blank"></a>

fleet 配置檔案編寫的一些技巧,如何合理編排自己的服務 。

<a href="http://dockerone.com/uploads/article/20161103/6a9db5251766625946ffd9e5425a6724.png" target="_blank"></a>

CMD ENTRYPOINT不建議使用,add和cp都一樣,ENTRYPOINT可以傳參數,還是寫到run裡面ENTRYPOINT後面寫指令,“一個參數 空格 一個參數”,這樣寫的話轉義就出問題了,這是Docker的問題,用數組的方式[bash,-c];關閉程序用stop,不要直接kill程序,因為如果你寫了個shell腳本啟動你的程式,那麼這個程序的pid=1為bash,kill掉的是bash,而不是你的容器程式, 或者使用exec,這樣會把子程序替換父程序;docker的stop會有一個tw時間,預設應該是60s,如果你的程式關閉比較慢,比如kafka需要落磁盤,60秒不夠怎麼辦,可以手動傳入比較長的timeout時間;Docker預設的ulimit是1024,有時候發現你的Docker總是莫名重新開機,可以看看是不是ulimit用盡了。

Q:沒有用到Flannel,網絡實作是什麼,未來對CoreOS的容器管理工具rkt的計劃?

A:網絡上我們直接使用的host的方式,容器主要是看中了CI和CD的便利好沒有往高密度的場景設計的計劃,rkt是個好東西,更有開源的感覺,看後期Docker社群發展情況是否越來越封閉。

Q:registry怎麼ha的,是在容器還是VM?

A:這個問題之前也是一直困擾着我們,我們用AWS的ELB做負載均衡,後端放2台EC2,鏡像存到S3,緩存寫在Redis裡,我們是使用官方的image,随時用随時上傳和使用,挂了就再啟動一個,不依賴長期有效的hub。

Q:最近暴漏的安全問題需要核心更新才能解決,這正是CoreOS的優勢、不必重新開機系統,獵豹是否線上上有這種經驗?實際中CoreOS在更新核心時是否真那麼友善?

A:這個是我們非常喜歡的一個特性,自動更新核心,做過運維的同學都知道,做一次核心更新是多麼痛苦,我們最開始用的是stable766.4,現在都不用我們去更新就自動幫我們更新到8xx的stable版本了。

Q:叢集中etcd節點數目是多少,奇數個etcd節點的優勢具體怎麼展現的,以及etcd的代理節點在業務中的價值?

A:etcd很類似于ZooKeeper,leader節點必須是奇數個,我們一般是3個,最多5個,所有節點都會主動和leader節點通訊,leader節點可以運作在叢集任何節點上,也可以通過API接口手動調整leader節點所在的底層伺服器,很靈活,任何一台都可以選舉成leader,不用部署任何額外配置,省心。

Q:編排排程都是自己開發的系統嗎,如何管理那麼多的容器?

A:用的CoreOS自帶的子產品,etcd+fleet+systemd,很底層,登陸任何一台機器做操作就可以管理整個叢集,就像管理一台機器一樣,我們把日常釋出等操作基本都用Jenkins代勞了。

以上内容根據2016年10月25日晚微信群分享内容整理。分享人齊海澎(Kuma Qi),獵豹移動進階運維工程師。負責獵豹移動商業廣告産品與大資料相關産品的運維團隊管理,作為獵豹移動運維部的管理團隊成員,負責商業廣告業務和大資料計算在AWS服務上的穩定運作,并幫助公司開展容器技術的初步嘗試。3年AWS服務使用與運維經驗,運維全球8個region數以千計的計算服務資源,搭建并運維起跨5個地區的基于CoreOS的Docker叢集。 DockOne每周都會組織定向的技術分享,歡迎感興趣的同學加微信:liyingjiesz,進群參與,您有想聽的話題或者想分享的話題都可以給我們留言。

原文釋出時間為:2016-10-31

本文作者:齊海澎

本文來自雲栖社群合作夥伴Dockerone.io,了解相關資訊可以關注Dockerone.io。

原文标題:DockOne微信分享( 九十):獵豹移動基于CoreOS在AWS上的項目實踐