一、consul解决了什么问题?
如果后端应用服务器集群节点数量很多,前端负载均衡器配置和管理会很麻烦的问题
(负载均衡器的节点配置条目数量会很多,后端节点的网络位置发生了变化还需要修改所有调用这些后端节点的负载均衡器配置等问题)
二、consul的模式
client模式:可用于接收后端服务发来的注册信息,并转发给server节点,没有持久化能力
server模式:可用于接收后端服务/client模式的节点发来的注册信息,还可在server节点之间同步注册信息,具有持久化注册信息到本地的能力
server-leader节点:负责同步注册信息给其它的server节点,并对各个节点做健康检查。
三、consul的工作原理

consul提供的一些关键特性:
服务注册与发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
Key/Value存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
多数据中心:无需复杂的配置,即可支持任意数量的区域。
安装consul是用于服务注册,也就是容器本身的一些信息注册到consul里面,其他程序可以通过consul获取注册的相关服务信息,这就是服务注册与发现。
四、实操consul连接负载均衡与容器
步骤一:完成consul的部署



bash
启动consul后默认会监听5个端口:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口

bash
查看集群信息
#查看members状态
consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.80.15:8301 alive server 0.9.2 2 dc1
#查看集群状态
consul operator raft list-peers
consul info | grep leader
leader = true
leader_addr = 192.168.80.15:8300
通过 http api 获取集群信息
curl 127.0.0.1:8500/v1/status/peers #查看集群server成员
curl 127.0.0.1:8500/v1/status/leader #集群 server-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 #集群节点详细信息

2.完成gliderlabs/registrator:latest镜像的拉取,并完成启动



bash
-------- registrator服务器 --------
//容器服务自动加入 Nginx 集群
1. 安装 Gliderlabs/Registrator
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.66.70 \
consul://192.168.66.66:8500
----------------------------------------------------------------------------------------------------------
--net=host :把运行的docker容器设定为host网络模式。
-v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。
--restart=always :设置在容器退出时总是重启容器。
--ip :刚才把network指定了host模式,所以我们指定ip为宿主机的ip。
consul :指定consul服务器的IP和端口。
3.先部署节点服务器,做三个nginx的容器

验证consul可以注册发现


4.完成负载均衡器的部署以及相关的设置
bash
. 配置 nginx
vim /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
nginx

bash
http {
include mime.types;
include consul.conf;
....
location / {
root html;
index index.html index.htm;
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://container_backend;
}
....
}
5.在负载均衡器中完成插件的安装,实现配置模板文件
bash
wget https://releases.hashicorp.com/consul-template/0.19.3/consul-template_0.19.3_linux_amd64.zip
##网上下载或者导入文件
bash
[root@localhost opt]#ls
consul-template_0.19.3_linux_amd64.zip nginx-1.24.0 nginx-1.24.0.tar.gz nginx-1.25.3 nginx-1.25.3.tar.gz rh
[root@localhost opt]#unzip consul-template_0.19.3_linux_amd64.zip
Archive: consul-template_0.19.3_linux_amd64.zip
inflating: consul-template
[root@localhost opt]#ls
consul-template consul-template_0.19.3_linux_amd64.zip nginx-1.24.0 nginx-1.24.0.tar.gz nginx-1.25.3 nginx-1.25.3.tar.gz rh
[root@localhost opt]#mv consul-template /usr/local/bin/
[root@localhost opt]#mkdir consul-template
[root@localhost opt]#cd consul-template/
[root@localhost consul-template]#vim nginx.ctmpl
bash
[root@localhost consul-template]#vim nginx.ctmpl
[root@localhost consul-template]#cat nginx.ctmpl
upstream container_backend {
{{range service "docker-nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}