当前位置:  开发笔记 > 运维 > 正文

如何在多主机之间创建docker overlay网络?

如何解决《如何在多主机之间创建dockeroverlay网络?》经验,为你挑选了1个好方法。

我一直在尝试在两台主机之间创建一个覆盖网络但没有成功.我一直收到错误消息:

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"

但它仍然没有用.我不确定应该为什么设置ip:port --cluster-advertise=.关于这个广告的文档,讨论和教程并不清楚.

我在这里遇到了一些问题.请帮忙.



1> Auzias..:

执行docker run命令时,请务必添加--net myapp.这是一个完整的分步教程(在线版本):

如何在具有多主机网络的群集上部署群集

TL; DR:使用Swarm部署多主机网络的分步教程.我想尽快在线提供这个教程,所以我甚至没有花时间进行演示.markdown文件可以在我网站的github上找到.随意适应和分享,它是根据知识共享署名4.0国际许可证授权.

先决条件

环境

使用docker engine 1.9.0完成的教程.

通过共享文件发现Swarm代理(其他方法可用).

Consul 0.5.2用于发现多主机网络群集容器.

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守护程序启动后选择.

使用的别名

在以下命令中,使用了这两个别名:

alias ldocker='docker -H tcp://0.0.0.0:2375'
alias swarm-docker='docker -H tcp://0.0.0.0:5732' #used only on the swarm manager

一定要有你的领事二进制的路径$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 -server -bootstrap-expect 1 -data-dir /tmp/consul -node=master -bind=$IP -client $IP
选项细节:
agent -server

将consul代理作为服务器启动.

-bootstrap-expect 1

我们只希望有一位大师.

-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})

consul agent -data-dir /tmp/consul -node=$HOSTNAME -bind=192.168.196.N

建议使用tmux或类似的选项:setw synchronize-panes on,这样一个命令:consul -d agent -data-dir /tmp/consul -node=$HOST -bind=$IP启动所有的consul成员.

加入领事会员

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.您可以使用以下命令验证您的成员是否参与了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管理器

创建一个以/tmp/cluster.disco内容命名的文件swarm_agent_ip:2375.

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管理器如下:

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

而且你已经完成了!

[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]将忙,这​​些命令需要在不同的终端上运行.在-d之前添加join应该解决这个问题并使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插件编织网确实支持多播.

要使用此驱动程序,一旦安装,您将需要$weave launch在所有Swarm代理和Swarm管理器上运行.然后你需要将编织连接在一起,这是通过运行来完成的$weave connect $SWARM_MANAGER_IP.它显然不是Swarm管理器的IP地址,但它更干净(或者使用除Swarm代理之外的其他节点).

此时已部署编织群集,但尚未创建编织网络.Running $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.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有