docker深入2-使用registrator和consul-template自动注册和变更服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker深入2-使用registrator和consul-template自动注册和变更服务相关的知识,希望对你有一定的参考价值。

docker深入2-使用registrator和consul-template自动注册和变更服务

2016/6/1


一、示例
测试环境基于文档:docker深入2-熟悉和找不同.txt

    host-n35                        host-n36
-----------------------------------------------------
                                    conf
                                    consul-tempalte
----------------------------------------
webapp(container)       ------      webapp(container) 
----------------------------------------
registrator_35          ------      registrator_36
consul-node1            ------      consul-node2
-----------------------------------------------------

二、配置
1、配置 consul 集群
调整防火墙:
firewall-cmd --zone=public --add-port=8300-8302/tcp
firewall-cmd --zone=public --add-port=8301-8302/udp
firewall-cmd --zone=public --add-port=8400/tcp
firewall-cmd --zone=public --add-port=8500/tcp
firewall-cmd --zone=public --add-port=53/tcp
firewall-cmd --zone=public --add-port=53/udp

持久:
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --zone=public --add-port=4000/tcp --permanent
firewall-cmd --zone=public --add-port=8300-8302/tcp --permanent
firewall-cmd --zone=public --add-port=8301-8302/udp --permanent
firewall-cmd --zone=public --add-port=8400/tcp --permanent
firewall-cmd --zone=public --add-port=8500/tcp --permanent
firewall-cmd --zone=public --add-port=53/tcp --permanent
firewall-cmd --zone=public --add-port=53/udp --permanent

注1:如下配置简化了 IP 映射的细节,直接使用 0.0.0.0 来提供服务。
注2:cunsul 的 service 要使用 dns 来提供域名解析,这样 registrator 才能顺利的注册服务到 consul 上来。
【n35】
docker run -d --restart=always -v /data/docker/consul:/data -p 8300:8300 -p 8301:8301 -p 8301:8301/udp -p 8302:8302 -p 8302:8302/udp -p 8400:8400 -p 8500:8500 -p 53:53 -p 53:53/udp --name=consul-node1 progrium/consul -server -advertise 10.111.222.35 -bootstrap-expect 2

【n36】
docker run -d --restart=always -v /data/docker/consul:/data -p 8300:8300 -p 8301:8301 -p 8301:8301/udp -p 8302:8302 -p 8302:8302/udp -p 8400:8400 -p 8500:8500 -p 53:53 -p 53:53/udp --name=consul-node2 progrium/consul -server -advertise 10.111.222.36 -join 10.111.222.35

【查看 n35 日志】
[[email protected] ~]$ docker logs -f consul-node1
    2016/05/23 08:58:58 [INFO] serf: EventMemberJoin: 0db39e28b326 10.111.222.36
    2016/05/23 08:58:58 [INFO] consul: adding server 0db39e28b326 (Addr: 10.111.222.36:8300) (DC: dc1)
    2016/05/23 08:58:58 [INFO] consul: Attempting bootstrap with nodes: [10.111.222.35:8300 10.111.222.36:8300]
    2016/05/23 08:58:58 [WARN] raft: Heartbeat timeout reached, starting election
    2016/05/23 08:58:58 [INFO] raft: Node at 10.111.222.35:8300 [Candidate] entering Candidate state
    2016/05/23 08:58:58 [WARN] raft: Remote peer 10.111.222.36:8300 does not have local node 10.111.222.35:8300 as a peer
    2016/05/23 08:58:58 [INFO] raft: Election won. Tally: 2
    2016/05/23 08:58:58 [INFO] raft: Node at 10.111.222.35:8300 [Leader] entering Leader state
    2016/05/23 08:58:58 [INFO] consul: cluster leadership acquired
    2016/05/23 08:58:58 [INFO] consul: New leader elected: be67d37cbf68
    2016/05/23 08:58:58 [INFO] raft: pipelining replication to peer 10.111.222.36:8300
    2016/05/23 08:58:58 [INFO] consul: member ‘be67d37cbf68‘ joined, marking health alive
    2016/05/23 08:58:58 [INFO] consul: member ‘0db39e28b326‘ joined, marking health alive

    
