簡體   English   中英

如何在多主機之間創建docker overlay網絡?

[英]how to create docker overlay network between multi hosts?

我一直在嘗試在兩台主機之間創建一個覆蓋網絡但沒有成功。 我一直收到錯誤消息:

mavungu@mavungu-Aspire-5250:~$ sudo docker -H tcp://192.168.0.18:2380 network create -d overlay myapp
Error response from daemon: 500 Internal Server Error: failed to parse pool request for address space "GlobalDefault" pool "" subpool "": cannot find address space GlobalDefault (most likely the backing datastore is not configured)

mavungu@mavungu-Aspire-5250:~$ sudo docker network create -d overlay myapp
[sudo] password for mavungu:
Error response from daemon: failed to parse pool request for address space "GlobalDefault" pool "" subpool "": cannot find address space GlobalDefault (most likely the backing datastore is not configured)

我的環境細節:

mavungu@mavungu-Aspire-5250:~$ sudo docker info Containers: 1
Images: 364 Server Version: 1.9.1 Storage Driver: aufs Root Dir:
/var/lib/docker/aufs Backing Filesystem: extfs Dirs: 368 Dirperm1
Supported: true Execution Driver: native-0.2 Logging Driver:
json-file Kernel Version: 3.19.0-26-generic Operating System: Ubuntu
15.04 CPUs: 2 Total Memory: 3.593 GiB Name: mavungu-Aspire-5250 Registry: https://index.docker.io/v1/ WARNING: No swap limit support

我有一個swarm集群與consul一起工作作為發現機制:

mavungu@mavungu-Aspire-5250:~$ sudo docker -H tcp://192.168.0.18:2380 info 

Containers: 4 
Images: 51 
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 2
mavungu-Aspire-5250: 192.168.0.36:2375
└ Containers: 1
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 3.773 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.19.0-26-generic, operatingsystem=Ubuntu 15.04, storagedriver=aufs
mavungu-HP-Pavilion-15-Notebook-PC: 192.168.0.18:2375
└ Containers: 3
└ Reserved CPUs: 0 / 4
└ Reserved Memory: 0 B / 3.942 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.2.0-19-generic, operatingsystem=Ubuntu 15.10, storagedriver=aufs
CPUs: 6
Total Memory: 7.715 GiB
Name: bb47f4e57436

我的領事可以在192.168.0.18:8500 ,它適用於群集群。

我希望能夠在兩台主機上創建一個覆蓋網絡。 我已使用以下附加設置在兩台主機上配置了docker引擎:

DOCKER_OPTS="-D --cluster-store-consul://192.168.0.18:8500 --cluster-advertise=192.168.0.18:0"

DOCKER_OPTS="-D --cluster-store-consul://192.168.0.18:8500 --cluster-advertise=192.168.0.36:0"

我必須停止並重新啟動引擎並重置群集群集...在無法創建覆蓋網絡后,我將--cluster-advertise設置更改為:

DOCKER_OPTS="-D --cluster-store-consul://192.168.0.18:8500 --cluster-advertise=192.168.0.18:2375"

DOCKER_OPTS="-D --cluster-store-consul://192.168.0.18:8500 --cluster-advertise=192.168.0.36:2375"

但它仍然沒有用。 我不確定應該為--cluster-advertise=設置什么ip:port。 關於這個廣告的文檔,討論和教程並不清楚。

我在這里遇到了一些問題。 請幫忙。

執行--net myapp docker run命令時,請務必添加--net myapp 這是一個完整的分步教程( 在線版本 ):

如何在具有多主機網絡的群集上部署群集

TL; DR:使用Swarm部署多主機網絡的分步教程。 我想盡快在線提供這個教程,所以我甚至沒有花時間進行演示。 markdown文件可以在我網站的github上找到 隨意適應和分享,它是根據知識共享署名4.0國際許可證授權

先決條件

環境

Swarm管理器和consul master將在名為bugs20的機器上運行。 其他節點,bugs19,bugs18,bugs17和bugs16,將是swarm代理和consul成員。

在我們開始之前

Consul用於多主機網絡,可以使用任何其他鍵值存儲 - 請注意引擎支持Consul Etcd和ZooKeeper 令牌(或靜態文件)用於群體代理發現。 令牌使用REST API,首選靜態文件。

網絡

網絡范圍為192.168.196.0/25。 名為bugsN的主機的IP地址為192.168.196.N.

docker守護進程

所有節點都運行docker守護進程,如下所示:

 /usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-advertise eth0:2375 --cluster-store consul://127.0.0.1:8500 
選項細節:
 -H tcp://0.0.0.0:2375 

結合守護程序接口以允許是的一部分簇。 顯然可以對IP地址進行說明,如果您有多個NIC,這是一個更好的解決方案。

 --cluster-advertise eth0:2375 

