1. 程式人生 > >Docker跨伺服器通訊Overlay解決方案(下) Consul叢集

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

承接上文

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