-
错误:upstream connect error or disconnect/reset before headers. reset reason: connection termination
-
环境:k8s部署的django后端
-
发生场景:外部应用|postman|脚本 向后端发送post请求,
api/handleOrders
,返回状态码是503
-
后端容器启动正常:
- istio-proxy
kubectl logs -f husky-web-7fd95dcff6-9clqx -n pdm-platform istio-proxy
- 脚本发请求
探究步骤:
通过搜索引擎查找解决方案,反应的全是关于istio-proxy的内容。各种博客认为K8S部署了Istio后,在启动的节点中,istio-proxy
这个容器先于后端容器启动,流量先流入前者,istio-proxy
接收流量发现配置upstearm
的后端服务未启动,于是报503。需要在部署文件中加探针的方法,保证后端服务先起来:
我添加了发送命令的就绪探针,后面:
readinessProbe:
exec:
command:
- curl
- -X POST
- http://localhost/api/handleOrders
initialDelaySeconds: 5
timeoutSeconds: 1
结果是istio-proxy
pod没有起来:
也添加了httpGet的就绪探针:
livenessProbe:
httpGet:
path: /api/handleOrders
port: 3033
httpHeaders:
initialDelaySeconds: 5
periodSeconds: 5
结果是:
用脚本发post请求是一样的错误,因此需要将有关的pod删除,然后服务重启
修复过程
中途尝试的过程改了svc的ports的name改成了http-0,结果k8s索性根据这个name将协议解析为http协议。
因为我们所部署的后端是socket协议,后端是uwsgi启动的服务,前后端沟通不是http协议。此时发生的错误就是400,传输的数据不符合服务端要求,是客户端的问题。
后面改回来重启了服务,本文的问题就没了。