【docker系列】consul+overlay实现容器跨主机网络通信

一、原理说明及服务器规划

overlay网络是什么?

overlay就是覆盖的意思,指的就是在物理网络层上再搭建一层网络,基于VXLAN技术封装实现Docker原生网络,可以被称为逻辑网。2台服务器能够通过逻辑网通信的前提是,它们之间的物理网络也是能够通信的,因为overlay网络之建立在物理网络基础之上的。

分布式协调服务的作用?
实现docker跨主机网络通信,我们需要搭建一个分布式协调服务,服务选型可以是consul、etcd、zookpper,这里我们使用consul。

分布式协调服务在这里的作用参考上图:

  • 三个服务器分别启动docker引擎,在启动引擎的时候向docker注册自己的服务地址。
  • 在server1新建了一个overlay network,docker daemon会将network相关的信息注册到consul。consul将network信息同步到server2、server3。
  • 当server3新启动了一个容器x,docker daemon会将容器x的网络配置注册及服务地址配置到consul,并将变更信息通知到其他服务器上的docker daemon
  • 当server2上的一个容器想访问server3上面的容器x,因为其已经通过consul获得了server3容器网络信息,从而能够通过overlay网络访问到server3的容器x。

二、安装Consul集群

consul集群角色规划

主机名 ip consul服务角色
zimug1 192.168.1.111 server
zimug2 192.168.1.112 server
zimug3 192.168.1.113 server

正常情况下,consul需要从官网下载(wget https://releases.hashicorp.com/consul/1.11.5/consul_1.11.5_linux_386.zip),由于众所周知的原因下载比较慢,我把这个包传到了CSDN 。下载之后解压就一个consul文件,分别放到三台CentOS的/usr/bin目录下即可。并且在三台服务器上分别执行

  • mkdir -p /root/data/consul新建目录用于持久化存储consul数据
  • chmod u+x /usr/bin/consul增加执行权限
  • 将以下的端口在服务器上开放出来,consul服务及通信端口。
firewall-cmd --zone=public --add-port=2375/tcp --permanent;
firewall-cmd --zone=public --add-port=8300/tcp --permanent;
firewall-cmd --zone=public --add-port=8301/tcp --permanent;
firewall-cmd --zone=public --add-port=8302/tcp --permanent;
firewall-cmd --zone=public --add-port=8500/tcp --permanent;
firewall-cmd --zone=public --add-port=8600/tcp --permanent;
firewall-cmd --reload;
  • 在三台服务器上分别启动一个consul Server服务
##登录zimug1主机,以server形式运行
nohup consul agent -server -bootstrap-expect 2 -data-dir /root/data/consul -node=zimug1 -bind=192.168.1.111 -ui -client 0.0.0.0 &
##登录zimug2主机,以server形式运行
nohup consul agent -server -bootstrap-expect 2 -data-dir /root/data/consul -node=zimug2 -bind=192.168.1.112 -ui -client 0.0.0.0 & 
##登录zimug3主机,以server形式运行
nohup consul agent -server -bootstrap-expect 2 -data-dir /root/data/consul -node=zimug3 -bind=192.168.1.113 -ui -client 0.0.0.0 &

consul参数说明:
-server: 以server身份启动。
-bootstrap-expect:集群要求的最少server数量,当低于这个数量,集群即失效。
-data-dir:data存放的目录,更多信息请参阅consul数据同步机制
-node:节点id,在同一集群不能重复。
-bind:监听的ip地址。
-client:客户端的ip地址(0.0.0.0表示不限制)

至此consul server的三个节点就全都启动完成了,但它们现在是独立的。在zimug2、zimug3的服务器上执行下列命令,将zimug2、zimug3的consul服务join到zimug1的consul服务上,这样它们三个组成一个集群。

consul join 192.168.1.111

完成后通过consul members发现集群现在有三个节点。

# consul members
Node      Address             Status  Type    Build  Protocol  DC   Segment
server-1  192.168.1.111:8301  alive   server  1.7.2  2         dc1  <all>
server-2  192.168.1.112:8301  alive   server  1.7.2  2         dc1  <all>
server-3  192.168.1.113:8301  alive   server  1.7.2  2         dc1  <all>

通过浏览器访问 http://192.168.1.111:8500 可以查看到如下的consul图形界面。

三、修改docker环境

  • 关闭防火墙systemctl stop firewalld,很不幸的是经过笔者实验,使用自建overlay网络必须关闭防火墙。(暂时没找到好的解决方案)
  • 在三台服务器上修改如下配置文件vim /etc/docker/daemon.json
{
    
    
    "cluster-store": "consul://192.168.1.111:8500",
    "cluster-advertise": "enp0s3:2375"
}

上面配置的含义是通过当前宿主机的enp0s3:2375(docker守护进程服务),与consul集群中的192.168.1.111:8500的节点进行通信(注册)。其中enp0s3是当前主机的网卡接口名称,通过ifconfig命令即可查看(根据操作系统不同,有的叫做enp0s8、eth0等)。

# 加载配置文件# 重启docker
systemctl daemon-reload && systemctl restart docker

全都完成之后访问http://192.168.1.111:8500/ui/dc1/kv/docker/nodes/ 会发现三个docker注册节点。

四、创建docker network并启动容器

创建一个overlay类型的网络叫做multihost

docker network create -d overlay multihost

你会发现我们在zimug1主机上执行命令,multihost网络被同步到zimug2、zimug3上面。这就是分布式协调服务consul起到了作用。

# docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
54ca5d5bb09a   bridge       bridge    local
7dbdfb1e4b51   host         host      local
447926f66f45   none         null      local
9d9ec4c5aee3    multihost   overlay   global

在三台服务器上zimug1、zimug2、zimug3中选择2个服务器,分散跨主机创建2个容器,使用multihost的overlay网络。

在zimug1服务器上启动一个容器,使用multihost的overlay网络。

docker run -it --rm --net=multihost --name=host1 centos;

在zimug2服务器上启动一个容器,使用multihost的overlay网络。

docker run -it --rm --net=multihost --name=host2 centos;

容器host1在zimug1主机上,容器host2在zimug2主机上,测试网络联通性

如果主机名称ping不通的话,换成ip ping一下试试,怎么知道容器的ip?

  • 在容器内部查看 ip addr
  • 在容器宿主机查看docker inspect <容器id或名称> |grep IPAddress

猜你喜欢

转载自blog.csdn.net/hanxiaotongtong/article/details/125253806