基于Docker + Consul + Nginx + Consul-Template + Registrator的服務自動負載均衡實現(xiàn)

基于Docker + Consul + Nginx + Consul-Template + Registrator的服務自動負載均衡實現(xiàn)

本文搭建的consul為單節(jié)點版本 吸申, 集群版 參考文章1

參考文章:

  1. 基于Docker + Consul + Nginx + Consul-Template的服務負載均衡實現(xiàn)
  2. 用 consul + consul-template + registrator + nginx 打造真正可動態(tài)擴展的服務架構
  3. 8分鐘學會Consul集群搭建及微服務概念

docker-composer相關知識點

  • ports 暴露容器端口到主機的任意端口或指定端口, 用法如下
ports:
 
    - "80:80" # 綁定容器的80端口到主機的80端口
     
    - "9000:8080" # 綁定容器的8080端口到主機的9000端口
     
    - "443" # 綁定容器的443端口到主機的任意端口晰甚,容器啟動時隨機分配綁定的主機端口

  • links 使得docker容器間通過指定的名字來和目標容器通信

如果使用links則容器間通信 只能通過該使用容器的ip地址來通信或者通過宿主機的ip加上容器暴露出的端口號來通信 (這兩種都有弊端)

links:
    -  consul_server_master:consul # 當前容器中使用consul 即可獲取容器consul_server_master的ip地址,便于通信
  • depends_on 決定容器的依賴, 也就是指定當前容器的啟動順序,必須依賴啟動后才會啟動
depends_on:
    - lb
    - registrator

consul 相關知識點

  • Client模式 就是客戶端模式剩檀。是 Consul 節(jié)點的一種模式桨嫁,這種模式下蔚润,所有注冊到當前節(jié)點的服務會被轉發(fā)到 Server训貌,本身是不持久化這些信息。
  • Server模式 表明這個 Consul 是個 Server 康二,這種模式下碳胳,功能和 Client 都一樣,唯一不同的是沫勿,它會把所有的信息持久化的本地挨约,這樣遇到故障味混,信息是可以被保留的。同時可以同步多個consul客戶端的數(shù)據(jù)

    Server 節(jié)點之間的數(shù)據(jù)一致性保證協(xié)議使用的是 raft诫惭,而 zookeeper 用的 paxos翁锡,etcd采用的也是raft

 command: consul agent -server -bootstrap-expect 1 -advertise 192.168.1.181 -node consul_server_master -data-dir /tmp/data-dir -client 0.0.0.0 -ui
 # -bootstrap-expect=2 表示節(jié)點個數(shù)為2個
 # -node=consul-server-1 表示節(jié)點名稱為consul-server-1
 # -client=0.0.0.0 表示允許連接的客戶端 IP
 # -bind=10.211.55.2 表示服務端 IP為10.211.55.2
 # -datacenter=dc1 數(shù)據(jù)中心名稱
 # -join=10.211.55.4 表示加入10.211.55.4節(jié)點的集群
 
  • 服務發(fā)現(xiàn)協(xié)議 Consul 采用 http 和 DNS 協(xié)議,etcd 只支持 http
    服務注冊:Consul 支持兩種方式實現(xiàn)服務注冊夕土,一種是通過 Consul 的服務注冊 Http API馆衔,由服務自己調用 API 實現(xiàn)注冊,另一種方式是通過 json 格式的配置文件實現(xiàn)注冊怨绣,將需要注冊的服務以 json 格式的配置文件給出角溃。Consul 官方建議使用第二種方式。
  • 服務定義參數(shù)
環(huán)境變量Key 環(huán)境變量Value 說明
SERVICE_ID web-001 可以為GUID或者可讀性更強變量篮撑,保證不重復
SERVICE_NAME web 如果ID沒有設置减细,Consul會將name作為id,則有可能注冊失敗
SERVICE_TAGS nodejs,web 服務的標簽赢笨,用逗號分隔未蝌,開發(fā)者可以根據(jù)標簽來查詢一些信息
SERVICE_IGNORE Boolean 是否忽略本Container,可以為一些不需要注冊的Container添加此屬性

實現(xiàn)原理

  • 通過 Nginx 自身實現(xiàn)負載均衡和請求轉發(fā)
  • 通過 Consul-template 的 config 功能實時監(jiān)控 Consul 集群節(jié)點的服務和數(shù)據(jù)的變化茧妒;
    實時的用 Consul 節(jié)點的信息替換 Nginx 配置文件的模板树埠,并重新加載配置文件

