Docker----Consul集群搭建

一:介绍Consul

Consul 是一个支持多数据中心分布式高可用的服务发现 和 配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发 , 用于实现分布式系统的服务发现与配置 。

1、特点
  • consul 支持健康检查,允许存储键值对;
  • 一致性协议采用 Raft 算法,用来保证服务的高可用;
  • 成员管理和消息广播采用 GOSSIP 协议,支持 ACL 访问控制;
  • 方便部署,与 Docker 等轻量级容器可无缝配合
2、建立consul服务
  • 每个提高服务的节点上都需要部署和运行 consul 的 agent。
  • Consul agent 两种运行模式: server 、 client 。 server 与 client 只是 consul 群集层面的区分,与搭建在 cluster 之上的应用服务无关 。

二:搭建consul集群

1、实验环境

两台centos7虚拟机;

consul服务器: 192.168.48.148 安装 Docker-ce、Consul、Consul-template模板、nginx服务

容器服务器: 192.168.48.138 安装Docker-ce

(提前部署好docker环境)

2、实验步骤

  • 在consul服务器配置
1、consul服务器先要下载nginx镜像
[root@localhost vhost]# docker pull nginx         ‘下载一个nginx镜像’
[root@localhost vhost]# docker create -it nginx:latest /bin/bash         ‘创建一个容器’
[root@localhost vhost]# docker ps -a
2、创建consul目录,并把需要的软件包上传
[root@localhost ~]# mkdir consul
[root@localhost ~]# cd consul/
[root@localhost consul]# rz      ‘把下面的软件包上传’
[root@localhost consul]# ls
consul            consul_0.9.2_linux_amd64.zip            nginx-1.12.2.tar.gz
consul-template_0.19.3_linux_amd64.zip

所需软件包链接:https://pan.baidu.com/s/1nu880-VlLutVtBmMFiIPvA
提取码:e9nc

3、解压consul包
[root@localhost consul]# unzip consul_0.9.2_linux_amd64.zip 

[root@localhost consul]# mv consul /usr/bin/      ‘移动consul到/usr/bin下,便于系统识别’
4、创建consul代理agent
[root@localhost consul]# consul agent \         ‘安装代理和server功能’
-server \
-bootstrap \        ‘参与consul选举’
-ui \         ‘提供web的ui界面’
-data-dir=/var/lib/consul-data \        ‘参数存储位置’
-bind=192.168.48.148 \             ‘绑定的IP地址’
-client=0.0.0.0 \            ‘监听任意IP地址’
-node=consul-server01 &> /var/log/consul.log &         ‘运行node1节点,并将日志生成到指定目录下’

docker搭建单节点etcd consul docker单机搭建集群_nginx

5、查看集群信息
[root@localhost consul]# consul members
[root@localhost consul]# consul info | grep leader

docker搭建单节点etcd consul docker单机搭建集群_Consul集群搭建_02

6、 通过 httpd api 可以获取集群信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/services
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nodes
7、查看consul端口是否启动
[root@localhost consul]# netstat -ntap | grep 8500                                     tcp6       0      0 :::8500                 :::*                    LISTEN      5604/consul

[root@localhost consul]# systemctl stop firewalld.service 
[root@localhost consul]# setenforce 0       ‘关闭防火墙’
  • 在容器服务器上配置
1、让容器服务器自动加入nginx集群
[root@localhost docker]# docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.48.138 \       ‘自己的ip’
consul://192.168.48.148:8500       ‘指向consul服务器’

docker搭建单节点etcd consul docker单机搭建集群_nginx_03

2、创建两个容器来测试consul服务发现功能是否正常
[root@localhost docker]# docker run -itd -p:83:80 --name test-01 -h test01 nginx        ‘指定端口为83’
[root@localhost docker]# docker run -itd -p:84:80 --name test-02 -h test02 nginx        ‘指定端口为84’
3、浏览器输入192.168.48.148:8500 ,会发现刚创建的两个容器已经在consul里。

docker搭建单节点etcd consul docker单机搭建集群_docker_04

docker搭建单节点etcd consul docker单机搭建集群_docker_05

4、实现让容器服务自动加入nginx集群

  • 在consul服务器上配置
Consul-template:
  • 是基于 Consul 的自动替换配置文件的应用
  • 可以查询 Consul 中的服务目录:Key、Key-values等
  • 特别适合动态的创建配置文件
  • 是一个守护进程,用于实时查询 consul 集群信息

(1)创建一个template的nginx模板文件
[root@localhost consul]# vim nginx.ctmpl
upstream http_backend {
    {{range service "nginx"}}
     server {{.Address}}:{{.Port}};
     {{end}}
}

server {
       listen 1216;
       server_name localhost 192.168.48.148;
       access_log /var/log/nginx/kgc.cn-access.log;
       index index.html index.php;
       location / {
          proxy_set_header HOST $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Client-IP $remote_addr; 
          proxy_set_header X-Fprwarded-For $proxy_add_x_forwarded_for;
          proxy_pass http://http_backend;
                 }
       }
(2)编译安装nginx服务
[root@localhost consul]# yum install gcc gcc-c++ pcre pcre-devel zlib-devel -y
[root@localhost consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt/
[root@localhost consul]# cd /opt/nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
(3)配置nginx
[root@localhost nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
‘添加虚拟主机目录’

docker搭建单节点etcd consul docker单机搭建集群_服务器_06

(4)创建虚拟主机目录
[root@localhost nginx-1.12.0]# mkdir /usr/local/nginx/conf/vhost
(5)创建日志文件目录
[root@localhost nginx-1.12.0]# mkdir /var/log/nginx
(6)解压并复制 consul-template
[root@localhost consul]# unzip consul-template_0.19.3_linux_amd64.zip
[root@localhost consul]# mv consul-template /usr/bin/
(7)启动nginx服务
[root@localhost consul]# nginx
[root@localhost consul]# netstat -natp | grep nginx
(8)启动consul-template
[root@localhost consul]# consul-template -consul-addr 192.168.48.148:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
‘这边不需要终止进程,可打开另一个终端查看’
(9)再打开consul服务器新的终端查看

docker搭建单节点etcd consul docker单机搭建集群_Consul集群搭建_07

再打开容器服务器(192.168.48.138)查看容器 ,可看到自创的两个nginx

docker搭建单节点etcd consul docker单机搭建集群_nginx_08

(10) 为了测试自动更新效果,可以在 registrator 服务端创建两个 nginx 容器节点,检测服务发现及配置更新功能
[root@localhost ~]# docker run -itd -p:85:80 --name test-05 -h test05 nginx
[root@localhost docker]# docker run -itd -p:86:80 --name test-09 -h test09 nginx
在consul服务器中会自动更新,可查看自动加上的85和86端口的nginx节点

docker搭建单节点etcd consul docker单机搭建集群_Consul集群搭建_09