在实际的运行过程中,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