内部侦听器

Envoy 支持用户空间套接字,允许从上游集群到侦听器建立 TCP 流,而无需使用系统网络 API。接受用户空间连接的侦听器称为内部侦听器。内部侦听器 名称 标识客户端的服务器 内部地址

要利用内部侦听器,需要联合配置几个组件。首先,引导程序扩展 必须启用。此扩展注册一个客户端连接工厂,允许内部侦听器接受来自 Envoy 内部的连接。其次,必须定义一个内部侦听器

name: internal_listener
internal_listener: {}
filter_chains:
- filters: []

第三,上游集群必须包含一个端点,该端点具有一个通过名称引用内部侦听器的内部地址

name: cluster_0
load_assignment:
  cluster_name: cluster_0
  endpoints:
  - lb_endpoints:
    - endpoint:
        address:
          envoy_internal_address:
            server_listener_name: internal_listener

内部上游传输

内部上游传输 扩展通过用户空间套接字启用从下游侦听器到内部侦听器的过滤器状态交换。此附加状态可以是来自上游主机获得的资源元数据形式,或者 过滤器状态对象。这是一个可选扩展,可以添加到具有内部地址的上游集群中。

此扩展发出以下统计信息

名称

类型

描述

no_metadata

计数器

元数据键在导入位置不存在。

端点消歧

如果单个上游集群中有多个端点引用同一个内部侦听器,请使用 端点 ID 字段 来改进集群池中的更改跟踪。此字段与内部侦听器名称结合起来唯一地标识池中的端点。例如,如果多个端点使用不同的上游主机元数据,则该字段的值应是主机元数据的哈希值或不同值。对于隧道内部侦听器,该值应是传播到内部侦听器的实际目标地址。

示例

简单链接

一个最小示例,它链接两个 TCP 代理,通过内部侦听器将来自端口 9999 的连接转发到端口 10000,可以找到 这里

将 HTTP GET 请求封装在 HTTP CONNECT 请求中

目前 Envoy HTTP 连接管理器 无法代理上游 HTTP CONNECT 请求中的 GET 请求。可以通过将 HTTP 连接管理器的上游端点设置为内部侦听器地址来完成此要求。同时,另一个绑定到上述侦听器地址的内部侦听器包含一个具有 隧道配置 的 TCP 代理。

一个示例配置可以找到 这里

解封装 CONNECT 请求

跨服务或边缘存在一些复杂的 GET-in-CONNECT 请求。为了在 Envoy 中代理 GET 请求,需要两层 HTTP 连接管理器。第一层 HTTP 连接管理器从 CONNECT 请求中提取 TCP 流,并将 TCP 流重定向到第二层 HTTP 连接管理器以解析常见的 GET 请求。

一个示例配置可以找到 这里

以上两个示例可以如下一起测试

  • bazel-bin/source/exe/envoy-static --config-path configs/encapsulate_http_in_http2_connect.yaml --disable-hot-restart

  • bazel-bin/source/exe/envoy-static --config-path configs/terminate_http_in_http2_connect.yaml --disable-hot-restart.

  • curl 127.0.0.1:10000