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

逻辑图 实现nginx节点自动化加入容器IP代理

1、三台Consul agent server作为高可用通过Consul Template实时监测Leader的变化。

2、Leader如果变化就触发渲染模板动作,执行相应命令。

3、如图 如果Node01 docker创建了一个nginx web容器随机暴露了一个24123端口,Registrator会监听到这个事件之后,会将宿主级IP与暴露的端口注册到本地的Consul agent client。

4、Consul agent Clinet 再将这个请求转发到 Consul agent service中。


环境说明

  • Linux系统版本:Linux Centos 7.4 x64
  • Consul应用版本:consul_1.4.0
  • Template应用版本:consul-template_0.19.3
  • Docker应用版本:18.09.0
  • Consul管理节点:192.168.1.79
  • Docker工作节点:192.168.1.78
  • Docker工作节点:192.168.1.77

1、管理节点安装 Consul 服务端

1.1、下载解压安装包Consul

  • Consul下载地址:https://pan.baidu.com/s/13fFhJwj6TxXkAB0tOLo8Sg
  • 密码:hjub
# 解压出一个二进制包
unzip unzip consul_1.4.0_linux_amd64.zip
# 移动到bin目录下
mv consul /usr/bin

1.2、server模式初始化集群

consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.1.79 \
-client=0.0.0.0 \
-node=test
# 使用命令
consul agent \
# 设置server模式
-server \
# 自选举为自己Leader
-bootstrap \
# 启用内置web页面
-ui \
# 集群数据保存位置
-data-dir=/var/lib/consul-data \
# 集群之间通讯绑定地址
-bind=192.168.1.79 \
# 客户端访问地址
-client=0.0.0.0 \
# 指定管理节点名称默认主机名,必须是唯一的
-node=test

命令注解

==> Consul agent running!
# 软件版本1.4
Version: 'v1.4.0'
Node ID: '0f09693a-f66e-08f2-6199-0523c27d010d'
# node节点为test
Node name: 'test'
# 数据中心默认名称dc1
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: true)
# client可访问IP地址
Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
# 集群IP地址,设置为管理节点地址
Cluster Addr: 192.168.1.79 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false

输出详解

1.3、查看管理节点Consul启动信息

命令:netstat -antp | grep consul

# 集群节点
tcp 0 0 192.168.1.79:8300 0.0.0.0:* LISTEN 68220/consul
# 集群内部访问
tcp 0 0 192.168.1.79:8301 0.0.0.0:* LISTEN 68220/consul
# 夸数据中心访问
tcp 0 0 192.168.1.79:8302 0.0.0.0:* LISTEN 68220/consul
tcp 0 1 192.168.1.79:52742 192.168.1.78:8301 SYN_SENT 68220/consul
tcp 0 0 192.168.1.79:8300 192.168.1.79:55923 ESTABLISHED 68220/consul
tcp 0 0 192.168.1.79:55923 192.168.1.79:8300 ESTABLISHED 68220/consul
tcp 0 0 192.168.1.79:8300 192.168.1.77:44698 ESTABLISHED 68220/consul
# HTTP
tcp6 0 0 :::8500 :::* LISTEN 68220/consul
# DNS
tcp6 0 0 :::8600 :::* LISTEN 68220/consul

查看管理节点启用端口

命令:consul info

agent:
check_monitors = 0
check_ttls = 0
checks = 0
services = 0
build:
prerelease =
revision = 0bddfa23
version = 1.4.0
consul:
acl = disabled
bootstrap = true
known_datacenters = 1
leader = true
# leader地址
leader_addr = 192.168.1.79:8300
server = true
# 保持选举一致性算法
raft:
applied_index = 22
commit_index = 22
fsm_pending = 0
last_contact = 0
last_log_index = 22
last_log_term = 2
last_snapshot_index = 0
last_snapshot_term = 0
latest_configuration = [{Suffrage:Voter ID:0f09693a-f66e-08f2-6199-0523c27d010d Address:192.168.1.79:8300}]
latest_configuration_index = 1
num_peers = 0
protocol_version = 3
protocol_version_max = 3
protocol_version_min = 0
snapshot_version_max = 1
snapshot_version_min = 0
state = Leader
term = 2
runtime:
arch = amd64
cpu_count = 2
goroutines = 81
max_procs = 2
os = linux
version = go1.11.1
serf_lan:
coordinate_resets = 0
encrypted = false
event_queue = 1
event_time = 2
failed = 0
health_score = 0
intent_queue = 0
left = 0
member_time = 1
members = 1
query_queue = 0
query_time = 1
serf_wan:
coordinate_resets = 0
encrypted = false
event_queue = 0
event_time = 1
failed = 0
health_score = 0
intent_queue = 0
left = 0
member_time = 1
members = 1
query_queue = 0
query_time = 1

查看consul信息

命令:consul members

Node  Address            Status  Type    Build  Protocol  DC   Segment
test 192.168.1.79:8301 alive server 1.4.0 2 dc1 <all>

查看集群成员

查看leaderIP地址
consul catalog services

查看注册服务

