问题描述
我正在为Nomad群集构建一个自配置的代理。为此,我需要检索集群中正在运行的所有作业,以及为每个正在运行的容器分配的IP和端口。这样,我可以自动生成反向代理配置和负载均衡器。
我必须通过Nomad或Consul的API来获取,但是我只需要通过一个API调用就可以获取。我知道可以通过调用Consul的端点/v1/catalog/node/nomad-node-3
来获取给定节点中的所有服务,但是我必须指定该节点。
我可以使用任何端点吗?
解决方法
以下是为Fabio负载均衡器执行此操作的代码:https://github.com/fabiolb/fabio/blob/15565deb06bf2ef7a8b67f42e958c7b370bf29da/registry/consul/service.go
您会注意到here,Fabio实际上并不查询所有正在运行的服务,而只是查询正在通过的运行状况检查。我认为这是有道理的,您可能要使用此策略,因为您可能不想将流量定向到不正常的服务。另一方面,这意味着fabio无法查看未通过健康检查但可能应可路由的服务。
在fabio查询service tags here之后,该呼叫将为您提供正在传递的服务。这是nomad在其中放置有关可以在何处找到这些服务(ip /端口等)的元数据的地方。
由于list services端点不包含所需的标记元数据,因此不确定是否可以在单个请求中完成所有操作。
有关评论的其他详细信息:
此代码使用等待索引和领事的concept of watches。您可以看到已配置的here。因此仍然存在非常小的延迟,但是此请求不是恒定轮询。它向领事发出出站请求并挂起,直到领事有新的更改要报告。在实践中,这非常快,并且对我来说并没有导致延迟问题(尽管从技术上讲它们仍然存在,网络请求开销,重新查询标签等)