Skip to main content

ingress 实现限流

ngress 是什么

ngress:service 的统一网关入口

K8s 的 pod 和 service 需要通过 NodePort 把服务暴露到外部, 但是随着微服务的增多。 端口会变得不好管理。 所以通常情况下我们会设计一个 ingress 来做路由的转发,方便统一管理。效果如图:

alt text

ingress 主要分为两部分

  1. ingress controller 是流量的入口,是一个实体软件, 一般是 nginx 和 Haproxy 。
  2. ingress 描述具体的路由规则。

ingress作用:

  1. 基于 http-header 的路由
  2. 基于 path 的路由
  3. 单个 ingress 的 timeout
  4. 请求速率 limit
  5. rewrite 规则

k8s 中应用

在 Kubernetes 中,使用 Ingress 控制器实现限流(Rate Limiting)是一种常见的做法。不同的 Ingress 控制器可能有不同的实现方式。以下是如何使用 NGINX Ingress 控制器实现限流的示例。

使用 NGINX Ingress 控制器实现限流

  1. 安装 NGINX Ingress 控制器

    如果你还没有安装 NGINX Ingress 控制器,可以使用以下命令通过 Helm 安装:

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    helm install ingress-nginx ingress-nginx/ingress-nginx
  2. 配置 Ingress 资源的限流注解

    你可以在 Ingress 资源中使用特定的注解来配置限流。例如,以下示例限制每个客户端 IP 每秒最多可以发送 10 个请求:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: web-ingress
    annotations:
    nginx.ingress.kubernetes.io/limit-connections: "10"
    nginx.ingress.kubernetes.io/limit-rps: "10"
    nginx.ingress.kubernetes.io/limit-burst-multiplier: "1"
    nginx.ingress.kubernetes.io/limit-rate-after: "10"
    spec:
    rules:
    - host: example.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: web-nginx
    port:
    number: 80

    这些注解的含义如下:

    • nginx.ingress.kubernetes.io/limit-connections: 限制每个客户端 IP 的最大并发连接数。
    • nginx.ingress.kubernetes.io/limit-rps: 限制每个客户端 IP 每秒的请求数。
    • nginx.ingress.kubernetes.io/limit-burst-multiplier: 配置允许的突发请求数。
    • nginx.ingress.kubernetes.io/limit-rate-after: 配置在达到指定请求数之后开始限速。
  3. 应用 Ingress 资源

    使用 kubectl apply 命令应用这个 Ingress 资源:

    kubectl apply -f ingress.yaml

验证限流配置

为了验证限流配置是否生效,可以使用工具如 curlwrk 进行压力测试。例如,使用 curl 发送多个请求:

for i in {1..20}; do curl -s -o /dev/null -w "%{http_code}\n" http://example.com/; done

你应该会看到一些请求返回 429 Too Many Requests 状态码,表示限流生效。

总结

通过在 Ingress 资源中使用特定的注解,你可以轻松地配置 NGINX Ingress 控制器的限流功能。不同的 Ingress 控制器可能有不同的配置方式,具体请参考相应的文档。