承接上文

本文基于上篇文章,详细的场景说明与分析在前篇随笔中业已记录,有兴趣可以移步 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. 【带着canvas去流浪(13)】用Three.js制作简易的MARVEL片头动画(下)

    目录 一. 模型的制作 1.1 生成字体模型 1.2 多表面贴图 二. 镜头及动画 三. 大作业总结 示例代码托管在:http://www.github.com/dashnowords/blogs 博 ...

  2. JAVA面试题 请谈谈你对Sychronized关键字的理解?

    面试官:sychronized关键字有哪些特性? 应聘者: 可以用来修饰方法; 可以用来修饰代码块; 可以用来修饰静态方法; 可以保证线程安全; 支持锁的重入; sychronized使用不当导致死锁 ...

  3. 【git】Git的使用

    一.安装git 1.windows下安装一个Git 2.lInux下yum(apt-get) install git 二.使用git连接github 使用git连接github时,需要将linux下产 ...

  4. linux初学者-iscsi篇

     linux初学者-iscsi篇         之前介绍过网络文件共享系统NFS和CIFS.在系统中,设备也是可以共享的,这就是iSCSI,它可以用来建立和管理IP存储设备.主机和客户机等之间的相互 ...

  5. 用maven工具管理web项目的错误记录:org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException

    运行异常报告日志: 严重: Context initialization failedorg.springframework.beans.factory.xml.XmlBeanDefinitionSt ...

  6. TypeScript入门实例

    前言 TypeScript是JavaScript的超集,微软公司开发,利用es6语法,实现对js的面向对象编程思想,写代码的时候会像强类型语言一样,指定参数类型.返回值类型,类型不对会报错,但编译后还 ...

  7. 洛谷P1003 题解

    题面 思路一:纯模拟.(暴力不是满分) 思路: 1.定义一个二维数组. 2.根据每个数据给二维数组赋值. 3.最后输出那个坐标的值. 思路二(正规思路): 逆序找,因为后来的地毯会覆盖之前的,一发现有 ...

  8. HTTP文件上传原理

    前言 对于这块知识点,我一直都是模糊的,不是非常清楚的.在平时的工作中,遇到上传的问题,也没有深入的去研究过,也都是直接用别人封装好的类来完成自己的工作.某一天,看了本书,说到这个知识点,一脸茫然,觉 ...

  9. 【iOS】UIImage 等比率缩放

    这两天处理引导页面的时候遇到了图片略大的问题,上网查找后找到了解决方法.用的是 UIImage 的等比率缩放,虽然不难,但之前没接触过,故记之. 代码如下: - (UIImage *)scaleIma ...

  10. Shiro权限框架与SpringMVC集成

    1.Shiro整合SpringMVC 我们学习Shiro框架肯定是要应用到Web项目上的,所以我们需要整合Shiro和SpringMVC 整合步骤: 第一步:SpringMVC框架的配置 spring ...