【发布时间】:2020-06-02 05:01:03
【问题描述】:
我将我的服务托管在 azure 云上,有时我在没有任何明显原因的情况下得到“BackendConnectionFailure”,经过调查,在大多数情况下,我发现此异常与自动缩放(缩小)之间几乎同时存在相关性。
根据文档的终止宽限期默认为 30 秒,就是这样。 pod 将被标记为终止,负载均衡器将不再考虑它,因此不再接收请求。据此,如果我的服务花费的时间远少于 30 秒,我的应用程序中不需要 prestop 钩子或任何特殊实现(如果我错了,请纠正我)。
如果上一段是正确的,为什么这个异常发生的比较频繁?我的想法是当 pod 被标记为终止并且负载均衡器不再向 pod 转发请求时,它应该这样做。
编辑 1:
架构就是这样
客户端 -> 防火墙(azure) -> API(azure APIM) -> 微服务(Spring boot) -> 后端(第三方) 或 Azure RDB,具体取决于服务
我认为异常来自 APIM,我发现此异常有两种模式:
Message The underlying connection was closed: The connection was closed unexpectedly. Exception type BackendConnectionFailure Failed method forward-request
Response time 10.0 s
Message The underlying connection was closed: A connection that was expected to be kept alive was closed by the server. Exception type BackendConnectionFailure Failed method forward-request
Response time 3.6 ms
【问题讨论】:
-
您能更详细地描述一下您的应用程序的架构吗?
BackendConnectionFailure来自哪里?什么与负载均衡器通信?您希望与应用程序的活动连接会发生什么? -
@Matt:根据 k8s pod 终止“kubernetes.io/docs/concepts/workloads/pods/pod/…”负载均衡器将处于终止状态的 pod 移除。我希望即使在 pod 终止时连接也不会终止,我希望 pod 阻止进一步的请求,并在完成当前请求后关闭。
-
你是如何向 APIM 公开 spring boot k8s 服务的?
-
@Matt,如果我理解你的意思,该服务托管在 azure k8s 上。 API通过后端url和“RequestMapping”路径访问服务。
-
更具体地说,在 kubernetes 中,您使用什么来公开服务。可能是 ingress、loadbalancer、nodeport 之一。
标签: spring-boot kubernetes azure-aks horizontal-pod-autoscaling