摘要:本文详细阐述了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
来限制特定用户。
- 创建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
- 创建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
识别)外的不同用户,用户one
和two
每小时限制为3次请求。
- 创建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
- 创建HTTPRoute资源(同上述示例)
当x-user-id
为one
或two
时,前3个请求成功,第4个请求被速率限制;当x-user-id
为admin
时,4个请求均应返回200 OK
。
(三)限制所有请求
此示例将匹配HTTPRoute规则的所有请求限制为每小时3次,通过不设置clientSelectors
字段实现。
- 创建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
- 创建HTTPRoute资源(同上述示例)
查询ratelimit.example/get
时,前3个请求返回200
响应,第4个请求返回429
状态码。
(四)限制客户端IP地址
此示例根据客户端IP地址(反映在X-Forwarded-For
标头中)限制不同用户。EG支持两种IP地址速率限制类型:精确(Exact)和不同(Distinct)。精确表示指定源IP CIDR内的所有IP地址共享相同速率限制桶;不同表示每个IP地址有自己的速率限制桶。
- 创建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
- 创建HTTPRoute资源(同上述示例)
查询ratelimit.example/get
时,前3个请求返回200
响应,第4个请求返回429
状态码。
(五)限制Jwt声明
此示例根据Jwt声明中的值限制不同用户。
- 创建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
- 创建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 attacks | DDoS攻击 |
API limits | API限制 |
user entitlements | 用户权限 |
Envoy Gateway | Envoy网关 |
CRD (Custom Resource Definition) | 自定义资源定义 |
BackendTrafficPolicy | 后端流量策略 |
Gateway | 网关 |
HTTPRoute | HTTP路由 |
GRPCRoute | GRPC路由 |
Deployment | 部署 |
Service | 服务 |
ConfigMap | 配置映射 |
Jwt (JSON Web Token) | JSON Web令牌 |
claims | 声明 |
SecurityPolicy | 安全策略 |
remoteJWKS | 远程JSON Web密钥集 |
claimToHeaders | 声明到标头的映射 |