curl 127.0.0.1:8500/v1/status/peers # 集群server成员
curl 127.0.0.1:8500/v1/status/leader # 集群Raft leader
curl 127.0.0.1:8500/v1/catalog/services # 注册的所有服务
curl 127.0.0.1:8500/v1/catalog/services/nginx # 服务信息
curl 127.0.0.1:8500/v1/catalog/nodes # 集群节点详细信息

通过HTTP API获取集群信息

类型        描述
kv 键值存储
agent agent管理
catalog nodes和services管理
health 健康检查
session session管理
acl ACL管理
event 用户事件
status Consul系统状态

Consul API管理

2、工作节点安装Consul 客户端

2.1、下载解压安装包到本地

# 解压出一个二进制包
unzip unzip consul_1.4.0_linux_amd64.zip
# 移动到bin目录下
mv consul /usr/bin

2.2、client模式加入集群

工作节点1

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.1.79 -advertise 192.168.1.77 -client 0.0.0.0 -node=node01

工作节点2

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.1.79 -advertise 192.168.1.78 -client 0.0.0.0 -node=node02
# 运行
docker run -d \
# 指定名称
--name=consul \
# 指定暴露端口
-p 8301:8301 \
-p 8301:8301/udp \
# 提供HTTP服务端口
-p 8500:8500 \
# 提供DNS服务端口
-p 8600:8600 \
-p 8600:8600/udp \
# 设置重启策略
--restart=always \
# 指定镜像
progrium/consul \
# 加入现有集群IP
-join 192.168.1.79
# 通告地址,本机地址
-advertise 192.168.1.77
# 通过那里连接本地
-client 0.0.0.0
# 指定管理节点名称默认主机名,必须是唯一的
-node=node01

命令注解

2.3、查看工作节点consul启动情况

命令:docker ps

CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                                                                                                                                                            NAMES
7c82880b3685 progrium/consul "/bin/start -join 19…" 3 minutes ago Up 9 seconds 53/tcp, 8300/tcp, 53/udp, 8302/tcp, 0.0.0.0:8301->8301/tcp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301->8301/udp, 8400/tcp, 8302/udp, 0.0.0.0:8600->8600/tcp, 0.0.0.0:8600->8600/udp consul

查看启动情况

命令:consul members

Node    Address            Status  Type    Build  Protocol  DC   Segment
test 192.168.1.79:8301 alive server 1.4.0 2 dc1 <all>
node01 192.168.1.77:8301 alive client 0.5.2 2 dc1 <default>
node02 192.168.1.78:8301 failed client 0.5.2 2 dc1 <default>

管理端测试

注:关闭防火墙拦截。

2.4、管理节点:web页面测试查看

http://192.168.1.79:8500/ui/dc1/services

查看节点

3、管理节点:注册使用

3.1、注册服务

# 案例:
curl -X PUT -d \
'{"id": "jetty","name": "service_name","address": "192.168.1.77","port": 8080,"tags": ["test"],"checks":
[{"http": "http://192.168.1.77:8080/","interval": "5s"}]}' \
http://127.0.0.1:8500/v1/agent/service/register

3.2、查看注册服务

4、管理节点工作节点安装Dokcer

5、工作节点:安装Registrator与template

5.1、Registrator简介

consul-template:一个守护程序,用于实时查询consul集群数据,并更新文件系统上的任意数量的指定模板,生成配置文件,更新完成后可以选择运行任何命令。

gliderlabs/registrator:检查容器运行状态自动注册到服务中心。registrator支持服务注册有consul、etcd、SkyDNS2。

5.2、工作节点1节点2:下载解压部署

  • Template下载地址:https://pan.baidu.com/s/1N9U89ClxY-fpTfxiP8l3Tw
  • 密码:wso1
# 解压文件
unzip consul-template_0.19.3_linux_amd64.zip
# 移动文件到bin目录下
mv consul-template /usr/bin/

5.3、工作节点1节点2:创建registrator项目

docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
consul://192.168.1.77:8500
# docker run -d \
# 指定容器名称
--name=registrator \
# 给容器挂载存储卷,挂载到容器的某个目录
-v /var/run/docker.sock:/tmp/docker.sock \
# 添加重启策略
--restart=always \
# 指定镜像
gliderlabs/registrator:latest \
# 指定docker本地IP,连接注册到consul client。
consul://192.168.1.77:8500 注:它可以将之前创建的容器注册。

命令注解

5.4、浏览器查看注册情况

6、实现Nginx集群节点自动加入

6.1、工作节点1节点2:启动nginx容器

docker run -d -P nginx

6.2、工作节点1节点2:浏览器查看服务

前提:管理节点(推荐)环境安装好nginx服务设置代理

6.3、管理节点:创建nginx代理模板

vi nginx.ctmpl

upstream http_backend {
ip_hash;
# nginx 为服务名称
{{range service "nginx"}}
# 服务名 服务IP:端口号
server {{ .Address }}:{{ .Port }};
# 结束
{{ end }}
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}

6.4、管理节点:配置template自动部署

