我们在也运行服务的主机上使用了一个consul代理。 (RabbitMQ的)
为了验证服务是否准备好,我们已经定义了基于卷曲的运行状况检查。
但是,我们使用registrator使用env变量注入此检查。
SERVICE_CHECK_SCRIPT = curl hostname
:15672 /....
问题是,我们还告诉领事代理其主机名与主机相同。 (我们必须拥有此功能,因为我们希望看到向consul集群注册的正确主机名。
当consul代理运行运行状况检查时,它会在自己的容器中查找URL ... 这明显失败了...... 有谁知道如何定义这个健康检查(我们使用mesos来做),以便curl将尝试连接到正确的IP?
答案 0 :(得分:6)
您可以使用Registrator的HTTP health check(假设您在progrium/docker-consul
容器内运行Consul),例如:
ENV SERVICE_CHECK_HTTP=/howareyou
ENV SERVICE_CHECK_INTERVAL=5s
此检查将由docker-consul
运行check-http script,resolves使用Docker API定位容器的IP和端口。
另一个选项是配置Consul DNS以侦听Docker的桥接IP(已在progrium/docker-consul
run
script中完成),并启动Docker守护程序全局DNS选项指向相同的IP,例如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,还可以从主机操作系统查询。
首选方法imho是使用Registrator的SERVICE_CHECK_HTTP
,但为容器设置Consul DNS无论如何都值得做。
这两种方法都需要在每个应用程序主机上以客户端模式运行Consul代理,但Consul代理在此模式下运行时会使用您很少注意到的少量系统资源。无论如何你还需要它来进行健康检查:)