Docker跨伺服器通訊Overlay解決方案(下) Consul集群

  • 2019 年 10 月 3 日
  • 筆記

承接上文

本文基於上篇文章,詳細的場景說明與分析在前篇隨筆中業已記錄,有興趣可以移步 Docker跨伺服器通訊Overlay解決方案(上) Consul單實例

本文主旨

本文為Docker使用Consul集群實現Overlay網路,解決Docker跨伺服器內網通訊問題。

整體架構為:Nginx + 3 x Conul

Consul集群搭建

環境說明

伺服器OS 主機IP Docker版本 網卡名 主機名
Ubuntu Server 18.04 LTS 192.168.87.133 18.09.6 ens33 hz
Ubuntu Server 18.04 LTS 192.168.87.139 18.09.7 ens33 hz2
Ubuntu Desktop 18.04 LTS 192.168.87.135 18.09.7 ens33 hz3

搭建過程

133伺服器

docker run -d --network host -h node1 --name=consul-leader       -e CONSUL_BIND_INTERFACE=ens33       -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}'       --restart=always       -v /home/hellxz/consul-data:/tmp/consul       consul:1.5.2 agent -server -bind=192.168.87.133 -bootstrap-expect=3       -node=node1 -data-dir=/tmp/consul -client 0.0.0.0 -ui

139伺服器

docker run -d --network host -h node2 --name=consul-server       -e CONSUL_BIND_INTERFACE=ens33       -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}'       --restart=always       -v /home/hellxz/consul-data:/tmp/consul       consul:1.5.2 agent -server -bind=192.168.87.139 -join=192.168.87.133       -node=node2 -data-dir=/tmp/consul -client 0.0.0.0 -ui

135伺服器

docker run -d --network host -h node3 --name=consul-server2       -e CONSUL_BIND_INTERFACE=ens33       -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}'       --restart=always       -v /home/hellxz/consul-data:/tmp/consul       consul:1.5.2 agent -server -bind=192.168.87.135 -join=192.168.87.133       -node=node3 -data-dir=/tmp/consul -client 0.0.0.0 -ui

常用參數說明

  • CONSUL_BIND_INTERFACE:指向當前要使用的網卡,這裡一定要注意自己ip對應的網卡
  • CONSUL_LOCAL_CONFIG:添加服務的配置,容器創建後會生成local.json,json串會添加進來
  • --restart=always:啟動失敗自動重啟
  • -v掛載的數據目錄一般用於-sever節點,其映射的位置與-data-dir保持一致
  • -join:加入到其它節點
  • -node:當前節點名
  • -data-dir:數據保存目錄,-server節點才需要設置,只有server節點保存數據
  • -bind:綁定自己展示的ip,這裡最好是寫宿主機的ip

更詳細的參數說明

-advertise:通知展現地址用來改變我們給集群中的其他節點展現的地址,一般情況下-bind地址就是展現地址  -bootstrap:用來控制一個server是否在bootstrap模式,在一個datacenter中只能有一個server處於bootstrap模式,當一個server處於bootstrap模式時,可以自己選舉為raft leader。  -bootstrap-expect:在一個datacenter中期望提供的server節點數目,當該值提供的時候,consul一直等到達到指定sever數目的時候才會引導整個集群,該標記不能和bootstrap公用  -bind:該地址用來在集群內部的通訊,集群內的所有節點到地址都必須是可達的,默認是0.0.0.0  -client:consul綁定在哪個client地址上,這個地址提供HTTP、DNS、RPC等服務,默認是127.0.0.1  -config-file:明確的指定要載入哪個配置文件  -config-dir:配置文件目錄,裡面所有以.json結尾的文件都會被載入  -data-dir:提供一個目錄用來存放agent的狀態,所有的agent允許都需要該目錄,該目錄必須是穩定的,系統重啟後都繼續存在  -dc:該標記控制agent允許的datacenter的名稱,默認是dc1  -encrypt:指定secret key,使consul在通訊時進行加密,key可以通過consul keygen生成,同一個集群中的節點必須使用相同的key  -join:加入一個已經啟動的agent的ip地址,可以多次指定多個agent的地址。如果consul不能加入任何指定的地址中,則agent會啟動失敗,默認agent啟動時不會加入任何節點。  -retry-join:和join類似,但是允許你在第一次失敗後進行嘗試。  -retry-interval:兩次join之間的時間間隔,默認是30s  -retry-max:嘗試重複join的次數,默認是0,也就是無限次嘗試  -log-level:consul agent啟動後顯示的日誌資訊級別。默認是info,可選:trace、debug、info、warn、err。  -node:節點在集群中的名稱,在一個集群中必須是唯一的,默認是該節點的主機名  -protocol:consul使用的協議版本  -rejoin:使consul忽略先前的離開,在再次啟動後仍舊嘗試加入集群中。  -server:定義agent運行在server模式,每個集群至少有一個server,建議每個集群的server不要超過5個  -syslog:開啟系統日誌功能,只在linux/osx上生效  -ui-dir:提供存放web ui資源的路徑,該目錄必須是可讀的  -pid-file:提供一個路徑來存放pid文件,可以使用該文件進行SIGINT/SIGHUP(關閉/更新)agent

查看Consul集群狀態

訪問其中一個節點即可看到集群狀態

注意事項

每台運行docker的主機都不能同hostname,可以使用

$ sudo hostnamectl set-hostname your-new-hostname

同hostname會導致同名的主機docker無法互相通訊

光有consul集群是不夠的,docker只能配置一個註冊的url,所以需要做負載均衡,這裡使用nginx

Nginx配置

Nginx安裝參考http://nginx.org/en/docs/install.html

配置只需要在/etc/nginx/nginx.conf下添加監聽與負載均衡的配置

這裡將nginx配置在了我的win10上,ip: 10.2.7.59 配置在別處也是一樣的

如以下關鍵片段:

http {      include       mime.types;      default_type  application/octet-stream;      sendfile        on;      keepalive_timeout  65;        #consul集群負載均衡      upstream consul {          server 192.168.87.133:8500; #可以通過添加weight進行加權重          server 192.168.87.139:8500;          server 192.168.87.135:8500;      }      #監聽本機8500埠,轉發到upstream consul下      server {          listen 8500;          location / {              proxy_pass http://consul;          }      }  }

保存,重啟nginx

配置各服務節點docker daemon

修改 /etc/docker/daemon.json

添加cluster-storecluster-advertise配置

  {      "registry-mirrors": ["https://7uuu3esz.mirror.aliyuncs.com"],      "log-driver":"json-file",      "log-opts": {"max-size":"500m", "max-file":"3"},      "insecure-registries": ["10.2.7.70:5000"],      "cluster-store": "consul://10.2.7.59:8500",      "cluster-advertise": "ens33:2375"    }
  • cluster-store配置的是nginx監聽的地址
  • cluster-advertise指定的是docker的宿主機註冊到consul中的指定網卡中的ip,也可以寫ip和埠號,埠只要沒被佔用就可以了

重啟docker

$ sudo systemctl daemon-reload  $ sudo systemctl restart docker

測試

等待docker重啟完畢,進入consul的UI

我們可以發現Key/Value下有了docker的key,點開docker有了如上圖的docker daemon註冊的資訊

在以上列表中的133節點上創建個overlay網路 my-overlay-test

$ docker network create -d overlay my-overlay-test

後續的在上篇文章已經測試過了,本文結束,如有問題,望不吝評論!

本文系Hellxz學習與實踐文章,禁止布布扣、碼迷、愛碼網等第三方爬蟲網站爬取