部署Consul建立Docker集群
架构图
1、什么是consul
Consul的作用:Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。
Consul是分布式的、高可用的、可横向扩展的用于实现分布式系统的服务发现与配置。
- 服务注册与发现(主要功能):提供HTTP和DNS两种发现方式
- 健康检查,支持多种协议,HTTP、TCP等
- Key/Value存储
- 支持多数据中心
- 基于Golong语言,可移植性强
- 支持ACL访问控制
- 与Docker等轻量级容器可无缝配合
2、consul-template说明
Consul-Template是一个守护进程,用于实时查询Consul集群信息。
Consul-Template可以更新文件系统上任意数量的指定模板,生成配置文件, 更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx。
Consul-Template可以查询Consul中的服务目录、Key、Key-values等。
这种强大的抽象功能和查询语言模板可以使Consul-Template特别适合动态的创建配置文件。
例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends
3、registrator的作用
一个由Go语言编写的,针对docker使用的,可以用于检测容器状态,自动注册和注销docker容器的服务到服务配置中心。
目前支持Consul、Etcd和SkyDNS2。
4、部署
主机 | 操作系统 | IP地址 | 主要软件及版本 |
---|---|---|---|
consul | Centos 7 | 192.168.163.100 | Docker 、Consul、Consul-template |
registrator | Centos 7 | 192.168.163.150 | Docker、registrator |
Consul的作用:支持多数据中心分布式高可用的服务发现和配置共享。分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。
Server1:安装Consul服务
#######################consul的部署(贼简单)##############
###创建目录CS
mkdir /CS
cd /CS
###导入安装包,进行解压,解压后为可运行程序
rz
unzip /CS/consul_0.9.2_linux_amd64.zip
###将服务移动到系统环境内
mv consul /usr/bin/
### 后台运行服务
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.88.47 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
#######################说明####################
consul agent \ ##启动consul集群
-server \ ##指定server模式
-bootstrap \ ##设置引导模式
-ui \ ##启动UI界面
-data-dir=/var/lib/consul-data \ #指定数据存储目录
-bind=192.168.88.47 \ #绑定集群通信IP
-client=0.0.0.0 \ #指定监听的客户端网段,0表示所有
-node=consul-server01 &> /var/log/consul.log &
# 指定当前主机节点名称,将结果保存在指定目录下文件中,&在后台运行。
########################指令####################
## 查看集群主机:两种方式
consul memners
### 筛选出的为主领导者主机
consul info | grep leader
## 查询到的端口是用于集群中的数据读写和复制
######################通过域名查看信息##################
### 在服务端使用的IP地址为回环地址:127.0.0.1
curl 127.0.0.1:8500/v1/status/peers //查看集群server成员
curl 127.0.0.1:8500/v1/status/leader //集群Raf leader
curl 127.0.0.1:8500/v1/catalog/services //注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx //查看nginx服务信息
curl 127.0.0.1:8500/v1/catalog/nodes //集群节点详细信息
####################查看Consul相关的端口#######################
netstat -natp |grep consul
这5个端口的作用:
8300:集群内数据的读写和复制
8301:单个数据中心gossip协议通讯
8302:跨数据中心gossip协议通讯
8500:提供获取服务列表、注册服务、注销服务等HTTP接口;提供UI服务
8600:采用DNS协议提供服务发现功能
端口的说明:
②、容器服务自动加入nginx集群
在另一台主机上进行:安装注册服务(registrator)
Registrator的作用:在线自动检测docker容器,支持热插拔的注册与撤销服务,目前可支持以下组件:consul、etcd与skydns2。在后端服务注册中心注册服务或者取消服务注册的工具,后端注册中心支持consul、etcd、skydns2、zookeeper等存储。
###创建并启动容器
docker run -d \ #创建容器,并-d指定后台运行
--name=registrator \ #指定容器名称
--net=host \ #容器网络模式host,与宿主机共享
-v /var/run/docker.sock:/tmp/docker.sock \ #指定挂载卷-v
--restart=always \ #重启策略,在重启docker时启动此容器
gliderlabs/registrator:latest \ #指定该镜像名称
-ip=192.168.88.67 \ #指定本机IP地址
consul://192.168.88.47:8500 #指定集群IP地址和对应端口
可创建和运行多个服务容器,这是就能在集群中查看所有容器的信息。
docker run -itd -p:81:80 --name test-01 -h test01 nginx
可以创建多个容器:httpd、nginx等
在浏览器访问:server1(安装consul的服务)http://192.168.88.47:8500
查看集群中所有服务节点信息:curl 192.168.88.47:8500/v1/catalog/services
③、服务端Consul下安装consul-template
consul-template的作用:基于Consul的自动替换配置文件的应用。Consul-Template可以查询Consul中的服务目录、Key、Key-values等。这种强大的抽象功能和查询语言模板可以使Consul-Template特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends、Varnish Servers、Application Configurations等。
consul服务器宿主机上安装。
###解压安装服务:consul-template
unzip /CS/consul-template_0.19.3_linux_amd64.zip
###加入系统服务环境:/usr/bin/
mv consul-template /usr/bin/
#####################创建consul-template模板文件#############
vim /CS/nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 81;
server_name localhost 192.168.88.47;
access_log /var/log/nginx/nginx01-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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
###创建文件
mkdir /var/log/nginx/
touch /var/log/nginx/nginx01-access.log
④、在宿主机上部署nginx
consul服务器宿主机。
###安装依赖服务
yum install -y gcc pcre-devel zlib-devel
cd /CS
###解压软件
tar zxvf /CS/nginx-1.12.0.tar.gz
###进入目录
cd /CS/nginx-1.12.0/
###编译安装,指定安装目录
./configure --prefix=/usr/local/nginx
###编译安装
make && make install
#######################绑定consul-template
###修改配置文件:/usr/local/nginx/conf/nginx.conf
vim /usr/local/nginx/conf/nginx.conf
###在第18行下方插入:include vhost/*.conf;
sed -i '18a \ include vhost/*.conf;' /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
include vhost/*.conf; //添加虚拟主机目录
default_type application/octet-stream;
###创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
###创建日志文件目录
mkdir /var/log/nginx
###启动nginx
/usr/local/nginx/sbin/nginx
###############启动:consul-template
### 1、指定consul集群中Server服务端IP:端口
### 2、指定模板文件地址,指定输出主机地址,指定重载后的配置文件(nginx)
### 3、指定日志级别:info
consul-template -consul-addr 192.168.88.47:8500 \
-template "/CS/nginx.ctmpl:/usr/local/nginx/conf/vhost/nginx01.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info &
查看server端的目录:/usr/local/nginx/conf/vhost/
###在/usr/local/nginx/conf/vhost/下生成服务集群文件,nginx01.conf
###该配置文件完全基于上面的consul-template模板生成
cat /usr/local/nginx/conf/vhost/nginx01.conf
upstream http_backend {
server 192.168.163.88.67;
###服务池主机
server {
listen 81;
server_name localhost 192.168.88.47;
access_log /var/log/nginx/ljj-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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
Consul服务主机变化,数据更新情况:
1. 在Registrator服务端注册创建新的节点时,服务端consul也能实时的检测到容器的变化情况。
2. 运行的consul-template进程会提示并自动更新显示数据信息。
3. 与此同时,配置文件也会自动增加服务(服务池中自动增加:宿主机IP:容器端口)/usr/local/nginx/conf/vhost/nginx01.conf。
4. 宿主机端口:nginx开放两个端口,一个nginx基础发布端口,集群发布端口。
registrator注册主机变化:
监听nginx容器访问日志:docker logs -f test1
⑤、部署多个Consul服务端主机
添加一台已有docker环境的服务器主机加入已有的群集中,实现高可用。
mkdir /CS/
cd /CS/
###放入安装包
unzip /CS/consul_0.9.2_linux_amd64.zip
mv /CS/consul /usr/bin
###运行consul,并加入consul集群
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.88.77 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 192.168.88.47 &> /var/log/consul.log &
#####################参数解释########################
-bind:指定自身主机IP地址
-enable-script-checks=true:设置检查服务为可用
-datacenter:用于指定数据中心名称
-join:加入到已有的集群中
#################验证###################
###查看当前Consul集群中有那几台主机
consul members