【问题标题】:Hashicorp Nomad and Consul API - Get all services addressesHashicorp Nomad 和 Consul API - 获取所有服务地址
【发布时间】:2021-02-13 20:04:35
【问题描述】:

我正在为我的 Nomad 集群构建一个自我配置的代理。为此,我需要检索集群中运行的所有作业,以及它们为每个运行的容器分配的 IP 和端口。这样我可以自动生成反向代理配置和负载均衡器。 我必须通过 Nomad 或 Consul 的 API 来获取它,但我需要通过一个 API 调用来获取它。我知道我可以通过调用 Consul 的端点/v1/catalog/node/nomad-node-3 来获取给定节点中的所有服务,但我必须指定节点。 有没有我可以使用的端点?

【问题讨论】:

  • 不是每个服务都有代理吗?服务在多个节点上运行,因此您不应该使用 Node API 端点......相反,您似乎需要服务目录。否则,Fabio 或 Traefik 基于 Consul 标记工作
  • 不完全。代理保存所有服务及其上游的最新目录,然后对请求应用一些负载平衡。我设法用一些 lua 代码来完成它。代理每隔几秒钟扫描一次所有领事节点,以保持服务和上游列表是最新的。这不是最好的解决方案,但它适用于我的用例。我很快会在这篇文章中添加一个正确的答案,包括我使用的代码。
  • 您是否考虑过使用 consul-template 为您的反向代理生成配置,或者使用 Consul 的 blocking queries 来消除节点的定期轮询以及随之而来的额外服务器负载?跨度>

标签: api rest consul nomad


【解决方案1】:

这是为 Fabio 负载平衡器执行此操作的代码:https://github.com/fabiolb/fabio/blob/15565deb06bf2ef7a8b67f42e958c7b370bf29da/registry/consul/service.go

您会注意到 here Fabio 实际上并没有查询所有正在运行的服务,只是查询正在通过的健康检查。我认为这是有道理的,您可能希望使用此策略,因为您可能不想将流量引导到不健康的服务。另一方面,这意味着 fabio 无法查看未通过健康检查但可能应该是可路由的服务。

在 fabio 查询 service tags here 之后,该调用将为您提供正在传递的服务。这是 nomad 放置有关可以在何处找到这些服务的元数据(ip/port 等)的地方。

不确定这是否可以在一个请求中完成,因为list services 端点不包含您需要的标记元数据。


回应评论的其他细节:

此代码使用等待索引和领事的concept of watches。可以看到配置的here。所以还是有一个很小的延迟,但是这个请求不是不断的轮询。它向 consul 发出出站请求并挂起,直到 consul 有新的更改要报告。在实践中,这非常快,并没有给我带来延迟问题(尽管它们在技术上仍然存在,网络请求开销,重新查询标签等)

【讨论】:

  • 感谢您的回答,很高兴看到其他人是如何做到的!实际上,从我的代码中,通过查询领事的端点,我确保我只获得健康的上游(我假设我的所有服务都必须处于健康状态)。这种方法的问题是,由于轮询机制存在隐含延迟,上游可能会不健康,但我的代理仍然认为它不是(因为它还没有完成下一次轮询),并路由请求给它。但就目前而言,这对于我的用例来说已经足够了。
  • 嘿@Cristian 在上面添加了更多 cmets。没有典型的轮询间隔,请求在响应之前等待更改。如果它回答了您的问题,也请接受答案:)
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2018-03-07
  • 2020-07-22
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多