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

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

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

见下图,展示了架构。

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

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

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

作为一个额外的问题,我接下来需要做的是让 HPA 监控请求排队并自动扩展/缩减部署,以将 pod 的数量与当前正在处理/排队的请求数量相匹配。例如,如果每个 pod 可以同时处理 100 个正在运行的请求,而我们目前要处理的负载水平为 1000 个请求,那么自动缩放到 10 个 pod。

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

enter image description here

解决方法

Nginx 入口允许使用 annotations 进行速率限制。您可能想看看AnnotatedRegion<SystemUiOverlayStyle>( value: SystemUiOverlayStyle( statusBarColor: Colors.transparent,//set as per your status bar color systemNavigationBarColor: Colors.black,//set as per your navigation bar color statusBarIconBrightness: Brightness.dark,//set as per your status bar icons' color systemNavigationBarIconBrightness: Brightness.dark,),child: MaterialApp(

  • limit-rps:每秒从给定 IP 接受的请求数。突发限制设置为此限制乘以突发倍数,默认倍数为5。当客户端超过此限制时,返回limit-req-status-code default: 503 .

最重要的是,NGINX 会将您的请求与 leaky bucket algorithm 一起排队,因此传入的请求将使用 FIFO(先进先出)算法缓冲在队列中,然后以有限的速率消耗。在这种情况下,突发值定义了允许请求超出超出限制的队列大小。当这个队列已满时,下一个请求将被拒绝。

有关限制流量和整形的更多详细信息:

,

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

关系图会是这样的。

NGINX ingress <- Prometheus <- Prometheus Adaptor <- custom metrics api service <- HPA controller

箭头表示 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

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

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

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

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

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

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

,

也许您应该考虑实施 Kubernetes Service APIs

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-