承接上文
本文基于上篇文章, 详细的场景说明与分析在前篇随笔中业已记录, 有兴趣可以移步 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/OS X 上生效
-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-store 与 cluster-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 学习与实践文章, 禁止布布扣, 码迷等第三方爬虫网站爬取
来源: https://www.cnblogs.com/hellxz/p/docker_consul_cluster.html