我的Google Kubernetes Engine集群中有一个支持Google Cloud Load Balancer的入口。我设置了一个自动缩放器,用于根据CPU使用情况调整部署副本的数量。我们说我已将CPU阈值设置为50%。
当有一连串请求时,CPU使用率会达到100%。自动缩放器需要几分钟才能实现高负载,创建更多pod,必要时创建新节点,并通过运行状况检查。在此缩放期间,由于超时,一些或大多数请求因502错误而失败。如果服务器负载过重,我宁愿立即返回503错误代码,而不是在30秒超时后返回502错误代码。
是否可以让负载均衡器将流量引导到CPU使用率最低的pod?如果没有任何pod的CPU使用率低于某个阈值,例如80%,是否可以返回503错误代码?
处理大量流量的标准做法是什么?如何在Kubernetes中解决此问题?
答案 0 :(得分:1)
您描述的第一个问题(服务503)被称为"减载"。通常情况下,应用程序有责任说:" oops,我超载,503,减速"。如果您将此责任移交给客户端,那么为您提供任何合理的保护可能反应太慢 - 其数据将始终落后。从系统可靠性的角度来看,将此逻辑保留在服务器应用程序中会更好。
第二个问题是CPU感知负载平衡。解决此问题的一种可能方法称为加权循环法 - 它类似于常规循环法,但更喜欢负载较少的节点。如果您在Kubernetes中安装istio,则可以从a list of load balancing policies中进行选择。其中一个是weighted least request - 它依赖于飞行中的请求数量,而不是直接在CPU上,但如果所有请求的CPU成本相同,那么它可能是CPU负载的良好代理。
答案 1 :(得分:0)
还有一种可能的解决方案,就是使用Istio断路器。您可以配置对服务发出的并发请求数量,或者还可以使用异常检测,它将检测服务故障,并以此为基础来改善用户体验。