【查看 n36 日志】
[[email protected] ~]$ docker logs -f consul-node2
    2016/05/23 08:58:58 [INFO] consul: adding server be67d37cbf68 (Addr: 10.111.222.35:8300) (DC: dc1)
    2016/05/23 08:58:58 [INFO] consul: New leader elected: be67d37cbf68

    
    
2、配置 registrator 来注册 docker container 的信息到上述 consul 集群中。
【n35】
docker run -d --restart=always -v /var/run/docker.sock:/tmp/docker.sock --name registrator_35 gliderlabs/registrator consul://10.111.222.35:8500

【n36】
docker run -d --restart=always -v /var/run/docker.sock:/tmp/docker.sock --name registrator_36 gliderlabs/registrator consul://10.111.222.36:8500

【查看 n35 日志】
[[email protected] ~]$ docker logs -f registrator_35
2016/05/23 09:05:08 Starting registrator v7 ...
2016/05/23 09:05:08 Using consul adapter: consul://10.111.222.35:8500
2016/05/23 09:05:08 Connecting to backend (0/0)
2016/05/23 09:05:08 consul: current leader  10.111.222.35:8300
2016/05/23 09:05:08 Listening for Docker events ...
2016/05/23 09:05:08 Syncing services on 3 containers
2016/05/23 09:05:08 ignored: 205155915c61 no published ports
2016/05/23 09:05:08 added: be67d37cbf68 205155915c61:consul-node1:53
2016/05/23 09:05:08 added: be67d37cbf68 205155915c61:consul-node1:8300
2016/05/23 09:05:08 added: be67d37cbf68 205155915c61:consul-node1:53:udp
2016/05/23 09:05:08 added: be67d37cbf68 205155915c61:consul-node1:8302
2016/05/23 09:05:08 added: be67d37cbf68 205155915c61:consul-node1:8302:udp
2016/05/23 09:05:08 added: be67d37cbf68 205155915c61:consul-node1:8400
2016/05/23 09:05:08 added: be67d37cbf68 205155915c61:consul-node1:8500
2016/05/23 09:05:08 added: be67d37cbf68 205155915c61:consul-node1:8301:udp
2016/05/23 09:05:08 added: be67d37cbf68 205155915c61:consul-node1:8301
2016/05/23 09:05:08 added: 312c4fdb40d0 205155915c61:reg4work:5000

【查看 n36 日志】
[[email protected] ~]$ docker logs -f registrator_36
2016/05/23 09:05:23 Starting registrator v7 ...
2016/05/23 09:05:23 Using consul adapter: consul://10.111.222.36:8500
2016/05/23 09:05:23 Connecting to backend (0/0)
2016/05/23 09:05:23 consul: current leader  10.111.222.35:8300
2016/05/23 09:05:23 Listening for Docker events ...
2016/05/23 09:05:23 Syncing services on 2 containers
2016/05/23 09:05:23 ignored: 1f61c2d2bcf9 no published ports
2016/05/23 09:05:23 added: 0db39e28b326 1f61c2d2bcf9:consul-node2:8302:udp
2016/05/23 09:05:24 added: 0db39e28b326 1f61c2d2bcf9:consul-node2:8500
2016/05/23 09:05:24 added: 0db39e28b326 1f61c2d2bcf9:consul-node2:8301
2016/05/23 09:05:24 added: 0db39e28b326 1f61c2d2bcf9:consul-node2:53:udp
2016/05/23 09:05:24 added: 0db39e28b326 1f61c2d2bcf9:consul-node2:8300
2016/05/23 09:05:24 added: 0db39e28b326 1f61c2d2bcf9:consul-node2:8301:udp
2016/05/23 09:05:24 added: 0db39e28b326 1f61c2d2bcf9:consul-node2:8302
2016/05/23 09:05:24 added: 0db39e28b326 1f61c2d2bcf9:consul-node2:53
2016/05/23 09:05:24 added: 0db39e28b326 1f61c2d2bcf9:consul-node2:8400


