访问Consul服务网格内带sidecar的Pod IP返回空响应问题求助
问题根因
当你为Pod开启consul.hashicorp.com/connect-inject: true注解注入Consul Sidecar后,Sidecar中的Envoy代理会默认拦截Pod的所有入站流量。Envoy的入站规则默认只放行携带Consul服务网格合法mTLS身份、通过服务发现路径发起的请求,直接访问Pod IP的请求没有合法的mTLS身份标识,会被Envoy直接丢弃,因此返回空响应触发curl 52报错。未注入Sidecar时没有流量拦截逻辑,请求直接到达应用端口,所以访问正常。
解决方案
你可以根据实际使用场景选择以下任意一种方案解决问题:
- 走服务网格标准访问路径:不要直接访问Pod IP,在网格内的客户端使用
{服务名}.virtual.consul:{服务端口}的格式发起请求,Consul会自动完成服务发现、负载均衡和mTLS身份校验,请求可以正常通行。 - 排除指定端口的入站拦截:如果业务确实需要直接通过Pod IP访问,给counting服务的Deployment添加注解
consul.hashicorp.com/transparent-proxy-exclude-inbound-ports: "9001",将应用端口从Sidecar的入站拦截规则中剔除,流量会直接递交给应用容器,无需经过Envoy校验。 - 为客户端也注入Sidecar:如果是测试场景需要访问Pod IP,给发起请求的network-tools Pod也开启Consul Sidecar注入,客户端Sidecar会自动为请求附加合法的mTLS身份标识,服务端的Envoy会正常放行请求返回响应。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

