跟我学EnvoyGateway:启用速率限制

摘要:本文详细阐述了Envoy Gateway中的全局速率限制功能。介绍了速率限制的概念及其重要性,包括防止恶意活动和资源过载等。接着讲解了Envoy Gateway中全局速率限制的工作原理,以及如何通过配置实现对不同类型流量的速率限制,如特定用户、不同用户(除管理员外)、所有请求、客户端IP地址和Jwt声明等。通过实际示例和操作步骤,展示了如何在Kubernetes环境中安装和配置相关组件,以实现有效的速率限制策略。

一、引言

速率限制是一种根据流量属性将传入请求数量限制为预定义值的功能。其具有重要意义,可用于防止恶意活动(如DDoS攻击)、避免应用及其资源(如数据库)过载,以及根据用户权限创建API限制。Envoy Gateway支持全局速率限制和本地速率限制两种类型,本文重点介绍全局速率限制。

二、全局速率限制原理

全局速率限制对通过所有配置了Envoy代理实例的流量应用共享速率限制。例如,若数据平面有2个Envoy副本运行,速率限制为10请求/秒,当5个请求通过第一个副本且5个请求通过第二个副本在同一秒内时,该限制将被触发。

三、配置全局速率限制的前提条件

(一)安装Envoy Gateway

按照快速入门任务中的步骤安装Envoy Gateway和示例清单。在继续操作之前,应能够使用HTTP查询示例后端。可通过以下命令验证网关状态:

  • kubectl get gateway/eg -o yaml

(二)安装Redis

全局速率限制功能基于Envoy Ratelimit,需要Redis实例作为缓存层。在redis-system命名空间中安装Redis部署,可通过以下方式应用资源:

---
kind: Namespace
apiVersion: v1
metadata:
  name: redis-system 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: redis-system
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - image: redis:6.0.6
        imagePullPolicy: IfNotPresent
        name: redis
        resources:
          limits:
            cpu: 1500m
            memory: 512Mi
          requests:
            cpu: 200m
            memory: 256Mi
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: redis-system 
  labels:
    app: redis
  annotations:
spec:
  ports:
  - name: redis
    port: 6379
    protocol: TCP
    targetPort: 6379
  selector:
    app: redis

(三)在Envoy Gateway中启用全局速率限制

默认安装的Envoy Gateway会安装默认的EnvoyGateway配置并使用ConfigMap附加。需更新此资源以在Envoy Gateway中启用速率限制,并配置用于全局速率限制的Redis实例的URL。通过以下命令应用配置:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: envoy-gateway-config
  namespace: envoy-gateway-system
data:
  envoy-gateway.yaml: |
    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: EnvoyGateway
    provider:
      type: Kubernetes
    gateway:
      controllerName: gateway.envoyproxy.io/gatewayclass-controller
    rateLimit:
      backend:
        type: Redis
        redis:
          url: redis.redis-system.svc.cluster.local:6379    

更新ConfigMap后,需等待配置生效,也可通过重启envoy-gateway部署强制重新加载配置:
kubectl rollout restart deployment envoy-gateway -n envoy-gateway-system

四、不同类型的速率限制示例

(一)限制特定用户

以下示例由应用开发者实现,通过匹配自定义x-user-id标头且值为one来限制特定用户。

  1. 创建BackendTrafficPolicy资源
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: BackendTrafficPolicy 
metadata:
  name: policy-httproute
spec:
  targetRefs:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: http-ratelimit
  rateLimit:
    type: Global
    global:
      rules:
      - clientSelectors:
        - headers:
          - name: x-user-id
            value: one
        limit:
          requests: 3
          unit: Hour
  1. 创建HTTPRoute资源
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http-ratelimit
spec:
  parentRefs:
  - name: eg
  hostnames:
  - ratelimit.example 
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - group: ""
      kind: Service
      name: backend
      port: 3000

通过查询ratelimit.example/get,前3个请求应返回200响应,第4个请求应返回429状态码,因为对包含x-user-id标头且值为one的请求设置了每小时3次的限制。

(二)限制不同用户(除管理员外)