分别在 2 个 host 上启动 1 个 container,观察是否自动被注册到 consul 中:
[[email protected] ~]$ docker run -d -P --name z001 training/webapp python app.py
66ef0c6ce19b6c33e13d772ada5504732c032046bb9cd2410ec48545111aa140
[[email protected] ~]$ docker run -d -P --name z002 training/webapp python app.py 
7fde646e0c29370ff1375f4692f4dc64c14eda490997d736cb2cc2a0712ce039

再次查看日志:
【查看 n35 日志】
2016/05/23 09:09:11 added: 7fde646e0c29 205155915c61:z002:5000
【查看 n36 日志】
2016/05/23 09:08:38 added: 66ef0c6ce19b 1f61c2d2bcf9:z001:5000


通过 API 来查看 webapp 的内容:
[[email protected] ~]$ curl -s 10.111.222.35:8500/v1/catalog/service/webapp |python -mjson.tool
[
    {
        "Address": "10.111.222.36",
        "Node": "0db39e28b326",
        "ServiceAddress": "",
        "ServiceID": "1f61c2d2bcf9:z001:5000",
        "ServiceName": "webapp",
        "ServicePort": 32774,
        "ServiceTags": null
    },
    {
        "Address": "10.111.222.35",
        "Node": "be67d37cbf68",
        "ServiceAddress": "",
        "ServiceID": "205155915c61:z002:5000",
        "ServiceName": "webapp",
        "ServicePort": 32768,
        "ServiceTags": null
    }
]

3、使用 consul-template
目的:在一台测试机上安装 consul-template 来从 consul 获取数据,更新本地的某个配置文件。
从下述页面选择一个版本:
https://releases.hashicorp.com/consul-template/

注3:将 n36 充当测试机。

[[email protected] ~] curl https://releases.hashicorp.com/consul-template/0.14.0/consul-template_0.14.0_linux_amd64.zip -o consul-template.zip && unzip consul-template.zip && mv ./consul-template /usr/bin/

生成一个简易的模版来测试:
[[email protected] ~]$ echo -e ‘{{range service "webapp"}}\nserver {{.Address}}:{{.Port}}{{end}}‘ > /tmp/consul.ctmpl
[[email protected] ~]$ cat /tmp/consul.ctmpl
{{range service "webapp"}}
server {{.Address}}:{{.Port}}{{end}}

启动 consul-template 来看看模版生成的内容是啥:
[[email protected] ~]$ consul-template -consul 10.111.222.35:8500 -template "/tmp/consul.ctmpl:/tmp/consul.result" -once
结果如下:
[[email protected] ~]$ cat /tmp/consul.result

server 10.111.222.36:32774
server 10.111.222.35:32768

如上所示,符合预期。

测试请求是否正常:
[[email protected] ~]$ curl 10.111.222.36:32774
Hello world![[email protected] ~]$ 
[[email protected] ~]$ curl 10.111.222.35:32768
Hello world![[email protected] ~]$ 
[[email protected] ~]$


4、移除 webapp 后观察变化
[[email protected] ~]$ docker rm -f z002
z002
【查看 n35 日志】
[[email protected] ~]$ docker logs -f registrator_35
2016/05/23 09:53:23 removed: 7fde646e0c29 205155915c61:z002:5000

[[email protected] ~]$ docker logs -f consul-node1
    2016/05/23 09:53:23 [INFO] agent: Deregistered service ‘205155915c61:z002:5000‘

符合预期。









三、疑惑
Q1、consul 服务注意事项?
A:
-bootstrap-expect 3:表明需要有3个节点,才能启动集群。
-bootstrap:单个节点使用这个标记来立即启动服务,而不是用来等待集群的创建。
-advertise:来申明 consul 使用哪个 IP 来提供服务。
-join:指定第一个 consul 服务的 IP 来加入集群。


Q2、registrator 服务注意事项?
A:在 overlay 网络下,配置 consul 集群时,DNS 端口使用哪个 IP 来提供服务? registrator 是否能检测到服务并注册成功呢?
笔者了解到以下2个方面需要注意:
1、配置 consul 时,指定了映射 53 端口到外部的IP,这个 ip 应该如何选择需要琢磨下。
2、配置 registrator 时,可以指定 docker 参数 --net,也可以指定 registrator 的参数 -internal,用途需要琢磨下。
Docker Options
--net=host	recommended	Helps Registrator get host-level IP and hostname