Consul-template 和 nginx 必須安裝在同一臺機器上,因為 Consul-template 需要動態(tài)修改 nginx 的配置文件 nginx.conf嘶伟,然后執(zhí)行 nginx -s reload 命令進行路由更新,達到動態(tài)負載均衡的目的

  • registrator又碌,它可以通過跟本地的 docker 引擎通信九昧,來獲取本地啟動的容器信息,并且注冊到指定的服務發(fā)現(xiàn)管理端毕匀。

數(shù)據(jù)流向: docker 容器數(shù)據(jù)-> registrator -> consul ->consul-template -> nginx

鏡像構建

  • Consul:consul:latest
  • Registrator:gliderlabs/registrator:latest
  • Nginx和Consul-template:liberalman/nginx-consul-template:latest
  • Web: yeasy/simple-web:latest

docker-compose.yml

version: '3'
#backend web application, scale this with docker-compose scale web=3
services:
    web:
      image: yeasy/simple-web:latest
      environment:
        - SERVICE_80_NAME=my-web-server
      ports:
      - "80"
      depends_on:
          - lb
          - registrator  

    #load balancer will automatically update the config using consul-template
    lb:
      image: liberalman/nginx-consul-template:latest
      hostname: lb
      environment:
          - SERVICE_IGNORE=true
      links:
      -  consul_server_master:consul
      ports:
      - "80:80"
      depends_on:
          - consul_server_master
          
    consul_server_master:
      image:  consul:latest
      hostname: consul_server_master
      environment:
          - SERVICE_IGNORE=true
      ports:
      - "8500:8500"
      command: consul agent -server -bootstrap-expect 1 -node consul_server_master -data-dir /tmp/consul -client 0.0.0.0 -ui

    # listen on local docker sock to register the container with public ports to the consul service
    registrator:
      image: gliderlabs/registrator:master
      hostname: registrator
      environment:
          - SERVICE_IGNORE=true
      links:
      - consul_server_master:consul
      depends_on:
          - consul_server_master
      volumes:
      - "/var/run/docker.sock:/tmp/docker.sock"
      command: -internal consul://consul:8500

測試步驟

  1. docker-compose 模板所在目錄铸鹰,執(zhí)行
$ sudo docker-compose up
  1. 訪問 http://localhost 可以看到一個 web 頁面,提示實際訪問的目標地址皂岔。
#2019-12-20 04:12:30: 19 requests from <LOCAL: 172.17.0.6> to WebServer <172.17.0.4>
  1. 增加web 測試負載
$ sudo docker-compose scale web=3
  1. 重復刷新http://localhost 觀察ip變化

總結測試

最先我未去指定容器的啟動順序(deponds_on) 導致docker-compose up 后訪問http://localhost 報錯 nginx 502
原因是因為 registrator容器先于web容器啟動蹋笼,導致未將web容器注冊到consul 所以生成的nginx配置文件中,沒用web參與負載

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末躁垛,一起剝皮案震驚了整個濱河市剖毯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌教馆,老刑警劉巖逊谋,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異土铺,居然都是意外死亡胶滋,警方通過查閱死者的電腦和手機板鬓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來究恤,“玉大人俭令,你說我怎么就攤上這事〔克蓿” “怎么了抄腔?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窟赏。 經(jīng)常有香客問我妓柜,道長,這世上最難降的妖魔是什么涯穷? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任棍掐,我火速辦了婚禮,結果婚禮上拷况,老公的妹妹穿的比我還像新娘作煌。我一直安慰自己,他們只是感情好赚瘦,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布粟誓。 她就那樣靜靜地躺著,像睡著了一般起意。 火紅的嫁衣襯著肌膚如雪鹰服。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天揽咕,我揣著相機與錄音悲酷,去河邊找鬼。 笑死亲善,一個胖子當著我的面吹牛设易,可吹牛的內容都是我干的。 我是一名探鬼主播蛹头,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼顿肺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渣蜗?” 一聲冷哼從身側響起屠尊,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耕拷,沒想到半個月后知染,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡斑胜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年控淡,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫌吠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡掺炭,死狀恐怖辫诅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情涧狮,我是刑警寧澤炕矮,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站者冤,受9級特大地震影響肤视,放射性物質發(fā)生泄漏。R本人自食惡果不足惜涉枫,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一邢滑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愿汰,春花似錦困后、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吗跋,卻和暖如春侧戴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跌宛。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工救鲤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秩冈。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像斥扛,于是被迫代替她去往敵國和親入问。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容