我已经将一个停靠的应用程序拆分为几个容器(一些前端和后端服务器、负载均衡器、mysql、elasticsearch等)。负载均衡器的配置需要知道哪些容器正在运行,因此我正在使用Consul服务发现注册服务。
但我不太确定在每个docker容器上运行consul agent是不是一个好主意,而不是使用docker主机来监督所有正在运行的docker容器,并通过Consul的HTTP-API注册它们。
有没有我可以遵循的最佳实践?
发布于 2017-07-12 13:57:33
您不需要在每个docker容器上都运行一个consul代理,您只需通过将consul的DNS暴露给您的本地来利用它。下面的内容不是来自容器,但你无论如何都会明白我在做什么。
下面是我用来运行代理的命令
consul agent -data-dir /var/lib/consul/ -config-dir /etc/consul.d/ -bind 10.X.X.X -dns-port 53 -join consul-master注意:我已经为consul-master添加了一个带有其IP的/etc/hosts条目,并且还在/etc/resolv.conf文件中为127.0.0.1添加了一个名称服务器。
目录/etc/consul.d/保存我的服务配置文件。下面是一个示例:
{
"service": {
"name": "stackoverflow",
"tags": [
"example"
],
"port": 5000
}
}现在,一旦我的consul agent运行起来,我就可以通过dig命令或http api请求检查任何具有consul agent (服务器/客户机)的主机,如下所示:
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 X.X.X.X
;; 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希望这会有所帮助,并给出一个清晰的概念。
发布于 2016-10-20 00:21:53
我不确定是否有最佳实践,但我发现这篇博客文章对Automatic Docker Service Announcement with Registrator非常有帮助。他谈到了服务注册的几种方法及其优点和缺点。
更直接地回答您的问题,不,您不应该在每个容器中运行咨询代理。
一种选择是在每台主机上运行一个consul代理。然后,您可以使用诸如Registrator之类的工具来监视新容器的启动和关闭,并自动更新Consul。主要的优点是你的容器只有一个任务要做,那就是运行你的应用程序。注册器还有一项工作要做,监视容器启动/停止事件,并将它们记录在领事中。您的容器可能对consul一无所知,但仍然参与服务发现。
还有一个Autopilot pattern,它建议走另一个方向,让你的应用程序领事知道,这样它就可以报告自己的健康状况并发现自己的依赖项。我在这个模式上看到的大多数信息都来自Joyent (就像这个blog post)。从不同的角度了解如何在应用程序中实现可伸缩性和弹性,值得一读。
https://stackoverflow.com/questions/40130905
复制相似问题