Registrator Options
-internal		Use exposed ports instead of published ports


Q3、consul-template 服务注意事项?
A:
-consul  指定 consul 服务的IP:PORT。
-template 指定 输入模版:输出模版:命令。
-once 表明 在命令行运行一次就退出。
-dry  表明 将结果输出到控制台,并不写入磁盘文件,且命令也不启动。



Q4、如果只有一台服务器,如何体验?
A:以【n36】为例:
1)启动一个 consul 服务
[[email protected] ~]$ docker run -d --restart=always -v /data/docker/consul-test:/data -p 8300:8300 -p 8301:8301 -p 8301:8301/udp -p 8302:8302 -p 8302:8302/udp -p 8400:8400 -p 8500:8500 -p 53:53 -p 53:53/udp --name=consul-test progrium/consul -server -advertise 10.111.222.36 -bootstrap


2)启动一个 registrator 服务
[[email protected] ~]$ docker run -d --restart=always -v /var/run/docker.sock:/tmp/docker.sock --name registrator_36 gliderlabs/registrator consul://10.111.222.36:8500


3)启动 docker 容器,registrator 将自动注册容器信息到 consul 中。
[[email protected] ~]$ docker run -d -P --name z001 training/webapp python app.py
[[email protected] ~]$ docker run -d -P --name z002 training/webapp python app.py
[[email protected] ~]$ docker run -d -P --name z003 training/webapp python app.py


4)查看 consul 中注册的内容
[[email protected] ~]$ curl -s 10.111.222.36:8500/v1/catalog/service/webapp |python -mjson.tool


5)查看 consul-template 生成的结果
[[email protected] ~]$ consul-template -consul 10.111.222.36:8500 -template "/tmp/consul.ctmpl:/tmp/consul.result" -once


6)应用到 haproxy 上
[[email protected] ~]# yum install haproxy
[[email protected] ~]# cp -a /etc/haproxy/haproxy.cfg{,.ctmpl}

调整 haproxy 模版:
[[email protected] ~]# vim /etc/haproxy/haproxy.cfg.ctmpl
(略)
backend app
    balance     roundrobin
    {{range service "webapp"}}
    server app-{{.Port}} {{.Address}}:{{.Port}} check{{end}}
    

生成配置并重启服务:
[[email protected] ~]# consul-template -consul 10.111.222.36:8500 -template "/etc/haproxy/haproxy.cfg.ctmpl:/etc/haproxy/haproxy.cfg:systemctl restart haproxy.service" -once

验证配置:
[[email protected] ~]# cat /etc/haproxy/haproxy.cfg
(略)
backend app
    balance     roundrobin
    
    server app-32774 10.111.222.36:32774 check
    server app-32775 10.111.222.36:32775 check
    server app-32776 10.111.222.36:32776 check

检查 haproxy 服务的状态
[[email protected] ~]# systemctl status haproxy.service


符合预期。
注:如果 status 显示 haproxy 绑定端口失败,权限异常等问题,导致启动服务失败,则要先考虑是否启用了 selinux,很简单,按照如下操作调整设置即可验证是否受其影响。
临时关闭:setenforce 0
查看状态:sestatus 



ZYXW、参考
1、consul
https://hub.docker.com/r/progrium/consul/

2、registrator
http://gliderlabs.com/registrator/latest/user/run/

3、consul-template
https://github.com/hashicorp/consul-template
https://releases.hashicorp.com/consul-template/
https://jlordiales.me/2015/04/01/consul-template/
http://sirile.github.io/2015/07/28/scaling-with-discovery-on-docker-swarm-with-consul-registrator-and-haproxy-with-prometheus-monitoring-and-elk-log-aggregation.html

4、haproxy
http://serverfault.com/questions/654599/weird-interaction-with-systemctl-with-haproxy-on-centos-7


以上是关于docker深入2-使用registrator和consul-template自动注册和变更服务的主要内容,如果未能解决你的问题,请参考以下文章

docker—Consul搭建

docker—Consul搭建

使用Docker搭建consul集群+registrator实现服务自动注册。

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

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

keycloak 动态客户端注册registration_client_uri docker主机名覆盖