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-store
與cluster-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學習與實踐文章,禁止布布扣、碼迷、愛碼網等第三方爬蟲網站爬取