如何設定流量控制?

當 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