DPE(下游协议错误)--Istio访问日志ResponseFlag重现与解析06
KubeCon 2023在上海做的一个关于Istio访问日志的演讲《Detailed Parse and Reproduce Response Flags of Istio Access Log Based on Production Use Case》。解析和重现了在当时解决客户问题时碰到的各种应答日志。
第六个关注的Response Flag是DPE,全称是 DownstreamProtocolError ,官方定义表示"The downstream request had an HTTP protocol error"
含义:
UPE表示下游协议错误。如下游客户端通过一个错误的协议访问目标服务时,一般服务端会记录400DPE的日志
重现环境:
- 客户端Pod,注入了Sidecar。注意这里选择的是busybox容器,确认容器中包含telnet命令。
- 目标服务,一个Cluster类型的Kubernetes服务,多个服务实例。服务端Pod可以注入Siecar,也可以不用注入。
重现步骤:
第一步: 从注入了网格代理的客户端Pod中通过目标名和服务端口访问目标服务,观察代理的访问日志,得到正常的200响应码。从服务端和客户端的访问日志上都可以看到服务在目标服务的多个实例上负载均衡。正常访问参照本系列的环境部分描述。
第二步: 在客户端busybox容器中,telnet目标服务的服务地址和端口,会得到400 Bad Request的错误。表示因为客户端的请求错误导致访问失败,根本原因当然是客户端协议错误,没有如服务端要求发送HTTP协议的请求。
第三步: 观察访问日志,客户端日志是一条四层的访问日志,因为是四层的访问 。
1[2023-08-21T13:56:45.757Z] "- - -" 0 - - - "-" 25 162 53038 - "-" "-" "-" "-" "10.246.91.131:80" PassthroughCluster 10.66.0.38:45964 10.246.91.131:80 10.66.0.38:43958 - -
第四步: 服务端日志记录400 DPE 表示下游协议错误。
1[2023-08-21T13:57:37.792Z] "- - HTTP/1.1" 400 DPE http1.codec_error - "-" 0 11 0 - "-" "-" "-" "-" "-" - - 10.66.0.28:80 10.66.0.1:19532 - -
应对建议
DPE协议无需对环境或目标服务进行任何修改,只需要客户端使用正确的协议访问目标服务即可。