本文由4月12日晚姜江,新東方運維工程師所作的技術分享整理而成。html
姜江,一名僞SRE。十餘年IT運維從業經歷,早年在金融行業從事linux,AIX,Oracle的運維支持,如今專一於運維自動化、容器和cloud native相關技術的研究和落地。目前就任於新東方,負責新東方容器雲平臺的探索和實踐。mysql
搜索微信號RancherLabsChina,添加Rancher小助手爲好友,可加入官方技術交流羣,實時參加下一次分享~linux
你們好!話說加入Rancher官方微信羣也有三年多了,天天在羣裏看着你們討論技術問題給我不少啓發 。 我今天也來和你們分享一下我在rancher上的一些實踐,但願能爲各位的實踐提供一些參考。nginx
爲了不你們歧義,下面說的Rancher指的Rancher 1.6 上的cattle引擎。sql
Rancher是一個對用戶很友好的產品,吸引了大批的用戶和粉絲。在實際落地過程當中,你們可能已經注意到Rancher組件之間的耦合存在單點。那麼如何部署才能提升Rancher的可用性和可擴展性呢?Rancher在官方文檔中給出了一些指導方案,用戶能夠根據本身的須要選擇合適的方案落地。我今天和你們分享的是新東方在Rancher全組件負載均衡架構的實踐,供你們在探索本身的高可用方案時作個參考。docker
Rancher 1.6是一套小巧而實用的容器管理平臺,我我的認爲Rancher的定位應該是容器編排引擎的後臺支撐系統, 或者說是編排引擎的系統,所以Rancher1.6的架構並非分佈式架構,而是傳統的C/S架構。 無數的client(agent)鏈接到一箇中心的Server ,中心的Server鏈接一個數據庫作持久化。這種架構就必然會涉及一個老話題,如何加強C/S之間的高可用性、可擴展性和解耦問題。我今天和你們聊內容是:Rancher 1.6 全組件負載均衡設計。數據庫
通常Rancher的簡單部署方案是這樣的: 一個server,一些節點 ,一個mysql數據庫。從這張圖上就能夠發現Rancher在部署上的一些問題:centos
SPOF問題,Server的單點,數據庫的單點等。瀏覽器
擴展性問題,單server能帶動的client數量有限。tomcat
強耦合問題,server 寫死數據庫地址,client寫死server地址等等。
總結下來就是下面這個圖:
下面就對這個架構進行優化,咱們的目標是達到Server/Client 和數據庫三個組件的自由擴展,如何作到呢? Rancher官方文檔中已經給了答案,只須要在C/S 中間增長一層負載均衡方案,在數據庫一側增長高可用方案便可。
整體架構就演變爲這樣:
咱們看到,Server一側使用Rancher Server HA方案,將server擴展爲多個。
中間增長一層負載均衡,這個負載均衡常見的私有云方案有LVS+Nginx或者F5, 在公有云中可使用阿里雲的SLB或者AWSELB等等。Rancher的數據量並不算太大,能夠簡單的使用Mysql的主從方案。
優化到這步已經能夠知足平常工做須要了,這裏你們會注意到mysql主從仍是會影響server的可靠性。 一旦出現主庫問題,Mysql切換的時候server確定就down了, 切換也須要必定的時間,啓動後還須要重啓server等等。若是但願更進一步提升server的可靠性,或者但願數據庫切換對Rancher Server透明,那就須要使用更高級的數據庫高可用方案。
咱們的DBA推薦使用Maxscale中間件+Galera 集羣的方案, Galera爲多主庫的分佈式數據方案,發生寫入操做後Galera會同步數據到其餘數據庫中,直到同步都完成後返回完成寫入操做。MaxScale是數據庫中間件,它經過解析mysql協議判斷讀寫操做,能夠將讀寫操做分離。一旦數據庫發生故障整個數據庫集羣的切換對外界是無感知的。
這個方案的部署圖是這樣的:
每一個組件都介紹一下, 負載均衡採用互聯網最經常使用的LVS-DR+Nginx方案。數據庫採用Galera集羣作多主庫的數據庫複製,經過Maxscale中間件來作高可用和讀寫分離。
這就是咱們如今最終的架構, 這個架構的好處有幾點:
可靠性大大增長, 全部組件均可以擴展,server, client,數據庫和負載均衡自己。
每一個組件的擴展並不影響其餘組件,全部組件的擴展均可以在線進行。
配置解耦,經過域名映射的方式,server鏈接數據庫的域名映射爲maxsacle中間件的ip, client鏈接server的域名映射爲負載均衡的Vip。
故障切換透明,對其餘組件無感知。數據庫故障,server故障均可以在線解決,解決後從新加入集羣。
順便提一下,這個架構中的數據庫部分還能夠進一步優化爲:
MaxScale前增長一層LVS四層負載均衡(設備可複用c/s之間的負載均衡),那麼這個方案就能夠說是全模塊無死角的負載均衡架構了。 可是咱們實際實施的時候並無採用這樣的方案,考慮到 Rancher Server 和 Client斷開一段時間後並不會影響主機上的容器運行。
這段時間徹底能夠作一些維護, 採用 Galera和Maxscale後已經大大的減小了數據庫切換時間,而且實測MaxScale的穩定性很好,感受沒有必要再投入更多資源在MaxScale上。更況且加入更多的組件會使得整個系統的複雜度上升,這實際上增長了維護成本而且擴展了故障域,可靠性有可能不升反降。所以這個方案也只是停留在紙面上了。
那麼說到這裏你們對總體架構就有了初步認識,下面說說實現。
篇幅和時間緣由,我這裏只是點一下配置的要點,具體的實踐過程能夠關注個人工做筆記 http://jiangjiang.space
2.1 LVS-DR + Nginx
LVS-DR設置:
LVS1 : 配置keepalived,配置虛擬ip,配置到Nginx1和Nginx2的四層轉發
LVS2 : 配置keepalived,配置虛擬ip,配置到Nginx1和Nginx2的四層轉發
Nginx1 :配置nginx 到 rancher server 8080 上的七層轉發
Nginx2 :配置nginx 到 rancher server 8080 上的七層轉發
**A. 安裝keepalived 和 ipvsadmin **
LVS從2.6內核開始就已是內核的一部分了,所以只須要安裝ipvsadmin和keepalived,經過yum安裝或者源碼安裝均可以,步驟略過。
B. 配置keepalived.conf
vi /etc/keepalived/conf/rancher.conf
**C. Nginx節點配置 **
Nginx節點配置分爲兩部分:
1.虛擬IP(VIP)設置到迴環設備上(lo),當接收到lvs發來的包後本機網卡纔會處理這些包。
2.設置Nginx的Websocket轉發到rancher server的8080端口上。
VIP配置在lo上的配置:
下面設置Nginx的Websocket轉發到Rancher server的8080端口上。 安裝nginx過程略過,在conf.d中增長虛擬主機配置。 vi /usr/local/nginx/conf/conf.d/rancher.conf
配置好後,直接訪問 http://VIP:80 應該就能夠看到Rancher控制檯界面了。若是沒有則是配置錯誤,繼續調整。
參考文檔:
http://www.javashuo.com/article/p-owhdiesx-bh.html
2.2 galera 和 Maxscale
如下步驟摘自新東方資深DBA傅少峯的文檔。
https://mariadb.com/downloads 下載並安裝mariadb 10.2
安裝以下rpm包
MariaDB-client-10.2.11-1.el7.centos.x86_64
MariaDB-devel-10.2.11-1.el7.centos.x86_64
MariaDB-server-10.2.11-1.el7.centos.x86_64
MariaDB-common-10.2.11-1.el7.centos.x86_64
MariaDB-compat-10.2.11-1.el7.centos.x86_64
galera-25.3.22-1.rhel7.el7.centos.x86_64.rpm
jemalloc-3.6.0-1.el7.x86_64.rpm
jemalloc-devel-3.6.0-1.el7.x86_64.rpm
maxscale-2.1.16-1.centos.7.x86_64.rpm
maxscale-devel-2.1.16-1.centos.7.x86_64.rpm
maxscale能夠複用其中一個數據庫節點或者單獨部署到一個機器。
mysql配置注意的地方,其餘參數省略。
galera配置
執行:
創建cattle數據庫和用戶(鏈接任何一個galera實例執行):
建立maxscale監控用戶(鏈接任何一個galera實例執行):
數據庫準備完畢,下面是配置MaxScale。
MaxScale配置
配置文件: /etc/maxscale.cnf
啓動 maxscale
參考資料:
https://www.jianshu.com/p/772e17c10e08
https://linux.cn/article-5767-1.html#3_2234
2.3 server 、client 和 數據庫的鏈接和設置
數據庫準備好了,下面就能夠啓動server了。啓動過程很是簡單,只須要修改rancher server的啓動參數以下:
逐條解釋一下:
Server啓動後就能夠增長client了,登錄Rancher管理控制檯,選擇infrastructure->Hosts->Add Host
這樣一個完整的負載均衡的Rancher就搭建完成了。
如今說最後一個話題,應用交付和負載均衡。 所謂應用交付說的是如何將Rancher上的一個應用公佈到公網上給用戶使用。爲了能在前方接住大量的用戶請求,通常都會統一搭建站點級別的入口負載均衡。示意圖以下:
如圖所示,用戶請求從公網進來後,經過各路ISP接入設備到達站點邊緣,鏈接經過各類防護設備到達入口負載均衡(LVS+Keepalived+Nginx),再由入口負載均衡統一代理到內部源站點上,這就是常見的應用交付過程。
在Rancher上的應用對接入口負載均衡通常採用Traefik, Traefik是一個容器化7層代理軟件,性能接近Nginx。 以前羣裏也有多位大拿分享過Traefik的應用, 我這裏就不重複介紹了,你們能夠參考愛醫康架構師張新峯的分享:《關於高可用負載均衡的探索》
我下面要講的是 traefik與 LVS+Nginx負載均衡的對接和我對traefik的一些實踐。
利用traefik交付應用的整個過程我總結爲下圖:
用戶在瀏覽器中輸入www.myxdf.com,經過DNS查詢到這個域名對應的公網ip地址。
這個公網ip地址指向咱們站點的入口負載均衡(LVS+Nginx),入口負載均衡收到請求後根據域名的設置,將請求轉發給Rancher 上的Traefik節點,我稱這些節點爲Ranhcer edge。
traefik收到請求後,根據traefik.frontend.rule將請求轉給打了標記的容器(或者rancher lb)
根據這個流程咱們須要作如下幾個配置。
3.1 定義邊界(rancher edge host)
什麼是邊界? 邊界就是Rancher cluster中對外轉發的中轉站,邊界是特殊的一個Rancher host,邊界上只跑treafik,其餘什麼容器都不跑,邊界最好也不要接入任何存儲(好比Rancher nfs),邊界須要作嚴格的安全加固。 固然也能夠不將邊界放在專門的host上,能夠將邊界混合到整個Rancher 集羣中,這樣的好處是節省計算資源,兩種模式均可以。
下面介紹如何將host定義爲專門的邊界節點:在Ranhcer 控制檯上, 打開 infrastructure ,點擊Hosts中。找到做爲邊界的host點擊Edit:
在Labels中增長label,增長這個label後traefik就會自動運行在這臺host上。
在 Required Container Label 中隨便增長一個lable不用給值, 我這裏寫的cn.xdf.edge
這個lable加入後,這個節點上就不會被調度任何其餘容器了。這樣一個邊界節點就製做好了。
3.2 啓動traefik 到 邊界節點
在社區商店中找到這個可愛的小交警,啓動traefik。
配置說明以下:
好了啓動traefik後,容器已經在edge Host 上啓動了!
登錄管理界面看看:
3.3 在traefik上發佈應用服務
假設如今要把mydockerapp04.myxdf.com這個域名的應用發佈出去。 首先將mydockerapp04.myxdf.com這個域名匹配到對應的Rancher stack上面去。
這個就是咱們的mydockerapp04應用, 它是一些tomcat容器和一個內部lb組成的。
按照traefik的文檔,只須要將label打到容器上便可,這裏個人作法是增長了一個內部的lb,直接將label打在lb上。這裏必須的label是:
label加入後應用就發佈到traefik中了。
3.4 從站點入口負載均衡轉發到Traefik
在站點入口負載均衡上作轉發配置,轉發到treafik邊界節點。 負載均衡上全部源站都是經過80端口轉發,經過設置不通的server_name來區分轉發目的地。將server_name設置爲*.myxdf.com 。意思是全部 myxdf.com的二級域名所有轉發給traefik,這樣作是爲了跳過在入口負載均衡上配置明細轉發規則(好比mydockerapp01轉發到哪裏這樣的一條一條的規則),全部明細的轉發規則所有交給traefik來管理。
這樣作有很大的優點,咱們以前也看到了traefik設置轉發規則很是簡單,只須要在容器或者ranhcer lb上打label便可。若是須要修改或者刪除規則,也只須要修改或刪除對應的label便可,管理靈活又免去了每次都要手動到入口負載均衡上刷新配置的麻煩。
Nginx配置以下:
3.5 在DNS上設置域名指向站點入口負載均衡
在DNS上添加域名指向, 這裏就沒有辦法偷懶了,須要把全部明細域名都寫上。
若是你不是公網應用,也可使用dnsmasq或者bind 甚至 AD域的DNS 等在內網創建DNS指向,DNS指向的IP爲內網LVS的vip。
Rancher裏面也有修改DNS的APP,好比aliyun DNS、Gandi.net 等等。這些APP有的是自動添加DNS記錄的,有的是根據label添加,你們有興趣能夠繼續研究下。
至此, 整個轉發過程就完成了。 用戶已經能夠經過外網訪問這個應用了。
經過瀏覽器:打開 mydockerapp04.myxdf.com
固然這個域名其實並不存在,是我瞎掰的,只爲了方便你們理解這個過程。那麼今天的分享也就結束了。