我有一个dockerized应用程序分成几个容器(一些前端和后端服务器,负载均衡器,mysql,elasticsearch等)。负载均衡器的配置需要知道哪些容器已经启动,因此我正在使用Consul服务发现注册服务。
但是我不太确定在每个docker容器上运行consul代理是否是个好主意,而不是使用docker主机来监督所有正在运行的docker容器并通过Consul的HTTP-API注册它们。
我可以遵循最佳做法吗?
答案 0 :(得分:3)
您不需要在每个docker容器上运行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添加了/ etc / hosts条目及其IP,我还在/etc/resolv.conf文件中添加了127.0.0.1的名称服务器。
目录/etc/consul.d/包含我的服务配置文件。以下是一个例子:
{
"service": {
"name": "stackoverflow",
"tags": [
"example"
],
"port": 5000
}
}
现在,一旦我的consul代理运行,我可以通过dig命令或http api请求检查具有服务代理(服务器/客户端)的任何主机,如下所示:
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
希望有助于并清楚地了解它
答案 1 :(得分:1)
我不确定是否有最佳做法,但我发现此博文非常有帮助Automatic Docker Service Announcement with Registrator。他谈到了几种服务注册方法及其好处和缺点。
更直接地回答你的问题,不,你不应该在每个容器内运行一个领事代理。
一种选择是在每个主机上运行一个consul代理。然后,您可以使用类似Registrator的内容来监视启动和关闭的新容器,并自动更新Consul。主要优点是您的容器有一项工作要做,运行您的应用程序。 Registrator还有一项工作要做,观察容器启动/停止事件并将其记录在Consul中。您的容器对领事一无所知,仍然可以参与服务发现。
还有Autopilot pattern建议朝另一个方向前进并使您的应用程序Consul知道,以便它可以报告自己的运行状况并发现自己的依赖关系。我在这个模式中看到的大部分信息都来自Joyent(就像这个blog post)。对于在应用程序中实现可伸缩性和弹性的不同观点,值得一读。