Hashicorp Nomad和领事API-获取所有服务地址

问题描述

我正在为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。因此仍然存在非常小的延迟,但是此请求不是恒定轮询。它向领事发出出站请求并挂起,直到领事有新的更改要报告。在实践中,这非常快,并且对我来说并没有导致延迟问题(尽管从技术上讲它们仍然存在,网络请求开销,重新查询标签等)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...