云舒網絡:Rancher架構深度剖析
前言:
Rancher所有的服務都是運行在Container中,這給我們部署Rancher集群提供了非常大的便利, 不會像剛入門OpenStack那樣需要手動安裝每個組件讓人心力憔悴。但是手動部署的確讓我們知曉了一些其中內涵; Rancher給我們省去了部署的麻煩,但是作為技術人員我們若要去hold住Rancher,那么我們必須對它的架構了如指掌。
注:
本文初寫時Rancher還沒有Release正式版,所以架構每次小升級可能都會有些許變動, 需要聲明,下面內容已跟蹤至 Rancher-v0.59.0 版本。
本文來源:http://www.cloudsoar.com/about/BlogNews/content/0/141/v1.1/
整體架構分析
Rancher-server是Rancher的控制節點,負責管理接入的各個host節點,里面運行著rancher的核心組件Cattle, Rancher幾乎全部的服務都是用Golang寫的,而只有這個Cattle組件是Java寫的。
關于Cattle組件為什么是Java寫的,這里插播一段小故事。Rancher的創始人梁勝博士我們都知道是CloudStack創始人, CloudStack我們都知道是Java寫的。梁博士早期在Sun工作搞過JVM,所以用Java來做CloudStack也是技術繼承順理成章的事。 在做CloudStack過程中,出現了一個奇人,這哥們就是Darren Shepherd,Darren在另外一家名叫GoDaddy(賣域名那貨)的公司工作, 這哥們是重構狂,把CloudStack的核心引擎重寫了四五次。后來CloudStack被收購再后來梁博士出來搞Rancher就把Darren一起叫上, Darren在Rancher的代碼貢獻量可以用噸來計算了。所以這個Cattle大家如果細心一點,應該能找到CloudStack的影子。
故事插播完畢。相信隨著Rancher的不斷升級優化,Cattle肯定會被分拆成各個小組件,然后用Golang實現,這是后話。下面我們先用一張圖看下Rancher-server都包含了什么:

圖解:
1.)Supervise負責對Mysql和Cattle服務進行進程監控,保證服務不宕機;
2.)Cattle是Rancher的核心引擎,env/stack/service的邏輯管理,service的health check,調度策略等;
3.)websocket-proxy——通過UI查看Container log或是執行docker exec等,都是通過該服務代理到對應的rancher-host上執行,數據傳輸使用websocket協議;
4.)Rancher-Catalog-Service——Catalog是Rancher一個應用市場,里面包含官方提供的各種應用,用還包括一些rancher本身的服務,如external-dns服務和convoy服務等;
5.)Rancher-Compose-executor——Rancher-Compose CLI的服務端實現;
6.)go-machine-service——使用docker-machine來做rancher-host的管理,create/active/delete/purge等
Rancher-server管理的各個host節點,我們在添加它們時候都會在相應的host上啟動一個擁有Privilege權限的Container, 這個Container基于Rancher/Agent鏡像,它首先會連接Rancher-server驗證一個Secret & Key, 成功后再啟動一個Rancher/Agent container也是Privilege級別的,最終這個Container負責和Rancher-server保持連接,并接收各種操作的event。 如果當前host要使用Rancher Managed網絡,那么還會啟動一個基于 Rancher/Agent-Instance 鏡像的Container。 同樣如果添加了lb-service,lb-service也是基于Rancher/Agent-Instance來實現的。我們還是用一張圖來有一個整體感官的了解:

圖解:
1.)main-service是一個具有privileged權限的容器,負責和Rancher-service的Cattle引擎做通信,并管理host上的其他服務容器;
2.)Other-service是一個容器,負責給host上其他應用容器提供服務;
3.)每個LB-service都會在host上基于Rancher/Agent-Instance生成對應數量的容器。
值得一提的是Rancher-NET組件,從 v0.56 開始不用Racoon實現IPSec了,改成用Rancher-NET包裝StrongSwan, 用Charon實現IKE,從Rancher-NET的package架構看,未來是要實現多種backend,很期待VXLAN,VLAN的實現。 Docker-NETwork的接入應該只是時間問題。如果部署在內部環境里,用IPSec做網絡隔離還是有點重。
我們運行很多個Stack、Service之后,host上會有很多Container,我們會在Rancher-UI上看到Container的網絡是10.42.0.0/16, host上的Container之間的網絡是一種怎樣的形式呢?分析這個主要還是看Container的IP Addr &IP route, 以及host的iptables,我們還是一張圖來看一下:

Rancher-DNS& Rancher-MetaData 是我們需要了解的重點組件。我們使用的Service Link功能其實就是通過Rancher-DNS實現的, Rancher-MetaData與Confd結合可以讓我們在App-Container中動態載入配置, 另外Rancher的External-DNS也得依賴它,這個我會在后續的文章中具體描述。
host的內部網絡看過之后,我們來看看Container跨主機通信的實現,主要通過兩個UDP端口500 and 4500, 網絡流量出站入站通過host的IPtables規則處理,IP地址為172.17.0.2這個Container就是運行Rancher-NET的Container。

計算和網絡聊完,我們再來看看存儲。Rancher自己實現了一個Docker-Volume-Driver即Convoy。Convoy不生產存儲, 它只是存儲的搬運工,它相當于把各種存儲接口做一個統一的抽象,目前支持Device Mappe、GlusterFS/NFS、EBS等, 目前使用上可以參考Rancher-Catalog中的實現,我們可以在UI上看到Convoy GlusterFS & Convoy NFS, 如果你的環境中已經有NFS和GlusterFS的實現,填寫一些相關參數進行部署即可。 它主要做的事就是在每個host上部署Convoy-Agent服務并把對應的共享卷掛載上來,這樣每個App-Container就可以用過Convoy使用共享卷。

Ok,本次分享暫告一個段落,了解更多Rancher中文資訊敬請關注我們!
云舒網絡 http://www.cloudsoar.com 攜手Rancher Labs推出【Rancher | 實戰微信群】,在線為您分享Docker技術干貨,更有往期回顧精選期刊等你拿!
本群匯集了Rancher中國最強技術精英團隊及業內技術派高人,宗旨是為了大家擁有更專業的平臺交流Rancher實戰技術,實時與Rancher創始團隊面對面!同時歡迎各位分享自己的經驗、疑難問題,我們將定期邀請分享嘉賓做各類話題分享及回顧,共同實踐研究Docker容器生態圈。
對Rancher和Docker技術感興趣、或對本文中細節需繼續探討的朋友,歡迎加入本群參與討論!
加微信群方法:
1.關注【云舒網絡】公眾號
2.留言”我要加群”
QQ群號:216521218
