【问题标题】:Request buffering in Kubernetes clustersKubernetes 集群中的请求缓冲
【发布时间】:2020-11-24 15:14:38
【问题描述】:

这是一个纯粹的理论问题。一个标准的 Kubernetes 集群提供了自动缩放。如果内存超过某个 targetMemUtilizationPercentage,那么就会启动一个新的 pod,它会处理到达所包含服务的请求流。 minReplicas 的数量设置为 1,maxReplicas 的数量设置为 5。

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

【问题讨论】:

    标签: kubernetes request buffer load-balancing


    【解决方案1】:

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

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

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

    由于 Kubernetes 本质上在 linux 上运行,值得注意的是 linux 本身也管理/限制来自套接字的请求。您可能想了解更多关于它的信息here

    另一件事是,如果您设置了 pod 限制或资源不足,则很可能会重新启动 pod 或集群将变得不稳定。通常,您可以通过配置某种“断路器”来限制可以在不超载的情况下支持的请求数量来防止它。如果请求数量超过断路器阈值,则会丢弃过多的请求。

    放弃一些请求比拥有cascading failure更好。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这取决于应用程序本身以及客户端和应用程序之间是否存在入口控制器(反向代理)。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 2019-07-19
        相关资源
        最近更新 更多