Isito - 404问题总结

1.预发布环境404问题

现象:

服务配置未做改动,重启服务后,在该服务内去调用别的服务报404,

并且该服务对应istio-proxy访问日志报response_flag为NR(No route configured for a given request in addition to 404 response code.)

并且在被调用的服务中未看到tomcat访问日志

原因:

NR即服务没有对应的Istio配置,考虑到可能是istio中负责服务发现与分发的组件pilot发生异常,通过查看istio-pilot发现如下日志:

如上标红日志即提示:域名mx-gas-station-boot.tsp不唯一,发生冲突,即存在多处mx-gas-station-boot.tsp域名的定义;
通过kiali查看mx-gas-station-boot的相关配置,发现存在ServiceEntry.mx-gas-station定义如下:

 

其中标红域名与K8s中Service.mx-gas-station-boot域名发生冲突,导致pilot无法生成完整服务路由信息,

进而影响到新启动的服务无法获得服务路由信息,所以发生服务调用时均提示404 NR,而老服务由于之前缓存过路由信息,

所以依旧可以通过缓存的路由信息去调用别的服务;

解决方法:

删除ServiceEntry.mx-gas-station-boot并检查其他ServiceEntry,查看是否还有类似域名冲突;

解决域名冲突后服务间即可正常调用;

在Isito中Gateway、ServiceEntry中的域名必须唯一绑定,且不能相互间重复发生冲突;

Gateway中定义的域名为集群内服务的对外入口域名绑定;

ServiceEntry用于定义集群外部服务的域名,用于集群内服务想要通过Istio路由访问外部服务,例如预发环境想要访问测试环境域名,测试环境想要访问本地开发IP:Port;

2.测试环境404问题

现象:

服务配置未做改动,重启服务后,在该服务内去调用别的服务报404,并且该服务对应istio-proxy访问日志报response_flag为-

并且在被调用的服务中看到如下tomcat访问日志而直接通过k8s Service进行服务调用是可以成功的(即直接通过serviceName.namespaces,不走Istio路由)

原因:

Isito路由不生效(即通过Istio路由s267.tsp/256进行访问,而实际到达应用的path仍为/256,并没有按照Isito路由被转换为/context_path),而K8s服务路由生效;

考虑到之前对Istio sidecar统一设置过excludeOutboundIPRanges(解决ELK协议不匹配问题),因此导致了服务的sidecar跳过了部分服务请求,导致path没有被转换,进而引发了404;

 

 

解决方法:

使用includeOutboundIPRanges代替excludeOutboundIPRanges,仅对K8s Service、Pod所对应的IP Range进行sidecar拦截,避免错过集群内服务请求的拦截,且对集群外IP不进行拦截(兼容ELK);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章