如何配置Envoy作为转发(Egress出口)代理,解决no healthy upstream报错
你当前配置报错的核心原因是集群使用了ORIGINAL_DST类型,该类型仅适用于操作系统层面(如iptables、pf)做流量透明重定向的场景。你使用curl -x显式指定代理的请求模式下,Envoy无法获取到原始目的地址的连接元数据,无法匹配上游节点,因此返回no healthy upstream错误。
正确通用HTTP Egress代理配置
下面是支持显式代理请求的标准配置,使用Envoy动态转发过滤器实现无需预配置上游集群的通用代理能力:
static_resources: listeners: - name: listener_0 address: socket_address: { address: 0.0.0.0, port_value: 10000 } filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager stat_prefix: egress_http # 开启解析代理请求的完整URL http_protocol_options: allow_absolute_url: true access_log: - name: envoy.access_loggers.stdout typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog http_filters: # 加入动态转发过滤器 - name: envoy.filters.http.dynamic_forward_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.dynamic_forward_proxy.v3.FilterConfig dns_cache_config: name: dynamic_forward_proxy_cache dns_lookup_family: V4_ONLY - name: envoy.filters.http.router route_config: name: egress_route virtual_hosts: - name: default_egress domains: ["*"] routes: - match: { prefix: "/" } route: cluster: dynamic_egress_cluster auto_host_rewrite: true clusters: - name: dynamic_egress_cluster connect_timeout: 6s lb_policy: ROUND_ROBIN # 集群类型指定为动态转发 cluster_type: name: envoy.clusters.dynamic_forward_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.clusters.dynamic_forward_proxy.v3.ClusterConfig dns_cache_config: name: dynamic_forward_proxy_cache dns_lookup_family: V4_ONLY
测试验证
使用原命令启动Envoy后,重新执行curl测试即可正常返回结果:
curl -x http://127.0.0.1:10000 http://proton4.eng.vmware.com
补充说明
如果你需要使用ORIGINAL_DST模式做透明代理,需要额外在Mac系统配置pf规则,将所有出口80/443流量重定向到Envoy的10000端口,无需在客户端指定代理参数即可实现全量流量代理。
内容的提问来源于stack exchange,提问作者Hiccup
相关产品推荐
相关产品推荐

