如何在一个consul容器中为同一主机上的服务定义HTTP健康检查?
我们在运行服务的主机上使用一个consul代理。 (RabbitMQ)为了validation服务已经准备就绪,我们定义了一个基于curl的健康检查。 但是,我们正在使用注册者使用envvariables注入此检查。 SERVICE_CHECK_SCRIPT = curl hostname
:15672 / ….
问题是,我们也告诉过代理,它的主机名和主机一样。 (我们必须拥有这个function,因为我们希望看到在consul集群中注册的正确的主机名。
当执行代理运行健康检查时,它会在自己的容器上查找URL …这显然失败了…是否有人知道如何定义此健康检查(我们正在使用mesos来执行此操作),以便curl将尝试连接到正确的IP?
您可以使用注册者的HTTP健康检查 (只要您在progrium/docker-consul
容器中运行Consul),例如:
ENV SERVICE_CHECK_HTTP=/howareyou ENV SERVICE_CHECK_INTERVAL=5s
此检查将运行docker-consul
提供的check-http脚本 ,该脚本使用Docker API parsing目标容器的IP和端口。
另一个select是configurationConsul DNS侦听Docker的桥接IP(已经在progrium/docker-consul
的run
脚本中完成 ),并启动Docker守护进程,并指向相同IP的全局DNS选项,例如docker -d --bip 10.0.42.1/24 --dns 10.0.42.1 --dns 8.8.8.8
。
之后,领事DNS将在任何你的容器,包括docker-consul
之一,这意味着你可以运行curl http://my-app.service.consul:12345/howareyou
,甚至查询SRV
logging,例如与dig -t SRV
一起获取服务的IP和端口。 然后,您可以将10.0.42.1
添加到主机的resolv.conf
以获得不仅在容器内而且在主机OS上查询Consul DNS的能力。
首选的方法是使用注册器的SERVICE_CHECK_HTTP
,但是为你的容器设置Consul DNS是值得的。
这两种方法都需要在每个应用程序主机上以客户端模式运行Consul代理,但Consul代理在此模式下运行时会使用您很less注意到的less量系统资源。 而你无论如何需要它来执行健康检查:)