docker篇-(docker-compose搭建consul高可用主从集群)

使用docker手动搭建consul集群

#拉取consul镜像
docker pull consul:1.9.0

测试consul是否能正常启动

docker run --rm -ti -p 8500:8500 consul:1.9.0

启动成功如下
在这里插入图片描述
浏览器访问
在这里插入图片描述

搭建consul-master集群

注意: consul集群节点最少数量通过-bootstrap-expect来决定的,这里我的master集群数量设置为2
集群需要在同一个网段,并且有固定ip,所以这里我们先创建一个网卡,用于集群使用

docker network create --driver=bridge --subnet=10.10.0.0/16 consul

1.启动consul-master-1节点

docker run --name consul-master-1 --network=consul --ip=10.10.10.10 -p 8500:8500 -d consul:1.9.0 agent  -bind=0.0.0.0 -bootstrap-expect=2 -node=consul-master-1 -server -client=0.0.0.0 -ui

这里还没有节点加入
在这里插入图片描述
2.启动consul-master-2节点,加入集群
这里就不暴露端口了

docker run --name consul-master-2  --network=consul --ip=10.10.10.20 -d consul:1.9.0 agent  -bind=0.0.0.0 -retry-join="10.10.10.10" -node=consul-master-2 -server -client=0.0.0.0

3.查看日志,查找leader节点
查看consul-master-1节点日志,可以看到,选举的leader为consul-master-1
在这里插入图片描述
4.浏览器访问
在这里插入图片描述

搭建consul-slave集群,加入master

consul-slave集群,不会参与leader选举,只接收数据复制流
1.创建consul-slave1

# 通过关闭-server参数,标识此节点是一个客户端,不参与leader选举
docker run --name consul-slave-1  --network=consul --ip=10.10.10.30 -d consul:1.9.0 agent  -bind=0.0.0.0 -retry-join="10.10.10.10" -node=consul-slave-1 -client=0.0.0.0 

2.创建consul-slave2

# 通过关闭-server参数,标识此节点是一个客户端,不参与leader选举
docker run --name consul-slave-2  --network=consul --ip=10.10.10.40 -d consul:1.9.0 agent  -bind=0.0.0.0 -retry-join="10.10.10.10" -node=consul-slave-2 -client=0.0.0.0 

通过浏览器查看,slave节点已经加入了
在这里插入图片描述

加入nginx,实现slave的负载均衡

这里让应用的服务发现与注册都走consul-slave的节点,保护master
1.启动nginx容器

docker run --name consul-slave-lb -p 80:80 --network=consul -d nginx:alpine

2.进入容器,修改配置,实现consul-slave的负载均衡

docker exec -ti consul-slave-lb sh

3.修改nginx容器里面的default.conf文件
执行以下脚本,修改default.conf文件的内容

cat >/etc/nginx/conf.d/default.conf <<EOF
upstream consul-slave-cluster {
  server 10.10.10.30:8500;
  server 10.10.10.40:8500;
}                          
server {                   
    listen       80;       
    listen  [::]:80;                                  
    server_name  localhost;                           
                                                      
    #charset koi8-r;                                  
    #access_log  /var/log/nginx/host.access.log  main;
                                     
    location / {                     
      proxy_pass http://consul-slave-cluster;
    }                                       
}
EOF

4.退出容器,重启consul-slave-lb容器

exit
docker restart consul-slave-lb

5.通过程序,注册一个服务到consul
在这里插入图片描述
6.通过浏览器查看服务注册情况
可以看到,服务注册在consul-slave-2这个节点上面,由于consul和我这边注册的服务网段不通,所以监控检查是失败的
在这里插入图片描述

使用docker-compose构建

在使用docker-compose之前,请关闭之前创建的consul容器,并删除对应网卡

docker rm -f consul-master-1
docker rm -f consul-master-2
docker rm -f consul-slave-1
docker rm -f consul-slave-2
docker rm -f consul-slave-lb
docker network rm consul

构建consul-master集群

