我似乎无法让Envoy使用部署的多个gRPC服务。 gRPC调用始终转到同一个实例。 Envoy负载均衡器如何发现有其他相同服务的实例是使用docker-compose规模启动的?
我使用的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实例时,新启动的实例都不会接收任何调用。我的配置问题在哪里?
答案 0 :(得分:2)
您的群集由静态主机定义支持:docker-compose ps
。因此,Envoy只会在那里列出的主机上平衡 - 端口30270上的单个主机。
Docker-compose将为它带来的每个主机创建动态命名的实例。由于您在配置时不知道这些名称,因此您必须使用类似'app/assets/styles/**/*.css') <<<<
的内容来获取这些名称,然后将其反馈给Envoy的动态配置。
要实现的特定动态配置是the Endpoint Discovery Service。有一个关于LearnEnvoy.io的好教程将带您了解这些概念。