定義docker守護程序用於通告自身的接口和端口。

 --cluster-store consul://127.0.0.1:8500 

定義分布式存儲后端的URL。 在我們的案例中,我們使用consul ,盡管還有其他可以使用的發現工具,如果您想下定決心,您應該對閱讀此服務發現比較感興趣。

隨着consul的分發,URL可以是本地的(請記住, swarm代理也是consul成員),這更靈活,因為您不必指定consul master的IP地址,並在docker守護程序啟動后選擇。

使用的別名

在以下命令中,使用了這兩個別名:

-node=master20

一定要在$PATH中使用consul二進制文件的$PATH 一旦進入目錄,只需輸入export PATH=$PATH:$(pwd)

還假設已正確設置和導出變量$IP 這可以完成,多虧了.bashrc.zshrc或者像這樣:

 export IP=$(ifconfig |grep "192.168.196."|cut -d ":" -f 2|cut -d " " -f 1) 

領事

讓我們開始根據需要部署所有領事成員和主人。

領事大師(錯誤20)

consul agent -data-dir /tmp/consul -node=$HOSTNAME -bind=192.168.196.N
選項細節:
consul join -rpc-addr=192.168.196.20:8400 192.168.196.16
consul join -rpc-addr=192.168.196.20:8400 192.168.196.17
consul join -rpc-addr=192.168.196.20:8400 192.168.196.18
consul join -rpc-addr=192.168.196.20:8400 192.168.196.19

consul代理作為服務器啟動。

consul members -rpc-addr=192.168.196.20:8400
Node      Address              Status  Type    Build  Protocol  DC
master20  192.168.196.20:8301  alive   server  0.5.2  2         dc1
bugs19    192.168.196.19:8301  alive   client  0.5.2  2         dc1
bugs18    192.168.196.18:8301  alive   client  0.5.2  2         dc1
bugs17    192.168.196.17:8301  alive   client  0.5.2  2         dc1
bugs16    192.168.196.16:8301  alive   client  0.5.2  2         dc1

我們只希望有一位大師。

 -node=master20 

consul服務器/主服務器將命名為“master20”。

 -bind=192.168.196.20 

指定應綁定的IP地址。 如果您只有一個NIC,則為可選。

 -client=192.168.196.20 

指定服務器應綁定的RPC IP地址。 默認情況下它是localhost。 請注意,我不確定此選項的必要性,並且此強制為本地請求添加-rpc-addr=192.168.196.20:8400 ,例如consul members -rpc-addr=192.168.196.20:8400consul join -rpc-addr=192.168.196.20:8400 192.168.196.9加入具有IP地址192.168.196.9領事成員。

領事成員(錯誤{16..19})

ldocker run -v /tmp/cluster.disco:/tmp/cluster.disco -d -p 5732:2375 swarm manage file:///tmp/cluster.disco

建議使用tmux或類似的選項:setw synchronize-panes on so this one命令: consul -d agent -data-dir /tmp/consul -node=$HOST -bind=$IP啟動所有領事成員。

加入領事會員

 consul join -rpc-addr=192.168.196.20:8400 192.168.196.16 consul join -rpc-addr=192.168.196.20:8400 192.168.196.17 consul join -rpc-addr=192.168.196.20:8400 192.168.196.18 consul join -rpc-addr=192.168.196.20:8400 192.168.196.19 

也可以使用單行命令。 如果你正在使用zsh,那么consul join -rpc-addr=192.168.196.20:8400 192.168.196.{16..19}就足夠了,或者是一個foor循環: for i in $(seq 16 1 19); do consul join -rpc-addr=192.168.196.20:8400 192.168.196.$i;done for i in $(seq 16 1 19); do consul join -rpc-addr=192.168.196.20:8400 192.168.196.$i;done 您可以使用以下命令驗證您的成員是否參與了consul部署:

 consul members -rpc-addr=192.168.196.20:8400 Node Address Status Type Build Protocol DC master20 192.168.196.20:8301 alive server 0.5.2 2 dc1 bugs19 192.168.196.19:8301 alive client 0.5.2 2 dc1 bugs18 192.168.196.18:8301 alive client 0.5.2 2 dc1 bugs17 192.168.196.17:8301 alive client 0.5.2 2 dc1 bugs16 192.168.196.16:8301 alive client 0.5.2 2 dc1 

領事成員和主人都已部署並正在工作。 重點將放在碼頭和群上


一群

在下文中,使用兩種不同的方法詳細說明了swarm管理器和swarm成員發現的創建:令牌和靜態文件。 令牌使用Docker Hub的托管發現服務,而靜態文件只是本地的,不使用網絡(也不使用任何服務器)。 靜態文件解決方案應該是首選(實際上更容易)。

[靜態文件] 加入swarm成員時啟動swarm管理器

