9.1.1 可能的请求错误排查

在实际的运行过程中,Istio Pilot或者Envoy代理可能会遇到503或者404请求错误,例如,对于HTTP和TCP来说,可能会遇到如下的响应信息:

·UH:除503响应代码外,上游集群中没有健康的上游主机。

·UF:除503响应代码外,还有上游连接失败。

·UO:除503响应代码外,还有上游溢出(触发熔断)。

·NR:除404响应代码外,没有为给定请求配置路由。

·URX:请求被拒绝,因为已达到上游重试限制(HTTP)或最大连接尝试次数(TCP)。

除此之外,对于HTTP请求来说,还可能会遇到如下的响应信息:

·DC:下游连接中断。

·LH:除503响应代码外,本地服务的运行状况检查请求失败。

·UT:除504响应代码外,上游请求超时。

·LR:除503响应代码外,连接本地重置。

·UR:除503响应代码外,上游远程重置。

·UC:除503响应代码外,上游连接中断。

这些错误可能有多种原因,但最常见的原因如下。

1.无法连接上Pilot

应用程序的Sidecar代理可能无法连接上Pilot(确认Pilot正在运行),如图9-1所示。

2.Kubernetes服务未配置正确的协议

Kubernetes服务未配置正确的协议,如图9-2所示,Istio Pilot通过Kubernetes API获取集群内的服务信息。

图9-1 应用程序的Sidecar代理无法连接上Pilot

图9-2 Kubernetes服务未配置正确的协议

3.启用了双向认证mTLS但服务间的目标规则不对

启用了双向认证mTLS,但服务间的目标规则DestinationRule中并没有设置相应的流量策略(Traff icPolicy),即流量策略中的TLS设置模式不匹配。例如,Istio环境中启用了mTLS,即


kubectl get MeshPolicy default -o yaml
apiVersion: authentication.istio.io/v1alpha1
kind: MeshPolicy
metadata: ...
spec:
  peers:
  - mtls: {}

但服务间设置的目标规则配置如下:


kubectl get destinationrule productpage -oyaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata: ...
spec:
  ...
  trafficPolicy:
    tls:
      mode: DISABLE

4.VirtualService/Envoy的配置不对

导致请求错误的另一个原因可能是Istio的VirtualService/Envoy配置正在捕获错误的上游集群中的路由。例如目标集群应用中Socket超时设置较低等,Socket超时越短,可能会有越多的503问题。因此在应用代码中建议设置合适的超时时间,例如在Node.js应用中可以如下设置:


const server = app.listen(port, '0.0.0.0', () => {
  logger.info(`App is now running on http:      // localhost:${port}`)
})
server.keepAliveTimeout = 1000 * (60 * 6)       // 6 minutes

在Python应用中可以如下设置:


global_config = {
  'server.socket_timeout': 6 * 60,
}
cherrypy.config.update(global_config)

而在Tomcat应用中则可以如下设置连接超时参数:


server:
  connect-timeout: 360000