Kubernetes集群中的请求缓冲



这是一个纯粹的理论问题。给出了一个标准的Kubernetes集群,并在适当的位置进行了自动缩放。如果内存超过某个targetMemUtilizationPercentage,则会启动一个新的pod,并且它会接收到达所包含服务的请求流。minReplicas的数目设置为1,maxReplicas的数量设置为5。

当在线的pod数量达到最大值(在我们的情况下为5个(,并且客户端的请求仍在向节点发送时,会发生什么?这些请求是否被缓冲在它们被丢弃的某个地方?我可以采取任何措施来避免请求丢失吗?

原生Kubernetes不支持消息队列缓冲。根据您使用的场景和设置,您的请求很可能会"超时"。为了有效地管理这些资源,您需要在Kubernetes集群中运行自定义资源。

在这种情况下,通常使用消息代理来确保微服务之间的通信是可靠和稳定的,消息在系统内得到管理和监控,消息不会丢失。

RabbitMQ、Kafka和Redis似乎最受欢迎,但选择合适的将取决于您的需求和所需的功能。

值得注意的是,由于Kubernetes本质上是在linux上运行的,因此linux本身也管理/限制套接字中的请求。你可能想在这里阅读更多关于它的信息。

另一件事是,如果您设置了pods限制或缺乏资源,那么pods很可能会重新启动或集群变得不稳定。通常,您可以通过配置某种";断路器";以限制可以在不过载的情况下进行备份的请求数量。如果请求数量超过断路器阈值,则会丢弃过多的请求。

丢弃一些请求比级联失败要好。

我设法测试了这个场景,在没有得到处理的请求上,我得到了503 Service Unavailable和403 Forbidden。

Knative Serving实际上就是这样做的。https://github.com/knative/serving/

它缓冲请求,并根据飞行中的请求计数通知自动缩放决策。它还可以强制执行每个Pod的最大飞行中请求,并保持请求直到出现新的放大的Pod,然后Knative将请求代理给它们,因为它将这个名为queue-proxy的容器作为其称为"0"的工作负载类型的侧车;服务";。

最新更新