承接上文
本文基於上篇文章,詳細的場景說明與分析在前篇隨筆中業已記錄,有興趣可以移步 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學習與實踐文章,禁止布布扣、碼迷、愛碼網等第三方爬蟲網站爬取