如何配置流量控制?

流量控制可能会导致问题,例如 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