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节点,并将日志生成到指定目录下’
5、查看集群信息
[root@localhost consul]# consul members
[root@localhost consul]# consul info | grep leader
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服务器’
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里。
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
‘添加虚拟主机目录’
(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服务器新的终端查看
再打开容器服务器(192.168.48.138)查看容器 ,可看到自创的两个nginx
(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节点