一次排查istio异常链路的经历

如图我们可以看到从wsn-20201116-0 发送请求到wsn-201116-0的请求Envoy拦截http请求异常,所以我们可以看到inbound 和 outbound的数据是异常的 很多报文数据没有收集到:

一次排查istio异常链路的经历

验证:如图上发现route_name这个参数是空的,第一反应该问题应该是路由导致的,所以追踪了下路由是如何走的:

通过istioctl pc route wsn-20201116-0 -n xhzy-pe --name 80 -o json 查看发起端应用访问wsn-201116.xhzy-pe.svc.cluster.local/ok2这个80口的路由是如何走的,查看了下 果然没有到wsn-201116.xhzy-pe.svc.cluster.local的路由,因为istioctl pc route只显示http的路由,百思不得其解的时候看了下 istio的protocol-selection,发现istio是根据service port name([-])指定通信协议的,之后查看了svc配置,果然指定的是tcp流量

如果您将协议声明为TCP,那么您是在告诉Istio将其视为TCP通信,而不是解析HTTP报头。您不能在使用http的虚拟服务中使用TCP流量路由。

一次排查istio异常链路的经历

那么问题就显然易见了,因为指定了tcp流量 所以路由表里不会出现,这里两个解决方案,一个是tcp改成http 另外一个是去掉name 由istio自动协议选择,但必须打开enableProtocolSniffingForOutbound默认情况下是启用此功能的。