UPE(上游服务协议错误)--Istio访问日志ResponseFlag重现与解析05
KubeCon 2023在上海做的一个关于Istio访问日志的演讲。解析和重现了在当时解决客户问题时碰到的各种应答日志。
第五个关注的Response Flag是UPE,全称是 UpstreamProtocolError ,官方定义表示"The upstream response had an HTTP protocol error."
含义:
UPE表示上游服务协议错误。在网格中定义的服务的协议和服务实际的协议不一致时,当服务访问时,客户端会得到502协议错误的响应。同时服务端的入流量日志会记录502 UPE。
重现环境:
- 客户端Pod,注入了Sidecar。
- 目标服务,一个Cluster类型的Kubernetes服务,多个服务实例。服务端Pod可以注入Siecar,也可以不用注入。
重现步骤:
第一步: 从注入了网格代理的客户端Pod中通过目标名和服务端口访问目标服务,观察代理的访问日志,得到正常的200响应码。从服务端和客户端的访问日志上都可以看到服务在目标服务的多个实例上负载均衡。正常访问参照本系列的环境部分描述。
第二步: 在第一个正常用例基础上修改服务端口为gRPC,可以是修改端口名或者AppProtocol字段。
1apiVersion: v1
2kind: Service
3metadata:
4 name: nginx
5 namespace: accesslog
6spec:
7 ports:
8 - name: grpc # modify protocol by port name or AppProtocol
9 port: 80
10 protocol: TCP
11 targetPort: 80
12 selector:
13 app: nginx
14 sessionAffinity: None
15 type: ClusterIP
第三步: 在客户端容器中正常的curl目标服务,得到502 Bad Gateway的错误,Reset reason 提示 protocol error。
第四步: 观察访问日志,客户端日志记录502 。
12023-08-19T09:42:38.460Z] "GET / HTTP/1.1" 502 - via_upstream - "-" 0 87 15 15 "-" "curl/7.52.1" "56f62238-c106-4a75-a848-429a36489142" "nginx.accesslog" "10.66.0.28:80" outbound|80|v1|nginx.accesslog.svc.cluster.local 10.66.0.24:43270 10.246.91.131:80 10.66.0.24:51868 - -
第五步: 服务端日志记录502 UPE 表示上游协议错误。
1[2023-08-19T09:42:38.464Z] "GET / HTTP/2" 502 UPE upstream_reset_before_response_started{protocol_error} - "-" 0 87 0 - "-" "curl/7.52.1" "56f62238-c106-4a75-a848-429a36489142" "nginx.accesslog" "10.66.0.28:80" inbound|80|| 127.0.0.6:45649 10.66.0.28:80 10.66.0.24:43270 outbound_.80_.v1_.nginx.accesslog.svc.cluster.local default
应对建议
在服务中正确的定义服务端口的应用协议。Istio中读取Service中端口名中的协议信息,或AppProtocol 来判定服务的应用协议,确保协议配置正确。