Назад | Перейти на главную страницу

Как настроить динамическую маршрутизацию запросов gRPC с посланником, кочевником и консулом

Мы используем кочевник для развертывания наших приложений, которые обеспечивают gRPC конечные точки - как задачи. Затем задачи регистрируются в Консул, с помощью строфа службы кочевника.

Маршрутизация для наших приложений достигается с помощью доверенное лицо посланника. Мы запускаем центральные экземпляры посланников с балансировкой нагрузки по IP 10.1.2.2.

Решение, к какой конечной точке / задаче направить, в настоящее время основывается на host заголовок, и каждая задача регистрируется как служба в <$JOB>.our.cloud. Это приводит к двум проблемам.

  1. При доступе к службе имя DNS должно быть зарегистрировано для IP-адреса балансировщика нагрузки, что приводит к /etc/hosts записи вроде

    10.1.2.2 serviceA.our.cloud serviceB.our.cloud serviceC.our.cloud
    

    Эта проблема частично решается за счет использования dnsmasq, но все равно немного раздражает, когда мы добавляем новые службы

  2. Невозможно одновременно запустить несколько служб, которые предоставляют одну и ту же службу gRPC. Если мы, например, решили протестировать новую реализацию службы, нам нужно запустить ее в том же job под тем же именем и должны быть реализованы все службы, которые определены в файле службы gRPC.

Возможное решение, которое мы обсуждали, - использовать tags из service раздел для добавления тегов, которые определяют предоставляемые службы gRPC, например:

service {
  tags = ["grpc-my.company.firstpackage/ServiceA", "grpc-my.company.secondpackage/ServiceB"]
}

Но это обескураживает Консул:

Dots are not supported because Consul internally uses them to delimit service tags.

Теперь мы думали сделать это с помощью таких тегов, как grpc-my-company-firstpackage__ServiceA, ... Это выглядит действительно отвратительно :-(

) Итак, мой вопрос: