前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Nginx和Consul构建高可用及自动发现的Docker服务架构

基于Nginx和Consul构建高可用及自动发现的Docker服务架构

作者头像
陌无崖
发布2019-08-16 17:42:49
9880
发布2019-08-16 17:42:49
举报

点击蓝字关注我吧

1、导读

如果你对微服务有了解,那么你看肯定知道,一个项目中微服务的数量可能上千,随着服务数量的越来越多,服务与服务之间的通信变得越来越复杂,我们的微服务也变得超级难管理,所以今天我给大家分享我在学习时的一篇笔记,如何设计出高可用的Dcoker服务架构,此架构可以自动发现进行注册,利用consul可以轻易的在众多服务中哪个服务出现了问题。以下代码本人亲测可用,环境为centos7,需要两台虚拟机一台用途为Registor Zabbix(192.168.10.252)一台Consul(192.168.10.253)

首先来看一下Cousul的官方解释:

Consul是一套开源的分布式服务发现和配置管理系统,支持多数据中心分布式高可用。Consul是HashiCorp(Vagrant的创建者)开发的一个服务发现与配置项目,用Go语言开发,基于 Mozilla Public License 2.0 的协议开源。

架构设计

这套架构有什么好处呢?我认为最好的就是它的自动发现,当你启动服务时不用修改任何的配置文件,当添加一个服务式,它便会自动进行配置的编写。

架构优势

  • 自动发现与注册组件consul使用 Raft 算法来保证一致性,比复杂的Paxos 算法更直接。相比较而言,zookeeper 采用的是 Paxos,而 etcd 使用的则是 Raft;
  • 支持多数据中心(参见图Consul多数据中心分布式集群架构),多数据中心集群可以避免单数据中心的单点故障,zookeeper 和 etcd 均不提供多数据中心功能的支持;
  • 自动、实时发现及无感知服务刷新,具备资源弹性,伸缩自如(通过生成、销毁容器实现);
  • 支持健康检查,负载能动态在可用的服务实例上进行均衡,etcd 不提供此功能;
  • 支持足够多台Docker容器(前提架构资源足以保证性能支撑);
  • 支持http 和dns 协议接口,zookeeper 的集成较为复杂,etcd 只支持 http 协议;
  • 服务规模方便进行快速调整,官方提供web管理界面,etcd 无此功能;
  • Consul template 搭配consul使用,支持多种接入层,如Nginx、Haproxy。

使用Docker搭建部署

代码语言:javascript
复制
# 官方下载consul压缩包
mkdir consul
cd consul
# 将压缩包上传至consul目录下
unzip consul_1.5.2_linux_amd64.zip
mv consul /usr/bin
# 切换到root目录
consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.10.253 -client=0.0.0.0 -node=consul-server01
# 或者后台启动
nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.10.253 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
代码语言:javascript
复制
#查看集群信息
consul members
consul info |grep leader

容器服务自动加入Nginx集群

代码语言:javascript
复制
# 安装Glider/Registrator
docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=192.168.10.252 consul://192.168.10.253:8500
# 测试服务是否正常
docker run -itd -p:83:80 --name test-01 -h test01 nginx
docker run -itd -p:84:80 --name test-02 -h test02 nginx
# 安装Consul-Template
# 准备Nginx模板文件
vim /root/consul/nginx.ctmpl

nginx.ctmpl

代码语言:javascript
复制
upstream http_backend{
    {{range service "nginx"}}
    server{{.Address}}:{{.Port}};
    {{end}}
}

server{
    listen 83;
    server_name localhost 192.168.10.253;
    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-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://http_backend;
    }
}
代码语言:javascript
复制
# 编译安装Nginx 上传nginx包至root目录
yum install gcc pcre-devel zlib-devel -y
tar zxvf nginx-1.16.0.tar.gz
cd nginx-1.16.0
./configure --prefix=/usr/local/nginx
make
make install
# 配置nginx
vim /usr/local/nginx/nginx.conf

nginx.conf

代码语言:javascript
复制
mkdir /usr/local/nginx/conf/vhost
# 启动nginx
/usr/local/nginx/sbin/nginx
# 查看是否启动
ps -C nginx -o pid
代码语言:javascript
复制
# 配置并启动temlate 服务 
# 上传consul-template压缩包到 /root目录
unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/bin/
# 在前台启动,启动后不要Ctrl+C终止
consul-template -consul-addr 192.168.10.253:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info

查看配置文件

代码语言:javascript
复制
cat /usr/local/nginx/conf/vhost/kgc.conf

此时增加一个Nginx容器节点

代码语言:javascript
复制
docker run -itd -p:85:80 --name test-05 -h test05 nginx

再次查看配置文件

好了是不是很神奇,配置文件最后自动增加了。

转载请联系我

本文参考:

https://www.jianshu.com/p/9976e874c099?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

Docker容器技术与高可用实战

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang技术杂文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档