如何設定流量控制?
當 Envoy 使用非串流的 L7 過濾器,且請求或回應主體超出 L7 緩衝區限制時,流量控制可能會導致問題。對於必須緩衝且超出設定限制的請求,Envoy 將向使用者提供 413 錯誤,並遞增 downstream_rq_too_large 指標。在回應路徑上,如果回應主體必須緩衝且超出限制,Envoy 將遞增 rs_too_large 指標,並在回應中斷連線(如果標頭已發送到下游)或發送 500 回應。
有三個旋鈕用於設定 Envoy 流量控制:監聽器限制、叢集限制 和 http2 串流限制
監聽器限制適用於每次從下游讀取()呼叫中讀取的原始資料量,以及在 Envoy 與下游之間可能在使用者空間中緩衝的資料量。
監聽器限制也會傳遞到 HttpConnectionManager,並在每個串流的基礎上應用於以下描述的 HTTP/1.1 L7 緩衝區。因此,它們限制了可以緩衝的 HTTP/1 請求和回應主體的大小。對於 HTTP/2 和 HTTP/3,由於許多串流可以在一個連線上進行多工處理,因此可以單獨調整 L7 和 L4 緩衝區限制,並且配置選項 http2 串流限制 將應用於所有 L7 緩衝區。請注意,對於所有版本的 HTTP,Envoy 都可以且將會代理任意大小的主體,這些主體位於所有 L7 過濾器都在串流的路由上,但許多過濾器(如轉碼器或緩衝區過濾器)需要緩衝完整的 HTTP 主體,因此請根據監聽器限制來限制請求和回應的大小。
叢集限制會影響每次從上游讀取()呼叫中讀取的原始資料量,以及在 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