如何在同一主机上的服务的consul容器中定义HTTP运行状况检查?

时间:2014-12-23 15:44:12

标签: docker registration health-monitoring mesos consul

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

问题是,我们还告诉领事代理其主机名与主机相同。 (我们必须拥有此功能,因为我们希望看到向consul集群注册的正确主机名。

当consul代理运行运行状况检查时,它会在自己的容器中查找URL ... 这明显失败了...... 有谁知道如何定义这个健康检查(我们使用mesos来做),以便curl将尝试连接到正确的IP?

1 个答案:

答案 0 :(得分:6)

您可以使用Registrator的HTTP health check(假设您在progrium/docker-consul容器内运行Consul),例如:

ENV SERVICE_CHECK_HTTP=/howareyou
ENV SERVICE_CHECK_INTERVAL=5s

此检查将由docker-consul运行check-http scriptresolves使用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代理在此模式下运行时会使用您很少注意到的少量系统资源。无论如何你还需要它来进行健康检查:)