1.编写consul-master.yml的docker-compose文件

version: '3'
services:
  consul-master-1:
    image: consul:1.9.0
    container_name: consul-master-1
    ports:
    - 8500:8500
    networks:
    - consul
    command:
    - sh
    - -c
    - |
      consul agent -data-dir=/opt/consul/data -bind=0.0.0.0 -bootstrap-expect=2 -node=consul-master-1 \
      -server -client=0.0.0.0 -ui
  consul-master-2:
    image: consul:1.9.0
    container_name: consul-master-2
    networks:
    - consul
    command:
    - sh
    - -c
    - |
      consul agent -data-dir=/opt/consul/data -bind=0.0.0.0 -retry-join=consul-master-1 -node=consul-master-2 \
      -server -client=0.0.0.0 
networks:
  consul:
    driver: bridge
    ipam:
      driver: default
      config:
      - subnet: 10.10.0.0/16

目录如下
在这里插入图片描述

2.启动consul-master集群

docker-compose -f consul-master.yml up -d

通过浏览器查看,效果如下
在这里插入图片描述

构建consul-slave集群

这里-retry-join=consul-master-1是docker-compose里面的container_name
1.编写consul-slave.yml

version: '3'
services:
  consul-slave-1:
    image: consul:1.9.0
    container_name: consul-slave-1
    networks:
    - consul
    command:
    - sh
    - -c
    - |
      consul agent -data-dir=/opt/consul/data -retry-join=consul-master-1 -bind=0.0.0.0 -node=consul-slave-1 -client=0.0.0.0 -ui
  consul-slave-2:
    image: consul:1.9.0
    container_name: consul-slave-2
    networks:
    - consul
    command:
    - sh
    - -c
    - |
      consul agent -data-dir=/opt/consul/data -bind=0.0.0.0 -retry-join=consul-master-1 -node=consul-slave-2 -client=0.0.0.0 
networks:
  consul:
    external:
      name: consul_consul #这里引用consul-master集群创建的网卡

当前目录如下
在这里插入图片描述

2.启动consul-slave集群
通过浏览器查看,效果如下
在这里插入图片描述

使用nginx对consul-slave实现负载均衡

1.编写consul-slave-lb.yml

version: '3'
services:
  consul-slave-lb:
    image: nginx:alpine
    ports:
    - 80:80
    networks:
    - consul
    volumes:
    - ./conf.d:/etc/nginx/conf.d
networks:
  consul:
    external:
      name: consul_consul

2.生成consul-slave-lb.conf配置文件

mkdir conf.d
cat > conf.d/consul-slave-lb.conf <<EOF
upstream consul-slave-cluster {
  server consul-slave-1:8500;
  server consul-slave-2:8500; #这里如果设置了slave的hostname,就填写slave的hostname,否则填container_name即可
}                          
server {                   
    listen       80;       
    listen  [::]:80;                                  
    server_name  localhost;                           
                                                      
    #charset koi8-r;                                  
    #access_log  /var/log/nginx/host.access.log  main;
                                     
    location / {                     
      proxy_pass http://consul-slave-cluster;
    }                                       
}
EOF

3.启动consul-slave-lb,并使用程序向slave注册服务

docker-compose -f consul-slave-lb.yml up -d

在这里插入图片描述
通过浏览器访问,可以看到,服务注册在consul-slave-1这个节点
在这里插入图片描述

测试集群高可用

关闭consul-slave-1节点

在这里插入图片描述
consul-slave-1这个节点也已经挂掉了
在这里插入图片描述

这里修改了服务名称和端口,模拟另一个服务

在这里插入图片描述

获取服务实例,测试是否能获取consul-slave-1节点上注册的服务

可以看到,是有获取到注册在consul-slave-1这个节点上的服务实例的
在这里插入图片描述

写在最后

在这篇文章中,我将consul分成了master和slave,他们负责的业务各不相同,slave负责接收其他服务的注册信息,以及配置信息等,master则用来管理和同步服务信息到其他slave节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值