如何配置流量控制?
流量控制可能会导致问题,例如 Envoy 使用非流式 L7 过滤器,并且请求或响应主体超过 L7 缓冲区限制。对于必须缓冲并且超过配置限制的请求,Envoy 将向用户提供 413 并递增 downstream_rq_too_large 指标。在响应路径上,如果必须缓冲响应主体并且超过限制,Envoy 将递增 rs_too_large 指标,并在响应中间断开连接(如果标题已发送到下游)或发送 500 响应。
有三个旋钮用于配置 Envoy 流量控制:监听器限制、集群限制 和 http2 流限制
监听器限制适用于从下游每次 read() 调用读取多少原始数据,以及在下游和 Envoy 之间用户空间中可能缓冲多少数据。
监听器限制也会传播到 HttpConnectionManager,并应用于每个流的基础上,用于下面描述的 HTTP/1.1 L7 缓冲区。因此,它们限制了可以缓冲的 HTTP/1 请求和响应主体的尺寸。对于 HTTP/2 和 HTTP/3,由于多个流可以复用在一个连接上,因此可以分别调整 L7 和 L4 缓冲区限制,并且配置选项 http2 流限制 应用于所有 L7 缓冲区。请注意,对于所有版本的 HTTP,Envoy 可以并且将代理任意大的主体,前提是在所有 L7 过滤器都是流式的情况下,但许多过滤器(如转码器或缓冲区过滤器)需要缓冲完整的 HTTP 主体,因此根据监听器限制来限制请求和响应的大小。
集群限制影响从上游每次 read() 调用读取多少原始数据,以及在上游和 Envoy 之间用户空间中可能缓冲多少数据。
以下代码块显示了如何调整上面提到的所有三个字段,但通常只需要修改监听器 per_connection_buffer_limit_bytes
static_resources:
listeners:
name: http
address:
socket_address:
address: '::1'
portValue: 0
filter_chains:
filters:
name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
http2_protocol_options:
initial_stream_window_size: 65535
route_config: {}
codec_type: HTTP2
http_filters: []
stat_prefix: config_test
per_connection_buffer_limit_bytes: 1024
clusters:
name: cluster_0
connect_timeout: 5s
per_connection_buffer_limit_bytes: 1024
load_assignment:
cluster_name: some_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: ::1
port_value: 46685