Envoy 中的 Listener 是定义如何接收入站连接的基础组件,它决定了 Envoy 如何处理入站数据流。Listener 是配置的核心部分,可以高度自定义以满足各种网络和应用需求。本文将详细介绍 Envoy 中的 Listener 组件,其功能和如何配置它们。
Listener 的功能
在 Envoy 中,Listener 负责监听网络端口上的入站连接。每个 Listener 可以配置一系列的过滤器链(Filter Chains),这些过滤器链定义了对通过该 Listener 的数据进行处理的规则。这种架构提供了处理各种网络协议的灵活性,使得 Envoy 可以用作 HTTP/HTTPS 服务、TCP 代理,甚至是更复杂的用例如 MongoDB 或 DynamoDB 代理。
主要特性
Envoy 的 Listener 配置具有以下主要特性:
-
多协议支持: Listener 可以配置为处理多种协议,包括 TCP 和 HTTP。对于 HTTP Listener,Envoy 使用 HTTP 连接管理器过滤器来详细控制 HTTP 协议的行为。
-
过滤器链: Listener 可以配置一个或多个过滤器链,每个链根据特定条件(如安全传输层属性)选择适用的过滤器配置。这使得可以在同一个端口上处理多种类型的流量。
-
安全特性: Listener 支持 TLS 加密,包括自动的 TLS 协商以及多种证书管理功能,确保数据传输的安全。
-
高级路由功能: 通过整合 HTTP 连接管理器,Listener 可以执行复杂的路由决策、重定向、重写和增强的负载均衡。
配置示例
以下是一个基础的 Envoy Listener 配置示例,它定义了一个监听端口 80 的 HTTP Listener,并配置了一个基本的 HTTP 连接管理器过滤器:
static_resources:
listeners:
- name: main_listener
address:
socket_address: { address: 0.0.0.0, port_value: 80 }
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
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: service_cluster }
http_filters:
- name: envoy.filters.http.router
动态监听功能
Envoy 支持动态监听器配置,允许运行时添加、修改或删除 Listener 而不需要重启代理。这通过 Listener Discovery Service (LDS) 实现,是 xDS API 的一部分,使得 Listener 配置可以从远程管理服务动态获取。