文档章节

Registrator 实战

China_OS
 China_OS
发布于 2018/09/04 16:07
字数 1760
阅读 305
收藏 0

        Registrator是一个能自动发现docker container提供的服务,并在后端服务注册中心注册服务或者取消服务注册的工具,后端注册中心支持consul、etcd、skydns2、zookeeper等存储。Registrator认为任何监听在某个端口的程序都是一个服务,如果这个程序监听了多个端口,则这个程序是多个服务。既然Registrator是关于docker container的服务发现的,那么Registrator部署的最好方式就是在每个docker engine上部署一个Registrator实例了。下面跟随我来一步一步深入Registrator。

 

快速开始

    下面的操作会让你快速的把Registrator先跑起来。后续章节我们再深入分析原理。

 

环境

ubuntu16.04-3 172.31.68.243
Docker 18.03.0-ce
Registrator V7

 

Consul部署

    安装consul

docker run -d --name=consul --net=host gliderlabs/consul-server -bootstrap -bind=172.31.68.243

    检查consul

curl http://172.31.68.243:8500/v1/catalog/services

Registrator部署

    安装Registrator

docker run -d --name=registrator --net=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://172.31.68.243:8500

    检查log

docker logs registrator

Container部署

    运行一个web服务

docker run -d -p 8888:80 --name hello 172.31.68.241/library/friendlyhello

    检查hello服务

curl http://172.31.68.243:8888

    查看consul endpoint内容

curl http://172.31.68.243:8500/v1/catalog/services

    查看更详细的endpoint信息

curl http://172.31.68.243:8500/v1/catalog/service/friendlyhello

    ps:运行很简单吧,当容器启动的时候,Registrator会通过docker的api去获取容器中的服务信息,下面我们进行更深入的了解

 

运行参考

    Registrator运行命令

docker run [docker options] gliderlabs/registrator[:tag] [options] <registry uri>

        ps:Registrator会有一些自己要求和建议的docker选项

    Docker选项

Option Required Description
--volume=/var/run/docker.sock:/tmp/docker.sock yes 允许Registrator访问docker的api接口
--net=host recommended 帮助Registrator获取到主机级别的ip和主机名

        ps:与设置主机网络模式相比,另一个可选的方案是设置容器名字为宿主主机名(-h $HOSTNAME),并且使用下面Registrator的-ip选项

    Registrator选项

Option Since Description
-cleanup v7 Cleanup dangling services
-deregister <mode> v6 Deregister exited services "always" or "on-success". Default: always
-internal   Use exposed ports instead of published ports
-ip <ip address>   Force IP address used for registering services
-resync <seconds> v6 Frequency all services are resynchronized. Default: 0, never
-retry-attempts <number> v7 Max retry attempts to establish a connection with the backend
-retry-interval <milliseconds> v7 Interval (in millisecond) between retry-attempts
-tags <tags> v5 Force comma-separated tags on all registered services
-ttl <seconds>   TTL for services. Default: 0, no expiry (supported backends only)
-ttl-refresh <seconds>   Frequency service TTLs are refreshed (supported backends only)
-useIpFromLabel <label>   Uses the IP address stored in the given label, which is assigned to a container, for registration with Consul

        ps:下面几个比较重要

-internal 选项会导致Registrator会注册docker内部IP和端口,而不是映射到主机的端口,
-ip 默认情况下Registrator会尝试解析当前主机名来设置服务地址,你想强制指定服务地址为某个特定地址,则可以使用ip
-resync 选项控制Registrator查询Docker中所有容器并且注册所有服务的频率。这个选项允许Registrator和服务注册机重新找到掉出同步的服务

    Registry URL

<backend>://<address>[/<path>]

        backend是支持的后端类型,address是注册中心的地址和端口,有些注册中心还支持路径设置,则可以设置/path。

服务模型

    Registrator主要关注那些要被添加到服务发现中心的服务,通俗的理解container中监听的一个端口就是一个服务,如果监听多个端口就是多个服务。一个服务的创建,包括来自container的信息和用户在container上定义的元数据,这些信息被创建成一个服务对象。这个服务对象随后被传递给后端的注册中心,并尝试放置到一个特定的注册项。

type Service struct {
	ID    string
	Name  string
	Port  int
	IP    string
	Tags  []string
	Attrs map[string]string
	TTL   int

	Origin ServicePort
}

    容器覆盖

        Name、Tags、Attrs、ID都是可以被用户定义的container元数据覆盖掉的。可以使用SERVICE_或者SERVICE_x_开头的环境变量来覆盖,x表示container内部暴露的端口,如果在这些环境变量中使用端口,则是指覆盖这个端口服务上的值,变量中没有指定端口的则是所有服务的默认值。注意Attrs使用的是SERVICE_REGION环境变量来设置的。因为元数据被存储为环境变量或者标签,因此容器作者可以在Dockerfile中包含他们自己的元数据定义。

    eg:

SERVICE_NAME=customerdb
SERVICE_80_NAME=api
SERVICE_REGION=us-east

    服务发现

        默认情况下Registrator从那些已经暴露端口的container中获取服务信息,所以你想Registrator获取服务信息,就必须暴露端口出来,如果你的服务暴露了多个端口,而你想服务注册中心显示一个服务,也可以忽略调其他端口的服务,指定SERVICE_<port>_IGNORE=true即可

    服务名称

        服务名称是你在服务发现的时候使用的,默认情况下遵循以下格式:

