Docker跨伺服器通訊Overlay解決方案(下) Consul叢集
阿新 • • 發佈:2019-08-27
承接上文
本文基於上篇文章,詳細的場景說明與分析在前篇隨筆中業已記錄,有興趣可以移步 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
:指向當前要使用的網絡卡CONSUL_LOCAL_CONFIG
:新增服務的配置,容器建立後會生成local.json,json串會新增進來--restart=always
:啟動失敗自動重啟-v
掛載的資料目錄一般用於-sever
節點,其對映的位置與-data-dir
保持一致-join
:加入到其它節點-node
:當前節點名-data-dir
:資料儲存目錄,-server
節點才需要設定,只有server節點儲存資料
更詳細的引數說明
-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,可以使用
# 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學習與實踐文章,禁止布布扣、碼迷等第三方爬蟲網站爬取