承接上文

本文基于上篇文章,详细的场景说明与分析在前篇随笔中业已记录,有兴趣可以移步 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-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学习与实践文章,禁止布布扣、码迷、爱码网等第三方爬虫网站爬取

Docker跨服务器通信Overlay解决方案(下) Consul集群的更多相关文章

  1. Docker跨服务器通信Overlay解决方案(上) Consul单实例

    场景 公司微服务快上线了,微服务都是用Docker容器进行部署的,在同一台主机下,把服务都部署上,注册到Nacos的IP与PORT都是内网的IP与Dockerfile中定义的端口号,看起来好像也没什么 ...

  2. Docker应用系列(三)| 构建Consul集群

    本示例基于Centos 7,在阿里云的三台机器上部署consul集群,假设目前使用的账号为release,拥有sudo权限. 由于Docker官方镜像下载较慢,可以开启阿里云的Docker镜像下载加速 ...

  3. docker跨主机通信-overlay

    使用consul 1,让两个网络环境下的容器互通,那么必然涉及到网络信息的同步,所以需要先配置一下consul. 直接运行下面命令.启动consul. docker run -d -p 8500:85 ...

  4. 实战中的asp.net core结合Consul集群&Docker实现服务治理

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在 ...

  5. .net core结合Consul集群&Docker实现服务治理

    实战中的asp.net core结合Consul集群&Docker实现服务治理 https://www.cnblogs.com/guolianyu/p/9614050.html 0.目录 整体 ...

  6. Docker跨主机网络——overlay

    前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...

  7. 通信服务器群集——跨服务器通信Demo(源码)

    对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...

  8. 跨域通信的解决方案JSONP

    在web2.0时代,熟练的使用ajax是每个前端攻城师必备的技能.然而由于受到浏览器的限制,ajax不允许跨域通信. JSONP就是就是目前主流的实现跨域通信的解决方案. 虽然在在jquery中,我们 ...

  9. 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现

    庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介      在第七篇文章<庐山真面目之七微服务架构Consul ...

随机推荐

  1. 个人永久性免费-Excel催化剂功能第89波-批量多图片转PDF

    前一篇展示了从PDF中提取到有用信息如图片.文本.表格等功能,部分人可能对自己手中的转PDF格式的保护性有所顾虑,此篇从反向角度,提供数据保护作用,让PDF文件的数据保护更彻底,让文本型的PDF文件彻 ...

  2. zabbix3.4汉化

    1.管理员用户登入zabbix页面,更改语言为Chinese(zh_CN),点击Update 2.解决zabbix页面中文乱码 2.1在windows的C:\Windows\Fonts找到字体文件si ...

  3. Bellman-Ford 算法

    根据之前最短路径算法里提到的,我们只要放松所有边直到其全部失效就可以得到最短路径 注意:图中不能有负圈.否则当负圈中某个点经过这个负圈的所有边的松弛操作后,这个点的的d[i]就会减小,此时会发现它可以 ...

  4. VS、C#配置R语言开发环境

    R语言学习笔记(一)——在Vs.C#中配置R语言开发环境. 最近在学习小众的R语言,所以将遇到的问题记录下来供大家参考,不足之处欢迎大家交流指正. 至于R语言的介绍就不多说了,它集成了复杂的数学算法, ...

  5. jdk1.8源码解析:HashMap底层数据结构之链表转红黑树的具体时机

    本文从三个部分去探究HashMap的链表转红黑树的具体时机: 一.从HashMap中有关“链表转红黑树”阈值的声明: 二.[重点]解析HashMap.put(K key, V value)的源码: 三 ...

  6. l命令练习题1

    1.创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令) [root@localhost ~]# mkdir -p /guanli/zonghe | mk ...

  7. 新IT运维时代 | Docker运维之最佳实践-下篇

    上篇针对操作系统.主机配置.容器镜像.容器运行时四大方面分享一些Docker的运维经验,本篇将着重在Docker Daemon参数和权限两个方面进一步分享.(阅读上篇请点击右侧:新IT运维时代 | D ...

  8. 优雅的对象转换解决方案-MapStruct使用进阶(二)

    在前面, 介绍了 MapStruct 及其入门. 本文则是进一步的进阶. 在 MapStruct 生成对应的实现类的时候, 有如下的几个情景. 1 属性名称相同,则进行转化 在实现类的时候, 如果属性 ...

  9. Java VisualVM监控远程JVM

    我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目前有多个监控工具, 相比JProfiler对系统资源尤其是内存的消耗是非常庞大,JDK1.6开始自带的VisualV ...

  10. RocketMq中网络通信之服务端

    一,Broker服务端入口(NettyServer端) 首先RocketMq网络通信采用的Netty通信.服务端主要集中在Broker中.我们先看一下Broker的启动类BrokerStartup 显 ...