<base(container-image)>[-<exposed-port> if >1 ports]

        ps:例如java服务,一般都会开启jmx,这样就会导致一个java服务监听多个端口,在服务注册中心中就是多个服务了。不过你可以使用环境变量覆盖这些默认的服务名称,或者忽略多余的端口服务。

ip和port

        IP和Port组成了服务名解析的地址,Registrator有许多方法能够判断IP地址和端口。缺省情况下,端口就是发布的公共端口,IP将是你的主机IP。如果主机上多个ip,导致ip判断困难,推荐使用-ip选项显式告诉Registrator使用什么IP

tags和attributes

        Tags和attributes是服务额外的元数据字段。并不是所有的后端都支持他们。事实上,目前consul支持tags。

Unique ID 

        ID是服务实例在集群内的唯一标识。通常用户使用服务名而不是ID。Registrator基于下面的格式编码,在ID中使用通俗易懂的字符串:

<hostname>:<container-name>:<exposed-port>[:udp if udp]

 

环境变量实战

    启动新的web服务,设置环境变量

docker run -d -p 8889:80 --name hello2 -e "SERVICE_80_NAME=hello-world" -e "SERVICE_TAGS=app,java" -e "SERVICE_REGION=sh"  -e "SERVICE_80_ID=http.python" 172.31.68.241/library/friendlyhello

   

    验证

curl http://172.31.68.243:8500/v1/catalog/service/hello-world

源码分析

    下载

git clone https://github.com/gliderlabs/registrator.git

    结构

tree -L 1 /opt/programs/registrator

        ps:consul、consulkv、etcd、skydns2、zookeeper均为后端注册中心,可以不用深入。主要文件在bridge目录下,registrator.go文件也比较重要,是整个程序的入口。

    文件

        里面重要的是bridge.go文件,主要使用go-dockerclient和docker交互,总体来说功能还是比较简单的,思路也比较清晰,如果你熟悉docker api,也可以自己实现一个

 

© 著作权归作者所有

共有 人打赏支持
China_OS
粉丝 421
博文 460
码字总数 513906
作品 0
静安
技术主管
私信 提问
大规模 WebSocket 集群项目 AnyIM 实战

一、概述 WebSocket 应用场景非常广泛,例如社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、实时定位、在线教育、智能家居等,这些场景都与我们的生...

Anoyi
2017/11/17
0
0
consul docker register

docker consul register 在很多就得文档中都是用的 但是 在github 中已经换成了 gliderlabs/registrator gliderlabs/registrator 如果发生权限错误 在其中加上这一句话 --privileged=true 实...

疯code
2016/07/19
32
0
Ocelot + Consul + Registrator 基于Docker 实现服务发现、服务自动注册

目录 1. Consul集群搭建 1.1 F&Q 2. Registrator服务注册工具 2.1 F&Q 3. clientservice服务Demo 3.1 Program.cs 3.2 ValuesController.cs 3.3 Dockerfile 3.4 制作镜像并启动容器 4. Ocelo......

我打农村来
2018/07/25
0
0
docker registrator配合consul使用的问题

上一篇文章中有介绍使用registrator将docker容器启动的服务注册到consul,再用consul-template自动更新ngnix配置,实现系统服务的自动发现。 在多个docker主机的情况下存在以下问题: regist...

chris_2009
2016/04/19
606
0
基于docker的分布式爬虫服务--Zerg

zerg 基于docker的分布式爬虫服务 特性 多机多 IP,充分利用 IP 资源 服务自动发现和注册(基于 etcd 和 registrator) 负载均衡 服务端客户端通信基于 gRPC,支持多种编程语言的客户端 可设...

匿名
2016/04/18
3.7K
1

没有更多内容

加载失败,请刷新页面

加载更多

IOS  学习记录

1.StackView=>IOS 9及以上支持 2.布局方式: AutoLayout / StackView 堆布局 (线性布局) 3.屏幕适配 (资源分辨率、设计分辨率、屏幕分辨率) Size Class技术 可以针对 屏幕的方向进行设置...

萨x姆
41分钟前
0
0
第四次工业革命:自主经济的崛起

https://36kr.com/p/5170370.html

shengjuntu
昨天
3
0
Cloud Native 与12-Factor

12-Factor(twelve-factor),也称为“十二要素”,是一套流行的应用程序开发原则。Cloud Native架构中使用12-Factor作为设计准则。 12-Factor 的目标在于: 使用标准化流程自动配置,从而使...

waylau
昨天
9
0
java多线程2

“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在线程安全问题。这是因为方法内部的变量都是私有造成的。 synchronized 获取的都是对象锁。如果多个线程访问多个...

一滴水穿石
昨天
4
0
今天的学习

1,document.location.href:获取整个url 2,str.split(' '):用字符分割字符串 3,$this->load->library(' '):引用图像处理类 4,$this->load->library(' '):引用Email类 5,特殊访问指针$th......

墨冥
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部