使用內容swarm_agent_ip:2375創建名為/tmp/cluster.disco的文件。

 cat /tmp/cluster.disco 192.168.196.16:2375 192.168.196.17:2375 192.168.196.18:2375 192.168.196.19:2375 

然后啟動swarm管理器如下:

auzias@bugs20:~$ ldocker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d1de6e4ee3fc        swarm               "/swarm join --addr=1"   5 seconds ago       Up 4 seconds        2375/tcp                 fervent_lichterman
338572b87ce9        swarm               "/swarm join --addr=1"   6 seconds ago       Up 4 seconds        2375/tcp                 mad_ramanujan
7083e4d6c7ea        swarm               "/swarm join --addr=1"   7 seconds ago       Up 5 seconds        2375/tcp                 naughty_sammet
0c5abc6075da        swarm               "/swarm join --addr=1"   8 seconds ago       Up 6 seconds        2375/tcp                 gloomy_cray
ab746399f106        swarm               "/swarm manage token:"   25 seconds ago      Up 23 seconds       0.0.0.0:5732->2375/tcp   ecstatic_shockley

而且你已經完成了!

[token]創建並啟動swarm管理器

在swarm master(bugs20)上,創建一個swarm:

 ldocker run --rm swarm create > swarm_id 

這將創建一個swarm並將令牌I​​D保存在當前目錄的swarm_id文件中。 一旦創建,swarm管理器需要作為守護進程運行:

 ldocker run -d -p 5732:2375 swarm manage token://`cat swarm_id` 

要驗證它是否已啟動,您可以運行:

 ldocker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d28238445532 swarm "/swarm manage token:" 5 seconds ago Up 4 seconds 0.0.0.0:5732->2375/tcp cranky_liskov 

[token]將群組成員加入群集群集

然后,群體管理器將需要一些swarm代理加入。

 ldocker run swarm join --addr=192.168.196.16:2375 token://`cat swarm_id` ldocker run swarm join --addr=192.168.196.17:2375 token://`cat swarm_id` ldocker run swarm join --addr=192.168.196.18:2375 token://`cat swarm_id` ldocker run swarm join --addr=192.168.196.19:2375 token://`cat swarm_id` 

std [in | out]將忙,這​​些命令需要在不同的終端上運行。 join添加-d應解決此問題並啟用for循環以用於連接。

群集成員加入后:

 auzias@bugs20:~$ ldocker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d1de6e4ee3fc swarm "/swarm join --addr=1" 5 seconds ago Up 4 seconds 2375/tcp fervent_lichterman 338572b87ce9 swarm "/swarm join --addr=1" 6 seconds ago Up 4 seconds 2375/tcp mad_ramanujan 7083e4d6c7ea swarm "/swarm join --addr=1" 7 seconds ago Up 5 seconds 2375/tcp naughty_sammet 0c5abc6075da swarm "/swarm join --addr=1" 8 seconds ago Up 6 seconds 2375/tcp gloomy_cray ab746399f106 swarm "/swarm manage token:" 25 seconds ago Up 23 seconds 0.0.0.0:5732->2375/tcp ecstatic_shockley 

在發現群組成員之后

要驗證成員是否被發現,您可以執行swarm-docker info

 auzias@bugs20:~$ swarm-docker info Containers: 4 Images: 4 Role: primary Strategy: spread Filters: health, port, dependency, affinity, constraint Nodes: 4 bugs16: 192.168.196.16:2375 └ Containers: 0 └ Reserved CPUs: 0 / 12 └ Reserved Memory: 0 B / 49.62 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs bugs17: 192.168.196.17:2375 └ Containers: 0 └ Reserved CPUs: 0 / 12 └ Reserved Memory: 0 B / 49.62 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs bugs18: 192.168.196.18:2375 └ Containers: 0 └ Reserved CPUs: 0 / 12 └ Reserved Memory: 0 B / 49.62 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs bugs19: 192.168.196.19:2375 └ Containers: 4 └ Reserved CPUs: 0 / 12 └ Reserved Memory: 0 B / 49.62 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs CPUs: 48 Total Memory: 198.5 GiB Name: ab746399f106 

此時部署了swarm,所有運行的容器將在不同的節點上運行。 執行幾個:

 auzias@bugs20:~$ swarm-docker run --rm -it ubuntu bash 