此示例限制除管理员(通过x-user-id标头值为admin识别)外的不同用户,用户onetwo每小时限制为3次请求。

  1. 创建BackendTrafficPolicy资源
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: BackendTrafficPolicy 
metadata:
  name: policy-httproute
spec:
  targetRefs:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: http-ratelimit
  rateLimit:
    type: Global
    global:
      rules:
      - clientSelectors:
        - headers:
          - type: Distinct
            name: x-user-id
        - name: x-user-id
          value: admin
          invert: true
        limit:
          requests: 3
          unit: Hour
  1. 创建HTTPRoute资源(同上述示例)

x-user-idonetwo时,前3个请求成功,第4个请求被速率限制;当x-user-idadmin时,4个请求均应返回200 OK

(三)限制所有请求

此示例将匹配HTTPRoute规则的所有请求限制为每小时3次,通过不设置clientSelectors字段实现。

  1. 创建BackendTrafficPolicy资源
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: BackendTrafficPolicy 
metadata:
  name: policy-httproute
spec:
  targetRefs:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: http-ratelimit
  rateLimit:
    type: Global
    global:
      rules:
      - limit:
          requests: 3
          unit: Hour
  1. 创建HTTPRoute资源(同上述示例)

查询ratelimit.example/get时,前3个请求返回200响应,第4个请求返回429状态码。

(四)限制客户端IP地址

此示例根据客户端IP地址(反映在X-Forwarded-For标头中)限制不同用户。EG支持两种IP地址速率限制类型:精确(Exact)和不同(Distinct)。精确表示指定源IP CIDR内的所有IP地址共享相同速率限制桶;不同表示每个IP地址有自己的速率限制桶。

  1. 创建BackendTrafficPolicy资源
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: BackendTrafficPolicy 
metadata:
  name: policy-httproute
spec:
  targetRefs:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: http-ratelimit
  rateLimit:
    type: Global
    global:
      rules:
      - clientSelectors:
        - sourceCIDR: 
            value: 0.0.0.0/0
            type: Distinct
        limit:
          requests: 3
          unit: Hour
  1. 创建HTTPRoute资源(同上述示例)

查询ratelimit.example/get时,前3个请求返回200响应,第4个请求返回429状态码。

(五)限制Jwt声明

此示例根据Jwt声明中的值限制不同用户。

  1. 创建SecurityPolicy资源
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: SecurityPolicy
metadata:
  name: jwt-example
spec:
  targetRefs:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: example
  jwt:
    providers:
    - name: example
      remoteJWKS:
        uri: https://raw.githubusercontent.com/envoyproxy/gateway/main/examples/kubernetes/jwt/jwks.json
      claimToHeaders:
      - claim: name
        header: x-claim-name
  1. 创建BackendTrafficPolicy资源
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: BackendTrafficPolicy 
metadata:
  name: policy-httproute
spec:
  targetRefs:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: example
  rateLimit:
    type: Global
    global:
      rules:
      - clientSelectors:
        - headers:
          - name: x-claim-name
            value: John Doe
        limit:
          requests: 3
          unit: Hour

五、总结

Envoy Gateway的全局速率限制功能为控制流量提供了强大手段。通过合理配置,可根据不同需求对流量进行精确限制,有效保护应用和资源免受恶意攻击和过载影响,同时满足多样化的业务限制要求。在实际应用中,需根据具体场景选择合适的速率限制策略,并正确配置相关资源,以确保系统的稳定性和安全性。

专业术语翻译
Rate limit速率限制
Global rate limiting全局速率限制
Local rate limiting本地速率限制
DDoS attacksDDoS攻击
API limitsAPI限制
user entitlements用户权限
Envoy GatewayEnvoy网关
CRD (Custom Resource Definition)自定义资源定义
BackendTrafficPolicy后端流量策略
Gateway网关
HTTPRouteHTTP路由
GRPCRouteGRPC路由
Deployment部署
Service服务
ConfigMap配置映射
Jwt (JSON Web Token)JSON Web令牌
claims声明
SecurityPolicy安全策略
remoteJWKS远程JSON Web密钥集
claimToHeaders声明到标头的映射
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值