docker ---Consul部署
本文使用Consul(https//www.consul.io/)作为服务发现工具的例子。Consul是一个使用一致性算法的特殊数据存储器。Consul使用Raft一致性算法来提供确定的写入机制。Consul暴露了键值存储系统和服务分类系统,并提供可用性、高容错能力,并保证强一致性。服务可以将自己注册到Consul,并以高可用且分布式的方式共享这些信息Consul还提供了一些有趣的功能提供了根据A
文章目录
引言:
Consul 简化了分布式环境中的服务的注册和发现流程,通过 HTTP 或者 DNS 接口发现。支持外部 SaaS 提供者等。
一、服务发现
服务发现是分布式应用程序之间管理相互关系的一种机制。一个分布式程序一般由多个组件组成。这些组件可以都放在一台机器上,也可以分布在多个数据中心,甚至分布在不同的地理区域。这些组件通常可以为其他组件提供服务,或者为其他组件消费服务
服务发现 允许某个组件在想要与其他组件交互时,自动找到对方 。由于这些应用沈本是分布式的,服务发现机制也需要分布式的。而且,服务发现作为分布式应用不同组件之间的“胶水”,其本身还需要足够动态、可开,适应性强,而且可以快速且一致地共享关于这些服务的数据
另外,Docker主要关注分布式应用以及 面向服务架构与微服务架构 。这些关注点很适合与某个服务发现工具集成。每个Docker容器可以将其中运行的服务注册到服务发现工具里。注册的信息可以是IP地址或者端口,或者两者都有,以便服务之间进行交互
二、consul介绍
本文使用Consul( https://www.consul.io/)作为服务发现工具的例子。Consul是一个使用一致性算法的特殊数据存储器。Consul使用Raft一致性算法来提供确定的写入机制。Consul暴露了键值存储系统和服务分类系统,并提供可用性、高容错能力,并保证强一致性。服务可以将自己注册到Consul,并以高可用且分布式的方式共享这些信息
Consul还提供了一些有趣的功能:
提供了根据API进行服务分类,代替了大部分传统服务发现工具的键值对存储
提供两种接口来查询信息:基于内置的DNS服务的DNS查询接口和基于HTTP的REST API查询接口。选择适合的接口,尤其是基于DNS的接口,可以很方便地将Consul与现有环境集成
提供了服务监控,也称作健康监控。Consul内置了强大的服务监控系统
为了更好地理解Consul是如何工作的,本文先介绍如何在Docker容器里分布式运行Consul。之后会从Docker容器将服务注册到Consul,并从其他Docker容器访问注册的数据。为了更有挑战,会让这些容器运行在不同的Docker宿主机上
为了做到这些,需要做到以下几点:
创建Consul服务的Docker镜像
构建3台运行Docker的宿主机,并在每台上运行一个Consul。这3台宿主机会提供一个分布式环境,来展现Consul如何处理弹性和失效工作的
构建服务,并将其注册到Consul,然后从其他服务查询该数据
附加:可以在 http://consul.io/intro/index.html找到对Consul更通用的介绍
三、搭建consul集群
建立consul服务
每个提供服务的节点上都要部署和运行Consul的agent
Consul agent有两种运行模式
Server
Client
Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关
3.1 服务环境
操作系统 | IP | 服务 |
---|---|---|
centos7 | 192.168.161.12 | server |
centos7 | 192.168.161.11 | client |
3.2 server部署(192.168.161.12)
[root@docker opt]# mkdir consul
[root@docker opt]# cd consul/
[root@docker consul]# ls
consul_0.9.2_linux_amd64.zip
[root@docker consul]# unzip consul_0.9.2_linux_amd64.zip
Archive: consul_0.9.2_linux_amd64.zip
inflating: consul
[root@docker consul]# ls
consul consul_0.9.2_linux_amd64.zip
[root@docker consul]# mv consul /usr/bin
[root@docker consul]# consul agent \ 进行初始化
> -server \
> -bootstrap \
> -ui \ UI界面
> -data-dir=/var/lib/consul-data \ 数据存储的位置
> -bind=192.168.161.12 \ 绑定地址
> -client=0.0.0.0 \ 监听所有地址
> -node=consul-server01 &> /var/log/consul.log &
[1] 93055
[root@docker consul]# consul members 插卡集群成员
[root@docker consul]# consul info | grep leader
查看集群server成员 | curl 127.0.0.1;8500/v1/status/peers |
---|---|
集群raf leader | curl 127.0.0.1;8500/v1/status/leader |
注册的所有服务 | curl 127.0.0.1:8500/v1/catalog/services |
查看nginx服务信息 | curl 127.0.0.1:8500/v1/catalog/nginx |
查看节点详细信息 | curl 127.0.0.1:8500/v1/catalog/nodes |
3.3 client 部署(192.168.161.11)
容器服务自动加入nginx集群
1、安装Gliderlabs/Registrator Gliderlabs/Registrator
可检查容器运行状态自动注册,还可注销docker容器的服务 到服务配置中心
目前支持Consul、Etcd和SkyDNS2
在192.168.184.12节点上,执行以下操作
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.161.11 \
consul://192.168.161.12:8500
[root@docker ~]# docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=192.168.161.11 consul://192.168.161.12:8500
[root@docker ~]# docker images
[root@docker ~]# docker ps
[root@docker ~]# docker run -itd -p:81:80 --name test-01 -h test01 nginx
[root@docker ~]# docker run -itd -p:82:80 --name test-02 -h test02 nginx
[root@docker ~]# docker run -itd -p:83:80 --name test-03 -h test03 httpd
[root@docker ~]# docker run -itd -p:84:80 --name test-04 -h test04 httpd
[root@docker ~]# docker ps
使用浏览器访问consul服务器
http://192.168.161.12:8500
此时应该可以发现5个服务
3.4 配置template模块
server(192.168.161.12)
Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以查询Consul中的服务目录,Key、Key-values等。
[root@docker consul]# pwd
/opt/consul
您在 /var/spool/mail/root 中有新邮件
[root@docker consul]# vim nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 100;
server_name localhost 192.168.161.12;
access_log /var/log/nginx/lic.com-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
yum -y install gcc pcre-devel zlib-devel
rz nginx-1.12.0.tar.gz
tar zxvf nginx-1.12.0.tar.gz -C /opt
cd /opt/nginx-1.12.10
./configure --prefix=/usr/local/nginx
make && make install
vim /usr/local/nginx/conf/nginx.conf
//19行添加 include vhost/*.conf;
cd /usr/local/nginx/conf/
mkdir vhost
mkdir /var/log/nginx
/usr/local/nginx/sbin/nginx
cd /opt
rz consul-template_0.19.3_linux_amd64.zip
unzip consul-template_0.19.3_linux_amd64.zip
[root@docker opt]# mv consul-template /usr/bin
[root@docker opt]# consul-template -consul-addr 192.168.161.12:8500 -template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/liu.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
另开终端查看
192.168.161.11
docker run -itd -p:85:80 --name test-05 -h test05 nginx
3.5 测试访问代理服务器
是否可以是否可以完成代理访问轮询
192.168.161.12
http://192.168.161.12:100/
docker logs -f test-01
docker logs -f test-02
docker logs -f test-05
更多推荐
所有评论(0)