我们使用nomad将我们的应用程序(提供gRPC端点)部署为任务。然后使用nomad 的 service stanza将任务注册到Consul。
我们的应用程序的路由是通过envoy proxy实现的。我们在 IP 上运行负载均衡的中央特使实例10.1.2.2
。
路由到哪个端点/任务的决定当前基于host
标头,并且每个任务都注册为<$JOB>.our.cloud
. 这导致了两个问题。
访问服务时,必须为负载均衡器 IP 注册 DNS 名称,这会导致
/etc/hosts
类似的条目10.1.2.2 serviceA.our.cloud serviceB.our.cloud serviceC.our.cloud
使用 可以部分缓解这个问题
dnsmasq
,但是当我们添加新服务时仍然有点烦人。不可能同时运行多个提供相同 gRPC 服务的服务。例如,如果我们决定测试一个服务的新实现,我们需要以
job
相同的名称以相同的名称运行它,并且需要实现在 gRPC 服务文件中定义的所有服务。
我们一直在讨论的一个可能的解决方案是使用tags
该service
节的 来添加定义提供的 gRPC 服务的标签,例如:
service {
tags = ["grpc-my.company.firstpackage/ServiceA", "grpc-my.company.secondpackage/ServiceB"]
}
但是Consul不鼓励这样做:
Dots are not supported because Consul internally uses them to delimit service tags.
现在我们正在考虑使用像这样的标签来做这件事grpc-my-company-firstpackage__ServiceA
......这看起来真的很恶心,虽然:-(
所以我的问题是:
- 有没有人做过这样的事情?
- 如果是这样,关于如何路由到由 Consul 自动发现的 gRPC 服务有什么建议?
- 有人对此有其他想法或见解吗?
- 这是如何在例如istio中完成的?