0

我似乎无法让 Envoy 与部署的多个 gRPC 服务一起工作。gRPC 调用总是转到同一个实例。Envoy 负载均衡器如何发现使用 docker-compose scale 启动了相同服务的其他实例?

我使用的 Service1 配置:

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 30271 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: service1_grpc
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: service1_grpc }
          http_filters:
          - name: envoy.router
            config: {}
  clusters:
  - name: service1_grpc
    connect_timeout: 25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    dns_lookup_family: V4_ONLY
    http2_protocol_options: { }
    hosts: [{ socket_address: { address: 127.0.0.1, port_value: 30270 }}]

现在调用者服务具有 gRPC 客户端初始化:

grpc.Dial("service1_grpc:30271", grpc.WithInsecure())

问题是,每当我使用 docker-compose scale 命令启动多个 service1 实例时,新启动的实例永远不会收到任何呼叫。我的配置问题出在哪里?

4

1 回答 1

2

您的集群由静态主机定义支持:hosts: [{ socket_address: { address: 127.0.0.1, port_value: 30270 }}]. 所以 Envoy 只会在列出的主机之间进行平衡——端口 30270 上的单个主机。

Docker-compose 将为它启动的每个主机创建动态命名的实例。由于您在配置时不会知道这些名称,因此您必须使用类似的名称来获取它们docker-compose ps,然后将其反馈到 Envoy 的动态配置中。

要实现的特定动态配置是Endpoint Discovery ServiceLearnEnvoy.io上有一个很好的教程,它将带您了解这些概念。

于 2018-03-26T20:39:45.987 回答