文章目录
Consul理论
Consul 简介与特性
- Consul是HashiCorp公司推出的开源工具,Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。
主要特性: - Consul 支持健康检查,并允许 HTTP 、GRPC 和 DNS 协议调用 API 存储键值对。
- 一致性协议采用 Raft 算法,用来保证服务的高可用。
- 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制。
- consul的实例叫agent,agent有两种运行模式:server和client 。
- 官方建议每个Consul Cluster数据中心至少有3个或以上的运行在Server Mode的Agent,Client节点不限。
Consul 使用场景
- 服务发现场景中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持health check。
- 服务隔离场景中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密。
- 服务配置场景中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,通过工具consul-template可以更方便地实时渲染配置文件。
- 举例说明:docker实例的注册与配置共享、coreos实例的注册与配置共享、vitess集群、SaaS应用的配置共享、Consul与confd服务集成,动态生成nginx和haproxy配置文件或者Consul结合nginx构建高可用可扩展的Web服务。
Consul架构图
- Consul Cluster由部署和运行了Consul Agent的节点组成,在Cluster中有两种角色Server和Client;
- Server和Client的角色和Consul Cluster上运行的应用服务无关,是基于Consul层面的一种角色划分;
- Consul Server:用于维护Consul Cluster的状态信息。官方建议至少要运行3个或者3个以上的Consul Server。 多个server之中需要选举一个leader,这个选举过程Consul基于Raft协议实现,多个Server节点上的Consul数据信息保持强一致性。在局域网内与本地客户端通讯,通过广域网与其他数据中心通讯;
- Consul Client:只维护自身的状态, 并将HTTP和DNS接口请求转发给服务端。
Consul的优势
- Consul使用Raft算法来保证一致性,比复杂的Paxos算法更直接,相比较而言zookeeper采用的是Paxos,而etcd使用的则是Raft;
- Consul支持多数据中心,内外网的服务采用不同的端口进行监听,多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟、分片等情况等。zookeeper和etcd均不提供多数据中心功能的支持;
- Consul支持健康检查,etcd不提供此功能(必须设置etcdctl命令检查);
- Consul支持http和dns协议接口,zookeeper的集成较为复杂,etcd只支持http协议;
- Consul官方提供web管理界面,etcd无此功能。
Docker Consul实验操作
实验准备
服务器 | IP地址 | 部署应用 |
---|---|---|
Consul服务器 | 192.168.18.165 | Docker-ce、Consul、Consul-template模板、nginx服务 |
Docker服务器 | 192.168.18.163 | Docker-ce registrator |
实验步骤
部署consul服务
- 创建工作目录,并将配置文件拷贝到目录里
mkdir -p /root/consul
cd consul
- 解压文件,并且移动执行文件
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/bin/
- 创建consul代理agent
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.18.165 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
- 查看端口及群集信息
netstat -ntap |grep 8500
consul members
consul info |grep leader
容器服务自动加入nginx群集
- 在容器服务器上安装 gliderlabs/registrator
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.18.163 \
consul://192.168.18.165:8500
- 测试 consul 服务发现功能是否正常
docker run -itd -p:83:80 --name test-1 -h test1 nginx
docker run -itd -p:84:80 --name test-2 -h test2 nginx
docker run -itd -p:88:80 --name test-3 -h test3 httpd
docker run -itd -p:89:80 --name test-4 -h test4 httpd
- 验证consul 的服务发现功能
- 打开浏览器输入http://192.168.18.165:8500,“单击NODES”,然后单击“consurl-server01”,出现5个服务,表示nginx服务已经注册到consul里。
部署consul-template和nginx
- Consul-Template 是一个守护进程,用于实时查询Consul 集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。 更新完成以后,可以选择运行shell 命令执行更新操作,重新加载Nginx。
- Consul-Template可以查询 Consul 中的服务目录、Key、Key-values 等。
这种强大的抽象功能和查询语言模板可以使Consul-Template 特别适合动态的创建配置文件。 - 例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends
- 准备template nginx模板
vim /root/consul/nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 88;
server_name ct 192.168.18.165;
access_log /var/log/nginx/cz.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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
- 编译安装nginx
略 - 配置nginx
vim /usr/local/nginx/conf/nginx.conf
#创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
#创建日志文件目录
mkdir /var/log/nginx
#建立软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/
#启动 nginx 服务
nginx
- 配置启动template
cd /root/consul
#解压
unzip consul-template_0.19.3_linux_amd64.zip
#移动文件
mv consul-template /usr/bin/
#启动服务,并指明nginx的配置文件名
consul-template -consul-addr 192.168.18.165:8500 \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/cz.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
- 在另一个终端查看生成配置文件
cat /usr/local/nginx/conf/vhost/cz.conf
upstream http_backend {
server 192.168.18.163:83;
server 192.168.18.163:84;
}
server {
listen 88;
server_name ct 192.168.18.165;
access_log /var/log/nginx/cz.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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
- 测试网页:http://192.168.18.165:88
- 查看日志
docker logs -f test-1
docker logs -f test-2
- 增加一个nginx容器节点,测试服务发现及配置更新功能
docker run -itd -p:85:80 --name test-5 -h test5 nginx
实验总结
- 本次实验consul实现了自动化发现新增服务服务,加入到群集中,并通过反向代理进行测试,配置文件实时更新,template动态配置服务的配置文件。