1

我们在也运行服务的主机上使用领事代理。(RabbitMQ) 为了验证服务是否准备就绪,我们定义了一个基于 curl 的健康检查。但是,我们使用 registrator 使用 env 变量注入此检查。SERVICE_CHECK_SCRIPT=卷曲hostname:15672/....

问题是,我们还告诉 consul-agent 它的主机名与主机名相同。(我们必须有这个功能,因为我们想看到在 consul 集群中注册的正确主机名。

当领事代理运行健康检查时,它会在自己的容器上查找 URL……这显然失败了……有人知道如何定义此健康检查(我们正在使用 mesos 来做),以便 curl 将尝试连接到正确的IP?

4

1 回答 1

6

您可以使用 Registrator 的HTTP 健康检查(前提是您在progrium/docker-consul容器内运行 Consul),例如:

ENV SERVICE_CHECK_HTTP=/howareyou
ENV SERVICE_CHECK_INTERVAL=5s

此检查将运行由 提供的check-http 脚本docker-consul,该脚本使用 Docker API解析目标容器的 IP 和端口。

另一个选项是配置 Consul DNS 以侦听 Docker 的网桥 IP(已在progrium/docker-consul's runscript中完成),并使用指向同一 IP 的全局 DNS 选项启动 Docker 守护程序,例如docker -d --bip 10.0.42.1/24 --dns 10.0.42.1 --dns 8.8.8.8.

之后,Consul DNS 将在您的任何容器中可用,包括docker-consul一个,这意味着您可以运行curl http://my-app.service.consul:12345/howareyou,甚至查询SRV记录,例如使用dig -t SRV,以获取服务的 IP 和端口。然后您可以添加10.0.42.1到主机resolv.conf以获得不仅在容器内查询 Consul DNS 的能力,而且还可以从主机操作系统中查询。

恕我直言,首选方法是使用 Registrator's SERVICE_CHECK_HTTP,但无论如何为您的容器设置 Consul DNS 是值得的。

这两种方法都需要在您的每个应用程序主机上以客户端模式运行 Consul 代理,但是当以这种模式运行时,Consul 代理使用的系统资源非常少,您几乎不会注意到它。无论如何你都需要它来执行健康检查:)

于 2015-02-01T19:08:47.040 回答