consul-template \
-consul-addr 192.168.1.79:8500 \
-template "./nginx.ctmpl:/etc/nginx/conf.d/default2.conf:/usr/sbin/nginx -s reload" \
-log-level=info
# 使用template命令
consul-template \
# 指定consul server地址
-consul-addr 192.168.1.79:8500 \
# 指定 新配置文件:生成配置文件:重载配置文件
-template "./nginx.ctmpl:/etc/nginx/conf.d/default2.conf:/usr/sbin/nginx -s reload" \
# 指定日志级别
-log-level=info

命令详解

6.5、管理节点:测试查看生成结果

命令: cat default2.conf 

upstream http_backend {
ip_hash; server 192.168.1.77:32768; server 192.168.1.77:32769; server 192.168.1.78:32788;
} server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}

6.6、测试添加了多台Nginx容器后输出,验证自动发现

查看Nginx配置文件

cat default2.conf
upstream http_backend {
ip_hash; server 192.168.1.77:32772; server 192.168.1.77:32768; server 192.168.1.77:32771; server 192.168.1.77:32773; server 192.168.1.77:32770; server 192.168.1.77:32769; server 192.168.1.78:32789; server 192.168.1.78:32791; server 192.168.1.78:32788; server 192.168.1.78:32790; } server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}
注:删除添加docker容器都执行动作。

Docker+Consul+Registrator 实现服务注册与发现的更多相关文章

  1. Docker consul的容器服务更新与发现(超详细配图)

    Docker consul的容器服务更新与发现 1.概述 2.部署 1.概述: (1)什么是服务注册与发现: 服务注册与发现是微服务架构中不可或缺的重要组件.起初服务都是单节点的,不保障高可用性,也不 ...

  2. Docker consul的容器服务更新与发现

    Docker consul的容器服务更新与发现 目录 Docker consul的容器服务更新与发现 一.Consul简介 1. 服务注册与发现 2. consul概述 3. consul的两种模式 ...

  3. .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关

    1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...

  4. Consul之:服务注册与发现

    一.服务的管理(注册与发现)有三种方式: 1:通过配置文件的方式静态注册2:通过HTTP API接口来动态注册(spring cloud使用方式,spring cloud中使用的是consul api ...

  5. 使用consul实现分布式服务注册和发现--redis篇

    安装consul client consul 客户端检脚本 ====================================================================== ...

  6. Spring Cloud 之 Consul 知识点:服务注册与发现(类似工具:Eureka、ZooKeeper、Etcd)

    资料 网址 springcloud(十三):注册中心 Consul 使用详解 http://ityouknow.com/springcloud/2018/07/20/spring-cloud-cons ...

  7. 分布式服务注册和发现consul 简要介绍

    Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框 架 ...

  8. 基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

    0.简介 0.1 什么是 Consul Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程 ...

  9. Spring Cloud Consul 实现服务注册和发现

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...

随机推荐

  1. Javascript 运行上下文和作用域链

    一.作用域Scope和上下文Context 在javascript中,作用域scope和上下文context是两个不同的概念.每个函数调用都会伴随着scope和context,从本质上来说,scope ...

  2. Linux下的搜索查找命令的详解(which)

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:  which  查看可执行文件的位置. whereis 查看文件的位置.  locate   配合数据库查看文件 ...

  3. 使用cmd导入导出oracle数据库dmp文件

    exp scott/test@192.168.0.195/orcl file=C:\Users\zz\Desktop\1\gd_base.dmp log=C:\Users\zz\Desktop\1\g ...

  4. postgresql免密码登录

    https://www.postgresql.org/docs/8.3/static/libpq-pgpass.html vi ~/.pgpass 输入以下内容 hostname:port:datab ...

  5. 11.17 luffycity(7)完结

    2018-11-17 15:59:01 路飞项目已经完结!后面已是flask的学习!然后还有十几天的课程等回学校再看 明天归校!!  开始全面整理自己学习的知识,整理博客!还有好多面试题!233333 ...

  6. mybatis13--2级缓存

    验证内置的2级缓存 Ehcache缓存的配置 01.引入需要的ehcache 和mybatis-ehcache 两个jar包 02.在mapper文件中增加  <cache type=" ...

  7. ruby 基础知识2 - 区块 block

    原文 1. block中的 yield 与遍历 5.times do |i| puts i end 或者 def my_times(n) i = 0 while n > i i += 1 yie ...

  8. css的小知识3

    1.补充 margin的margin:0 auto:会解决元素的居中,前提是给这个元素设置width 2.css的层叠问题 css有两个性质 1.继承性 2.层叠性  选择器的一种选择能力,谁的权重大 ...

  9. bug修复记录

    telnet 网址 ping netaddr traceroute netaddr ,这是一个linux下的命令可以通过Vmmap观察程序运行时所需要的依赖库协议里面涉及到数组的, 一定要判断最大值 ...

  10. 树莓派3 之 pi3Robot 控制系统配置

    需求 个人正在用Python写一个控制系统,技术选型是python3 + Flask + Mysql + Bootstrap.需要将这套系统直接部署到树莓派中. 代码地址:https://github ...