承接上文

本文基于上篇文章,详细的场景说明与分析在前篇随笔中业已记录,有兴趣可以移步 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. Linux AUFS 文件系统

    AUFS 的英文全称为 Advanced Mult-Layered Unification Filesystem,曾经是 Another Mult-Layered Unification Filesy ...

  2. 从后端到前端之Vue(五)小试路由

    一开始我还以为vue的路由只能用在工程化的项目里面呢,然后研究了一下才发现,在脚本化里面也是可以用的.其实呢不管在哪里用,把原理研究明白就对了. 一. 官网demo 这里不得不吐槽一下官网,写的不清不 ...

  3. 【Java】设置 JPanel 宽度

    panel.setSize(200, 300); //该方法无效 panel.setPreferredSize(new Dimension(800, 0)); //使用该方法 参考链接: http:/ ...

  4. ERROR 临时

    ERROR ITMS-4238: "Redundant Binary Upload. There already exists a binary upload with build vers ...

  5. Eclipse "Adb failed to restart !"

    今天遇到这个问题,如图所示: 上网找了下,原来是电脑上的各种手机助手抢占了手机链接.http://blog.csdn.net/zhufuing/article/details/19398125 说得很 ...

  6. Java连载10-数据类型取值范围&转义字符

    一.数据类型取值范围 二.八种数据类型在成员变量中的默认值 (1)成员变量,没有赋值,编译不会报错,系统会自动给赋值 byte\int\short\long默认值为0:float\double默认值为 ...

  7. 为什么阿里Java规约禁止使用Java内置线程池?

    IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...

  8. eclipse的下载安装配置

    1.在eclipse官网下载与你电脑版本相对应的安装包.链接:https://www.eclipse.org/downloads/eclipse-packages/ 2.下载与eclipse版本相对应 ...

  9. MapReduce 运行全过程解析

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 前言 前面我们讲了 MapReduce 的编程模型,我们知道他主要分成两大阶段来完成一项任务,一是 m ...

  10. 解决报错:类型“System.Object”在未被引用的程序集中定义。必须添加对程序集“System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用

    Razor视图引擎中,使用部分视图编译报错 类型“System.Object”在未被引用的程序集中定义.必须添加对程序集“System.Runtime, Version=4.0.0.0, Cultur ...