然后是:

 auzias@bugs20:~$ swarm-docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 45b19d76d38e ubuntu "bash" 6 seconds ago Up 5 seconds bugs18/boring_mccarthy 53e87693606e ubuntu "bash" 6 seconds ago Up 5 seconds bugs16/amazing_colden b18081f26a35 ubuntu "bash" 6 seconds ago Up 4 seconds bugs17/small_newton f582d4af4444 ubuntu "bash" 7 seconds ago Up 4 seconds bugs18/naughty_banach b3d689d749f9 ubuntu "bash" 7 seconds ago Up 4 seconds bugs17/pensive_keller f9e86f609ffa ubuntu "bash" 7 seconds ago Up 5 seconds bugs16/pensive_cray b53a46c01783 ubuntu "bash" 7 seconds ago Up 4 seconds bugs18/reverent_ritchie 78896a73191b ubuntu "bash" 7 seconds ago Up 5 seconds bugs17/gloomy_bell a991d887a894 ubuntu "bash" 7 seconds ago Up 5 seconds bugs16/angry_swanson a43122662e92 ubuntu "bash" 7 seconds ago Up 5 seconds bugs17/pensive_kowalevski 68d874bc19f9 ubuntu "bash" 7 seconds ago Up 5 seconds bugs16/modest_payne e79b3307f6e6 ubuntu "bash" 7 seconds ago Up 5 seconds bugs18/stoic_wescoff caac9466d86f ubuntu "bash" 7 seconds ago Up 5 seconds bugs17/goofy_snyder 7748d01d34ee ubuntu "bash" 7 seconds ago Up 5 seconds bugs16/fervent_einstein 99da2a91a925 ubuntu "bash" 7 seconds ago Up 5 seconds bugs18/modest_goodall cd308099faac ubuntu "bash" 7 seconds ago Up 6 seconds bugs19/furious_ritchie 

如圖所示,容器通過蟲子傳播{16 ... 19}。


多主機網絡

需要網絡覆蓋,因此所有容器都可以“插入”此覆蓋層。 要創建此網絡覆蓋,請執行:

 auzias@bugs20:~$ swarm-docker network create -d overlay net auzias@bugs20:~$ swarm-docker network ls|grep "net" c96760503d06 net overlay 

瞧!

創建此覆蓋后,將--net net添加到命令swarm-docker run --rm -it ubuntu bash ,所有容器將能夠本地通信,就好像它們位於同一LAN上一樣。 默認網絡為10.0.0.0/24。

啟用多播

默認覆蓋不支持多播。 另一個驅動程序需要能夠使用多播。 docker插件編織網確實支持多播。

要使用此驅動程序,一旦安裝,您將需要在所有Swarm代理和Swarm管理器上運行$weave launch 然后你需要將編織連接在一起,這是通過運行$weave connect $SWARM_MANAGER_IP 它顯然不是Swarm管理器的IP地址,但它更干凈(或者使用除Swarm代理之外的其他節點)。

此時已部署編織群集,但尚未創建編織網絡。 運行$swarm-docker network create --driver weave weave-net將創建名為weave-net的編織網絡。 使用--net weave-net啟動容器將使它們能夠共享相同的LAN並使用多播。 啟動此類容器的完整命令示例如下: $swarm-docker run --rm -it --privileged --net=weave-net ubuntu bash

我認為您指定的選項應該使用cluster-store=consul而不是cluster-store-consul 嘗試重置並重新啟動引擎和swarm並檢查它是否有效。 它應該在那之后工作。 入門文檔清楚地解釋了如何使用consul作為支持數據存儲來配置docker overlay網絡。

DOCKER_OPTS="-D --cluster-store=consul://192.168.0.18:8500 --cluster-advertise=192.168.0.18:2375"

DOCKER_OPTS="-D --cluster-store=consul://192.168.0.18:8500 --cluster-advertise=192.168.0.36:2375"

對於自Docker 1.12發布以來的任何人來說,現在這很簡單 - Swarm模式內置於引擎中,您不需要Consul或任何其他額外組件。

假設您有兩台安裝了Docker的主機,請在第一台機器上初始化Swarm:

> docker swarm init
Swarm initialized: current node (6ujd4o5fx1dmav5uvv4khrp33) is now a manager

To add a worker to this swarm, run the following command:                                                                                                   
docker swarm join \                                                                                                                                     
--token SWMTKN-1-54xs4bn7qs6su3xjjn7ul5am9z9073by2aqpey56tnccbi93zy-blugim00fuozg6qs289etc \                                                         
172.17.0.54:2377

該主機成為swarm中的第一個管理器節點,它寫出用於將其他節點加入swarm的命令 - 秘密令牌以及管理器正在偵聽的IP地址。

在第二個主機上:

> docker swarm join 172.17.0.54:2377 --token SWMTKN-1-54xs4bn7qs6su3xjjn7ul5am9z9073by2aqpey56tnccbi93zy-blugim00fuozg6qs289etc
This node joined a swarm as a worker.

現在您擁有一個安全的雙節點群,它具有服務發現滾動更新服務擴展

使用以下命令在管理器節點上創建覆蓋網絡:

> docker network create -d overlay my-net
d99lmsfzhcb16pdp2k7o9sehv

現在,您擁有一個內置DNS的多主機覆蓋網絡,因此服務可以根據服務名稱相互解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM