Envoy 作为一个现代的反向代理和负载均衡器,提供了高度灵活的配置管理机制。这些配置管理功能允许用户根据需要轻松地进行服务发现、动态更新以及复杂的流量管理。Envoy 支持两种主要的配置方法:静态配置和动态配置。
静态配置
静态配置是在 Envoy 启动时通过配置文件进行加载的。这种方式适用于那些不需要频繁更新的设置,如监听器、集群定义、路由规则等。静态配置的主要优点是简单和稳定,不依赖于外部服务,因此启动过程较快,适合于环境相对固定不变的场景。
静态配置示例:
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
clusters:
- name: service_a
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
hosts:
- socket_address:
address: service_a
port_value: 80
这个配置定义了一个监听器和一个服务集群,监听器在端口 10000 上监听所有接口,集群 service_a
使用 DNS 解析和轮询负载均衡。
动态配置
Envoy 支持动态配置,无需重启进程即可更新设置。配置可以通过文件从磁盘或网络动态加载,采用所谓的发现服务 API(统称为 xDS)。通过 xDS,Envoy 从实现这些 API 的外部 gRPC/REST 服务(称为 控制平面)获取配置。如果使用本地文件,则无需控制平面。
下表概述了 Envoy 提供的各种发现服务:
发现服务名称 | 描述 |
---|---|
监听器发现服务(LDS) | 动态发现监听器及其过滤器栈,引用 HTTP 过滤器和 RDS。 |
扩展配置发现服务(ECDS) | 独立于监听器动态获取扩展配置,如 HTTP 过滤器配置。 |
路由发现服务(RDS) | 动态发现整个 HTTP 路由配置,结合 EDS 和 CDS 实现复杂路由结构。 |
虚拟主机发现服务(VHDS) | 针对大量虚拟主机的单独动态请求功能。 |
宽泛路由发现服务(SRDS) | 将大型路由表分解成多个部分的功能。 |
集群发现服务(CDS) | 动态发现上游集群并优雅处理集群的添加、更新或删除。 |
端点发现服务(EDS) | 发现上游集群的成员。 |
秘密发现服务(SDS) | 发现用于监听器的秘密(如证书和密钥),配置证书验证逻辑。 |
运行时发现服务(RTDS) | 动态地发现运行时层。 |
聚合发现服务(ADS)
表中的发现服务是独立的,有不同的 gRPC/REST 服务名称。使用聚合发现服务(ADS),我们可以使用一个单一的 gRPC 服务,在一个 gRPC 流中支持所有的资源类型(监听器、路由、集群…)。ADS 还能确保不同资源的更新顺序正确。请注意,ADS 只支持 gRPC。如果没有 ADS,我们就需要协调其他 gRPC 流来实现正确的更新顺序。
增量 xDS(Delta xDS)
每次我们发送资源更新时,我们必须包括所有的资源。例如,每次 RDS 更新必须包含每条路由。如果我们不包括一个路由,Envoy 会认为该路由已被删除。这样做更新会导致很高的带宽和计算成本,特别是当有大量的资源在网络上被发送时。Envoy 支持 xDS 的 delta 变体,这是一个 gRPC 接口,我们可以只包括我们想添加 / 删除 / 更新的资源,以改善这种情况。
动态配置示例:
dynamic_resources:
lds_config:
ads: {}
cds_config:
ads: {}
ads_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: xds_cluster
这个配置启用了 LDS 和 CDS 的动态发现,使用 ADS(聚合发现服务)作为单一的配置点来管理所有的 xDS 配置更新。
来自文件系统的动态配置
Envoy 可通过文件系统直接读取动态配置。在配置中指定 node
信息和 dynamic_resources
,如下示例所示:
node:
cluster: my-cluster
id: some-id
dynamic_resources:
lds_config:
path: /etc/envoy/lds.yaml
cds_config:
path: /etc/envoy/cds.yaml
此配置允许 Envoy 在不重启的情况下,从指定文件路径动态加载监听器和集群配置。
来自控制平面的动态配置
控制平面提供了一个更复杂的动态配置方法。我们需要创建并实现 xDS 服务接口的控制平面。配置示例如下:
dynamic_resources:
lds_config:
resource_api_version: V3
api_config_source:
api_type: GRPC
transport_api_version: V3
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
cds_config:
resource_api_version: V3
api_config_source:
api_type: GRPC
transport_api_version: V3
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
static_resources:
clusters:
- name: xds_cluster
type: STATIC
load_assignment:
cluster_name: xds_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 9090
此配置通过 gRPC 将控制平面与 Envoy 实例连接,实现集中式动态配置管理。