简介
连接限制功能允许用户限制 Gateway 或 Listener 上同时活跃的 TCP 连接数。当达到连接限制时,Envoy 代理会立即关闭新连接。还可以配置连接拒绝的延迟时间。
用户可能希望限制连接数的原因包括:
- 保护 CPU 和内存等资源。
- 确保不同的 Listener 可以公平地共享全局资源。
- 防范 DoS 等恶意攻击。
Envoy Gateway 引入了一种新的 CRD(自定义资源定义)—— Client Traffic Policy,允许用户描述期望的连接限制设置。该资源可以与 Gateway 关联,来实现流量的控制和限制。
值得注意的是,Envoy 的连接限制实现是分布式的,多个 Envoy 代理之间的计数器不会同步。
当 Client Traffic Policy 被附加到 Gateway 上时,连接限制的应用方式会根据 Listener 使用的协议有所不同:
- HTTP:所有在 Gateway 中的 HTTP Listener 会共享一个连接计数器,并且使用该计数器定义的连接限制。
- HTTPS/TLS:每个 HTTPS/TLS Listener 都会有一个独立的连接计数器,并且使用该计数器定义的连接限制。
前提条件
安装 Envoy Gateway
请按照快速入门任务中的步骤,安装 Envoy Gateway 和示例清单。完成这些步骤后,您应当能够使用 HTTP 查询示例后端。
验证 Gateway 状态:
kubectl get gateway/eg -o yaml
安装 hey 负载测试工具
hey
CLI 工具将用于生成负载并测量响应时间。按照 Hey 项目的文档 中的安装说明进行安装。
测试并自定义连接限制设置
以下示例使用 hey
打开 10 个连接,并在每个连接上执行每秒 1 次请求,持续 10 秒。
hey -c 10 -q 1 -z 10s -host "www.example.com" http://${GATEWAY_HOST}/get
总结:
Total: 10.0058 secs
Slowest: 0.0275 secs
Fastest: 0.0029 secs
Average: 0.0111 secs
Requests/sec: 9.9942
状态码分布:
[200] 100 responses
此时没有设置连接限制,因此所有 100 个请求均成功。
接下来,我们设置连接限制为 5 个连接。
应用连接限制
以下是设置连接限制的 YAML 配置:
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: ClientTrafficPolicy
metadata:
name: connection-limit-ctp
namespace: default
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: eg
connection:
connectionLimit:
value: 5
通过以下命令应用配置:
kubectl apply -f connection-limit-policy.yaml
执行负载测试
再次执行负载测试:
hey -c 10 -q 1 -z 10s -host "www.example.com" http://${GATEWAY_HOST}/get
总结:
Total: 11.0327 secs
Slowest: 0.0361 secs
Fastest: 0.0013 secs
Average: 0.0088 secs
Requests/sec: 9.0640
状态码分布:
[200] 50 responses
错误分布:
[50] Get "http://localhost:8888/get": EOF
通过新设置的连接限制,只有 5 个连接成功建立,因此仅有 50 个请求成功。
注意事项
- 目标范围:
ClientTrafficPolicy
可以应用于Gateway
或HTTPRoute
。 - 限制优化:设置合理的连接限制值,避免影响正常业务流量。
- 监控集成:结合 Prometheus 和 Grafana 等监控工具,实时跟踪和调整流量策略。
专业术语表
专业术语 | 翻译 |
---|---|
ClientTrafficPolicy | 客户端流量策略 |
ConnectionLimit | 连接限制 |
HTTPRoute | HTTP 路由 |
Gateway | 网关 |
Listener | 监听器 |
Workload | 工作负载 |