K8S Ingress:如何限制每个 Pod 的飞行请求

All*_*len 6 kubernetes linkerd kubernetes-ingress nginx-ingress hpa

我正在移植一个应用程序以在 k8s 中运行。我遇到了 ingress 问题。我正在尝试找到一种方法来限制在任何给定时间向部署管理的每个后端 Pod 发出的 REST API 请求数量。

请参阅下图所示的架构。

Ingress 由 nginx-ingress 管理。对于给定的一组 URL 路径,入口将请求转发到以 REST API 后端进程部署为目标的服务。部署还由 HPA 根据 CPU 负载进行管理。

我想要做的是找到一种方法对入口请求进行排队,这样运行我们的 API 后端进程的任何 pod 中的请求永远不会超过 X 个。(例如,每个 Pod 一次只允许 50 个请求)

有谁知道如何像这样设置请求限制?

作为一个额外的问题,我需要做的下一件事是让 HPA 监视请求排队并自动扩展/缩小部署,以将 Pod 数量与当前正在处理/排队的请求数量相匹配。例如,如果每个 Pod 可以同时处理 100 个正在运行的请求,而我们当前要处理的负载级别为 1000 个请求,则自动缩放到 10 个 Pod。

如果有用的话,我还计划为这个集群安装 linkerd。也许它有一种可以提供帮助的能力。

在此输入图像描述

小智 3

网络请求中的自动缩放需要自定义指标。鉴于您使用的是 NGINX 入口控制器,您可以首先安装 prometheus 和 prometheus 适配器,以从 NGINX 入口控制器导出指标。默认情况下,NGINX 入口控制器已经公开了 prometheus 端点。

关系图将会是这样的。

NGINX ingress <- Prometheus <- Prometheus Adaptor <- custom metrics api service <- HPA controller
Run Code Online (Sandbox Code Playgroud)

箭头表示API调用。因此,您的集群中总共将拥有另外三个提取组件。

设置自定义指标服务器后,您可以根据 NGINX 入口的指标扩展您的应用程序。HPA 将如下所示。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: srv-deployment-custom-hpa
spec:
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: srv-deployment
  minReplicas: 1
  maxReplicas: 100
  metrics:
  - type: Pods
    pods:
      metricName: nginx_srv_server_requests_per_second
      targetAverageValue: 100
Run Code Online (Sandbox Code Playgroud)

我不会在这里详细介绍实际的实现,因为它将包括许多特定于环境的配置。

设置完成后,您可以看到 HPA 对象将显示从适配器提取的指标。

对于对象级别的速率限制Service,您将需要一个强大的服务网格来实现。Linkerd2 被设计为轻量级,因此它不附带速率限制功能。您可以参考linkerd2下的这个问题。维护者拒绝在服务级别实施速率限制。他们会建议你在水平上这样做Ingress

AFAIK、Istio 和一些高级服务网格提供了速率限制功能。如果您尚未部署 linkerd 作为服务网格选项,您可以尝试使用 Istio。

对于Istio,您可以参考这篇文档来了解如何进行速率限制。但我需要让你知道,带有 NGINX ingress 的 Istio 可能会给你带来麻烦。Istio 附带了自己的入口控制器。您需要做额外的工作才能使其发挥作用。

总而言之,如果您可以将 HPA 与请求数量的自定义指标结合使用,这将是解决流量控制问题的快速解决方案。除非您在流量控制方面仍然遇到困难,否则您将需要考虑Service级别速率限制。