Docker跨服务器通信Overlay解决方案(下) Consul集群

本文详细介绍如何使用Consul集群解决Docker跨服务器内网通信问题,包括搭建Consul集群、配置Nginx负载均衡及Docker守护进程,实现Overlay网络。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

承接上文

本文基于上篇文章,详细的场景说明与分析在前篇随笔中业已记录,有兴趣可以移步 Docker跨服务器通信Overlay解决方案(上) Consul单实例

本文主旨

本文为Docker使用Consul集群实现Overlay网络,解决Docker跨服务器内网通信问题。

整体架构为:Nginx + 3 x Conul

1149398-20190827132536608-888712175.png

Consul集群搭建

环境说明

服务器OS主机IPDocker版本网卡名主机名
Ubuntu Server 18.04 LTS192.168.87.13318.09.6ens33hz
Ubuntu Server 18.04 LTS192.168.87.13918.09.7ens33hz2
Ubuntu Desktop 18.04 LTS192.168.87.13518.09.7ens33hz3

搭建过程

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集群状态

访问其中一个节点即可看到集群状态

1149398-20190827130200042-187441545.png

注意事项

每台运行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

1149398-20190827131306560-258398438.png

我们可以发现Key/Value下有了docker的key,点开docker有了如上图的docker daemon注册的信息

在以上列表中的133节点上创建个overlay网络 my-overlay-test

$ docker network create -d overlay my-overlay-test

1149398-20190827131900004-1652893168.png

后续的在上篇文章已经测试过了,本文结束,如有问题,望不吝评论!

本文系Hellxz学习与实践文章,禁止布布扣、码迷、爱码网等第三方爬虫网站爬取

转载于:https://www.cnblogs.com/hellxz/p/docker_consul_cluster.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值