AWS EC2实例使用Envoy代理出现“No healthy upstream”错误求助
解决方案:修复Envoy的"No healthy upstream"错误
1. 修正Envoy配置中的核心问题
你的envoy.yaml存在两个关键错误,导致无法正确连接上游gRPC服务:
a. 替换上游服务地址
host.docker.internal是Docker Desktop专属的本地主机映射地址,在AWS EC2的Docker Engine环境中无法识别。由于你已经将Envoy和gRPC服务加入同一个Docker网络test-net,可以直接使用容器名称作为服务地址:
修改clusters部分的socket_address:
clusters: - name: echo_service connect_timeout: 0.25s type: logical_dns http2_protocol_options: {} lb_policy: round_robin load_assignment: cluster_name: echo_service # 修正:与集群名称保持一致 endpoints: - lb_endpoints: - endpoint: address: socket_address: address: greeter-service # 替换为gRPC服务容器名 port_value: 5001
b. 统一集群名称
原配置中load_assignment.cluster_name为cluster_0,但对应的集群名称是echo_service,两者不匹配会导致Envoy无法正确加载负载分配规则,必须修改为一致的名称(如上代码所示)。
2. 重新部署Envoy容器
确保使用修改后的配置文件启动Envoy。如果你的镜像内置了旧配置,需要重新构建镜像,或者通过挂载本地修改后的配置文件运行:
# 停止旧的Envoy容器(如果运行中) docker stop envoy # 挂载修改后的配置文件启动Envoy(路径根据你的镜像调整) docker container run --network test-net --rm -d -it --name envoy -p 8080:8080 -p 9902:9902 -v $(pwd)/envoy.yaml:/etc/envoy/envoy.yaml limeniye/greeter-envoy
3. 验证网络连通性
进入Envoy容器,测试是否能解析并访问gRPC服务:
# 进入Envoy容器 docker exec -it envoy sh # ping gRPC服务容器名,确认网络连通 ping greeter-service # 用curl测试gRPC服务(支持HTTP/2的情况下) curl -v http://greeter-service:5001
4. 检查EC2安全组(可选)
确认EC2安全组已开放8080端口,允许外部访问(你能直接访问5001端口,此步骤大概率已完成)。
完成以上步骤后,重新通过http://52.58.230.171:8080调用gRPC服务,即可解决"No healthy upstream"错误。
内容的提问来源于stack exchange,提问作者limeniye
相关产品推荐
相关产品推荐

