我的docker图片是否需要自己的领事客户端实例?
我有一个docker化的应用程序拆分在几个容器(几个前端和后端服务器,负载平衡器,MySQL,elasticsearch等)。 负载平衡器的configuration需要知道哪些容器已经启动,所以我正在向Consul服务发现注册服务。
但是我不太确定在每一个docker容器上运行一个consul代理是一个好主意,而不是使用docker主机监督所有正在运行的docker容器,并通过Consul的HTTP-API注册它们。
有什么我可以遵循的最佳做法?
你不需要在每个docker集装箱上运行一个总领事代理,你可以简单地利用领事把它的DNS暴露给你的本地。 以下是不是从一个容器,但你会得到这个想法反正我在做什么。
以下是我用来运行我的代理的命令
consul agent -data-dir /var/lib/consul/ -config-dir /etc/consul.d/ -bind 10.XXX -dns-port 53 -join consul-master
注意:我为consul-master添加了一个/ etc / hosts条目,并在/etc/resolv.conf文件中添加了127.0.0.1的名称服务器。
目录/etc/consul.d/保存我的服务configuration文件。 以下是一个例子:
{ "service": { "name": "stackoverflow", "tags": [ "example" ], "port": 5000 } }
现在,我的领事代理正在运行,我可以通过使用dig命令或http api请求来检查任何具有consul代理(服务器/客户端)的主机的服务,如下所示:
curl http://stackoverflow.service.consul:80/api/v1/ping {"success":true,"message":"pong"}
对于DNS:
dig @127.0.0.1 -p 53 stackoverflow.service.consul ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.55.amzn1 <<>> @127.0.0.1 -p 53 tracker.service.consul ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57167 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;tracker.service.consul. IN A ;; ANSWER SECTION: tracker.service.consul. 0 IN A XXXX ;; Query time: 1 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Fri Jul 7 11:29:01 2017 ;; MSG SIZE rcvd: 56
希望对此有所帮助,并给予清晰的认识
我不确定是否有最佳做法,但是我发现这篇博文是非常有用的自动泊坞窗服务公告 。 他谈到了几种服务注册方法及其好处和缺点。
更直接地回答你的问题,不,你不应该在每个集装箱内运行一个领事代理。
一种select是,在每个主机上运行一个总领事代理。 然后你可以使用注册器之类的东西来监视新容器的启动和closures,并自动更新Consul。 主要优点是你的容器有一个工作要做,运行你的应用程序。 注册人也有一个工作要做,注意容器启动/停止事件,并logging在领事。 你的集装箱对领事一无所知,仍然参与服务发现。
还有自动驾驶模式 ,build议朝另一个方向前进,使您的应用程序Consul知道,以便它可以报告自己的健康状况并发现自己的依赖关系。 我在这个模式上看到的大部分信息都来自Joyent(就像这篇博文 )。 对于实现应用程序的可伸缩性和弹性,不同的观点值得一读。