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

  • 使用docker手动搭建consul集群
  • 测试consul是否能正常启动
  • 搭建consul-master集群
  • 搭建consul-slave集群,加入master
  • 加入nginx,实现slave的负载均衡
  • 使用docker-compose构建
  • 构建consul-master集群
  • 构建consul-slave集群
  • 使用nginx对consul-slave实现负载均衡
  • 测试集群高可用
  • 关闭consul-slave-1节点
  • 这里修改了服务名称和端口,模拟另一个服务
  • 获取服务实例,测试是否能获取consul-slave-1节点上注册的服务
  • 写在最后


使用docker手动搭建consul集群

#拉取consul镜像
docker pull consul:1.9.0

测试consul是否能正常启动

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

启动成功如下

搭建docker的zookeeper集群 consul docker单机搭建集群_负载均衡


浏览器访问

搭建docker的zookeeper集群 consul docker单机搭建集群_负载均衡_02

搭建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

这里还没有节点加入

搭建docker的zookeeper集群 consul docker单机搭建集群_docker_03


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

搭建docker的zookeeper集群 consul docker单机搭建集群_consul_04


4.浏览器访问

搭建docker的zookeeper集群 consul docker单机搭建集群_consul_05

搭建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节点已经加入了

搭建docker的zookeeper集群 consul docker单机搭建集群_nginx_06

加入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

搭建docker的zookeeper集群 consul docker单机搭建集群_nginx_07


6.通过浏览器查看服务注册情况

可以看到,服务注册在consul-slave-2这个节点上面,由于consul和我这边注册的服务网段不通,所以监控检查是失败的

搭建docker的zookeeper集群 consul docker单机搭建集群_负载均衡_08

使用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

目录如下

搭建docker的zookeeper集群 consul docker单机搭建集群_consul_09

2.启动consul-master集群

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

通过浏览器查看,效果如下

搭建docker的zookeeper集群 consul docker单机搭建集群_负载均衡_10

构建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集群创建的网卡

当前目录如下

搭建docker的zookeeper集群 consul docker单机搭建集群_docker_11

2.启动consul-slave集群

通过浏览器查看,效果如下

搭建docker的zookeeper集群 consul docker单机搭建集群_nginx_12

使用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

搭建docker的zookeeper集群 consul docker单机搭建集群_consul_13


通过浏览器访问,可以看到,服务注册在consul-slave-1这个节点

搭建docker的zookeeper集群 consul docker单机搭建集群_docker_14

测试集群高可用

关闭consul-slave-1节点

搭建docker的zookeeper集群 consul docker单机搭建集群_consul_15


consul-slave-1这个节点也已经挂掉了

搭建docker的zookeeper集群 consul docker单机搭建集群_负载均衡_16

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

搭建docker的zookeeper集群 consul docker单机搭建集群_nginx_17

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

可以看到,是有获取到注册在consul-slave-1这个节点上的服务实例的

搭建docker的zookeeper集群 consul docker单机搭建集群_consul_18