基于docker服务配置Consul+registrator实时服务发现

Consul是用于服务发现和配置的工具。Consul是分布式的,高度可用的,并且具有极高的可伸缩性。

Consul服务提供以下关键特性:

  • 服务发现:Consul 的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用 Consul 去发现一个指定服务的提供者.通过 DNS 或者 HTTP 应用程序可用很容易的找到他所依赖的服务;
  • 健康检查:Consul 客户端可用提供任意数量的健康检查,指定一个服务(比如: webserver 是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信息可由 operator用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机;
  • Key/Value存储:应用程序可用根据自己的需要使用 Consul 的层级的 Key/Value 存储.比如动态配置,功能标记,协调,领袖选举等等,简单的 HTTP API 让他更易于使用;
  • 多数据中心:Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。

关于Consul服务就不多介绍了,若想了解其更多功能,可移步至Consul官网

博文大纲:
一、环境准备
二、在Docker01上执行二进制命令部署consul服务
三、在docker02及docker03主机上以容器的方式运行consul服务
四、在docker02及docker03主机上以容器的方式运行registrator服务
五、在主机docker01上部署Nginx服务,以便提供反向代理
六、在docker01安装consul-template命令工具,并编写模板
七、验证服务的实时发现功能

一、环境准备

其工作示意图如下:

上面示意图的大概流程如下:
1、docker01主机上以二进制包的方式部署consul服务并后台运行,其身份为leader;
2、docker02、docker03以容器的方式运行consul服务,并加入到docker01的consul群集中;
3、在主机docker02、docker03上后台运行registrator容器,使其自动发现docker容器提供的服务;
4、在docker01上部署Nginx,提供反向代理服务,docker02、docker03主机上基于Nginx镜像,各运行两个web容器,提供不同的网页文件,以便测试效果;
5、在docker01上安装consul-template命令,将收集到的信息(registrator收集到容器的信息)写入template模板中,并且最终写入Nginx的配置文件中。
6、至此,实现客户端通过访问Nginx反向代理服务器(docker01),获得docker02、docker03服务器上运行的Nginx容器提供的网页文件。
注:registrator是一个自动发现docker container提供的服务,并且在后端服务注册中心(数据中心)注册服务。主要用来收集容器运行服务的信息,并且发送给consul。数据中心除了consul外,还有etcd、zookeeper等。

在开始之前,请先下载博文中配置所需要的源码包。

二、在Docker01上执行二进制命令部署consul服务

[[email protected] ~]# rz          #上传我提供的压缩包
[[email protected] ~]# unzip consul_1.5.1_linux_amd64.zip    #解包,解压后会得到一个命令
[[email protected] ~]# mv consul /usr/local/bin/    #移动到命令存放路径
[[email protected] ~]# chmod +x /usr/local/bin/consul    #赋予其执行权限
[[email protected] ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.20.6 -client=0.0.0.0 -node=master &
[1] 8330
[[email protected] ~]# nohup: 忽略输入并把输出追加到"nohup.out"
#执行命令后,会提示该信息,并占用终端,按回车键即可,
#运行上述命令后,会在当前目录下生成一个名为“nohup.out”的文件,其存放的是consul服务的运行日志
#执行上述命令后,consul就放到后台运行了,并返回其PID号,可以通过“jobs -l”命令进行查看

上述命令的相关参数解释如下:

  • -server:添加一个服务;
  • -bootstrap:一般在server单节点的时候使用,自选举为leader;
  • -ui:开启内部的web界面;
  • -bind:指定开启服务的IP(就是本机IP咯);
  • -client:指定服务的客户端(一般此处为任意);
  • -node:在集群内部通信使用的名称,默认是主机名。
    开启的端口作用如下:
  • 8300:集群节点;
  • 8301:集群内部访问的端口;
  • 8302:跨数据中心之间的通信;
  • 8500:http_ui;
  • 8600:DNS。

附加查询两条查询命令:

[[email protected] ~]# consul info    #可以看到这个群集的leader及版本信息
#如:leader_addr = 192.168.20.6:8300
[[email protected] ~]# consul members          #查看集群内部信息

至此,客户端可以访问docker01的8500端口进行验证,会看到以下页面:

三、在docker02及docker03主机上以容器的方式运行consul服务

###################  docker02服务器配置如下  #####################
[[email protected] ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart=always progrium/consul -join 192.168.20.6 -advertise 192.168.20.7 -client 0.0.0.0 -node=node01
#上述命令中,“-join”是指定leader的IP地址(也就是docker01);“-advertise”是指定自己本身的IP地址
###################  docker03服务器配置如下  #####################
[[email protected] ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart=always progrium/consul -join 192.168.20.6 -advertise 192.168.20.8 -client 0.0.0.0 -node=node02
#与docker02主机执行的命令类似,但是改成了自己的IP,及node名称改了
#注意:node名称在consul群集中,必须唯一。

注:主机docker01的consul服务也可以采用容器的方式部署,这里只是为了展示其多种部署方式而已。

至此,在docker01主机上,执行“consul members”命令,即可查看到docker02及docker03的信息,如下:

[[email protected] ~]# consul members        #执行该命令
Node    Address            Status  Type    Build  Protocol  DC   Segment
master  192.168.20.6:8301  alive   server  1.5.1  2         dc1  <all>
node01  192.168.20.7:8301  alive   client  0.5.2  2         dc1  <default>
node02  192.168.20.8:8301  alive   client  0.5.2  2         dc1  <default>

客户端访问192.168.20.6的8500端口,通过以下操作,也可看到docker02或03主机上所有与docker容器相关的端口:

四、在docker02及docker03主机上以容器的方式运行registrator服务

#############  主机docker02配置如下  #############
[[email protected] ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://192.168.20.7:8500
#上述命令的作用是将收集的容器信息发送给本机的8500端口来显示
#############  主机docker03配置如下  #############
[[email protected] ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://192.168.20.8:8500
#同docker02,将收集的容器信息发送给本机的8500端口来显示

五、在主机docker01上部署Nginx服务,以便提供反向代理

部署Nginx服务,这里就不写注释了,若想优化Nginx服务,可以参考博文:Nginx安装及深度优化

[[email protected] ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src
[[email protected] ~]# useradd -M -s /sbin/nologin www
[[email protected] ~]# cd /usr/src/nginx-1.14.0/
[[email protected] nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module && make && make install
[[email protected] nginx-1.14.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[[email protected] nginx-1.14.0]# nginx

六、在docker01安装consul-template命令工具,并编写模板

consul-template的作用:将收集到的信息(把registrator收集到容器的信息)写入template模板中,并且最终写入Nginx的配置文件中。

1、生成consul-template命令工具(若要安装新版本的请移步Consul模板发布页面,下载最新版本使用):

[[email protected] ~]# rz           #上传我提供的包
[[email protected] ~]# unzip consul-template_0.19.5_linux_amd64.zip     #解包
[[email protected] ~]# mv consul-template /usr/local/bin/   #移动到命令搜索路径
[[email protected] ~]# chmod +x /usr/local/bin/consul-template    #赋予执行权限

2、在Nginx安装目录下,编写模板供consul-template命令工具使用,并且配置Nginx反向代理:

[[email protected] ~]# cd /usr/local/nginx/
[[email protected] nginx]# mkdir consul
[[email protected] nginx]# cd consul/
[[email protected] consul]# vim nginx.ctmpl    #新建一个模板文件
upstream http_backend {
  {{range service "nginx"}}            #这里的“Nginx”是基于docker镜像进行搜索的,而不是容器的名称
  server {{.Address}}:{{.Port}};
  {{ end }}
}
#以上是go语言编写的,目的是为了收集Nginx相关的IP地址及端口信息
#下面是定义反向代理
server {
  listen 8000;               #监听地址可任意指定,不要冲突即可
  server_name localhost;
  location / {
  proxy_pass http://http_backend;
  }
}
#编辑完成后,保存退出即可
[[email protected] consul]# nohup consul-template -consul-addr 192.168.20.6:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" &
#将本机收集到的信息,生成一个vhost.conf文件
#此服务必须在后台运行,才可实现服务的实时发现与更新
[[email protected] consul]# vim ../conf/nginx.conf        #在主配置文件中进行调用生成的vhost.conf文件
include /usr/local/nginx/consul/*.conf;
}             #在配置文件末尾的花括号上方写入“include”配置,进行调用vhost.conf文件

七、验证服务的实时发现功能

配置至此,docker02或者docker03上一旦有任何Nginx相关的容器以后台“-d”的运行方式运行,都会被添加到反向代理中来,进行调度,一旦容器发生意外关闭,则可以自动从反向代理配置文件中剔除。

现在可以在docker02、和docker03上分别运行两台Nginx容器,其容器名称依次为web01、web02.......,其网页文件依次为:this is web01 test、this is web02 test..........

为其准备不同的网页文件的目的就是方便客户端访问时区分访问的是哪台容器。

由于其配置过程类似,我这里就写出一个运行Nginx容器的过程,其他照做即可。

配置示例如下(运行web01并修改其首页文件):

[[email protected] ~]# docker run -d -P --name web01 nginx
[[email protected] ~]# docker exec -it web01 /bin/bash
[email protected]:/# echo "this is a web01 test." > /usr/share/nginx/html/index.html 

在docker02及docker03运行四个Nginx容器后(必须以后台运行的方式,也就是说在运行时必须有“-d”选项),那么,此时访问docker01的8000端口,就会循环访问到这四个容器提供的网页文件,如下:

[[email protected] consul]# curl 192.168.20.6:8000
this is a web01 test.
[[email protected] consul]# curl 192.168.20.6:8000
this is a web02 test.
[[email protected] consul]# curl 192.168.20.6:8000
this is a web03 test.
[[email protected] consul]# curl 192.168.20.6:8000
this is a web04 test.
[[email protected] consul]# curl 192.168.20.6:8000
this is a web01 test.
[[email protected] consul]# curl 192.168.20.6:8000
this is a web02 test.
#并且查看以下文件,会看到其中的配置
[[email protected] consul]# pwd
/usr/local/nginx/consul
[[email protected] consul]# cat vhost.conf     #以下web池中的server都是基于编写的模板自动生成的
upstream http_backend {

  server 192.168.20.7:32768;

  server 192.168.20.7:32769;

  server 192.168.20.8:32768;

  server 192.168.20.8:32769;

}

server {
  listen 8000;
  server_name localhost;
  location / {
  proxy_pass http://http_backend;
  }
}
#由于consul-template是在后台运行的,所以,只要检测到容器的变化,就会动态修改上述文件
#并且重启Nginx服务,使更改生效

若现在删除docker02及docker03所有Nginx容器,只保留一台web01,然后再次访问Nginx代理服务器的8000端口,则永远只能访问到web01的网页,并且查看vhost.conf文件,之前添加的server地址及端口也没有了,如下(自行删除或停止Nginx容器):

[[email protected] consul]# cat vhost.conf         #该文件中只有web01容器的IP及端口信息了
upstream http_backend {

  server 192.168.20.7:32768;

}

server {
  listen 8000;
  server_name localhost;
  location / {
  proxy_pass http://http_backend;
  }
}
#多次访问,也只能访问到web01的页面:
[[email protected] consul]# curl 192.168.20.6:8000
this is a web01 test.
[[email protected] consul]# curl 192.168.20.6:8000
this is a web01 test.
[[email protected] consul]# curl 192.168.20.6:8000
this is a web01 test.
[[email protected] consul]# curl 192.168.20.6:8000
this is a web01 test.

至此,consul+registrator+docker实时服务发现就配置完成了。

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/14154700/2446102

时间: 2024-11-10 17:19:35

基于docker服务配置Consul+registrator实时服务发现的相关文章

Docker + Consul + registrator实现服务发现及nginx反向代理

一. 架构设计 在现实中,我们一直渴望着追求提供高质量.高可用的服务架构体系,同时减少不必要的部署和维护代价,减少容错率.面对如此高的要求,可以有两种架构方案:Docker+Etcd+Confd+NginxDocker+Consul+Nginx本文中我们主要来介绍 Docker+Etcd+Confd+Nginx方案,此方案更加高效.快捷,并且维护代价和容错率更低,分布式支持力度更强,如下图所示: 上面示意图的大概流程如下:1.docker01主机上以二进制包的方式部署consul服务并后台运行,

Docker+Consul+Registrator实现服务自动注册与发现

近年微服务架构在互联网应用领域中愈来愈火,引入微服务主要解决了单体应用多个模块的紧耦合.无法扩展和运维困难等问题.微服务架构就是按照功能粒度将业务模块进行垂直拆分,对单体应用本身进行服务化和组件化,每个组件单独部署为小应用(从DB到UI).微服务与微服务之间通过Service API进行交互,同时为了支持水平扩展.性能提升和服务可用性,单个服务允许同时部署一个或者多个服务实例.在运行时,每个实例通常是一个云虚拟机或者Docker容器.本篇文章就可以完美的解决这一问题! 关于docker这里就不多

基于docker 如何部署surging分布式微服务引擎

1.前言 转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微服务引擎,再把业务进行剥离, 通过配置路径就能驱动加载业务模块,这样的细粒度设计,能更加灵活从业务中针对于对象加以细分,能更加灵活的拆分聚合服务.而这篇文章我们来谈谈基于docker 如何部署 surging源码下载 2.概述 容器,就是用来存放镜像的器皿,而镜像是构建成的一个轻量的.独立的.可执行

基于docker的高可用服务解决方案

Docker从2013年发布第一个版本以来,已经火遍全球,技术迭代也比较频繁,其周边产品和技术也越来越丰富.Docker的轻量级容器不仅实现了资源隔离,而且几乎可以运行在任何地方,使得部署和扩展变得非常容易,随着Docker的日趋完善,目前Docker已经被越来越多的公司应用到生产环境中. 一.环境 1.1.宿主机操作系统环境 Centos7.1-64 1.2.docker版本 Server Version: 1.9.1 1.3.集群网络环境 master:10.2.0.80 slave1:10

RH124-09 OpenSSH服务配置与安全

第九章 OpenSSH服务配置与安全 9.1 通过ssh访问远程命令 OpenSSH提供一个安全的远程shell,用于管理远程Linux.unix系统. OpenSSH使用非对称加密手段加密保护通信数据. $ ssh remotehost $ ssh [email protected] 或 ssh -l remoteuser remotehost $ ssh [email protected] remote-command $ w -f 相关文件: 客户端会首次登陆远程机器的时候,会把远程机器的

基于Docker的持续发布都要解决哪些问题 第一集

郑昀编著,文字资料来自于张帆.白俊华.刘飞宇以及网络资料 创建于2015/10/21 最后更新于2015/10/29 关键词:Docker,容器,持续集成,持续发布,CI,私有云 本文档适用人员:广义上的技术人员 提纲: 集装箱还是卷挂载? Host Networking 还是 Bridge Networking? 容器要固定IP吗? 容器内部如何获取宿主机的IP? 待续   首先,你要明白容器并不是虚拟机,虽然它可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题

基于Consul+Registrator+Nginx实现容器服务自动发现的集群框架

我们先来看一下服务发现常用的框架有哪些: zookeeper eureka etcd consul 这里就不挨个来介绍它们了,本文中主要以consul为主,如果你在大量接触或使用微服务的话,你可能会碰到一个问题?当你创建的服务数量越来越多时,这些服务之间的通信便越难管理,而且维护代价会越来越高.consul可以给你答案,我们一起来了解一下consul: 1.了解consul Consul是一个分布式,高度可用且支持多数据中心的服务发现,配置和编排工具. Consul支持大规模部署,配置和维护面向

基于Docker的Consul服务发现集群搭建

原文:基于Docker的Consul服务发现集群搭建 在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架构示范,也会更加贴近于实际应用环境. 一.示例整体架构 此示例会由一个API Gateway, 一个Consul Client以及三个Consul Server组成,有关Consul的Client和Server这两种模式的Agent的背景知识,请

Consul+Registrator+Docker实现服务发现(nginx反向代理)

环境准备: consul:高可用,分布式的服务发现的工具 master主机-docker01:172.16.1.30 node01主机-docker02:172.16.1.31node02主机-docker03:172.16.1.32 注意:因为是测试环境,所以暂时关闭防火墙,禁用selinux,如果是对外网发布的服务器,是不可以关闭防火墙,可以设置iptables规则. 项目操作: (1)docker01上部署consul:下载或上传consul_1.5.1_linux_amd64软件包: [