动态配置
Envoy 的强大功能之一是支持动态配置。到现在为止,我们一直在使用静态配置。我们使用 static_resources
字段将监听器、集群、路由和其他资源指定为静态资源。
当使用动态配置时,我们不需要重新启动 Envoy 进程就可以生效。相反,Envoy 通过从磁盘或网络上的文件读取配置,动态地重新加载配置。动态配置使用所谓的发现服务 API,指向配置的特定部分。这些 API 也被统称为 xDS。当使用 xDS 时,Envoy 调用外部基于 gRPC/REST 的配置供应商,这些供应商实现了发现服务 API 来检索配置。
外部基于 gRPC/REST 的配置提供者也被称为控制平面。当使用磁盘上的文件时,我们不需要控制平面。Envoy 提供了控制平面的 Golang 实现,但是 Java 和其他控制平面的实现也可以使用。
Envoy 内部有多个发现服务 API。所有这些在下表中都有描述。
发现服务名称 | 描述 |
---|---|
监听器发现服务(LDS) | 使用 LDS,Envoy 可以在运行时发现监听器,包括所有的过滤器栈、HTTP 过滤器和对 RDS 的引用。 |
扩展配置发现服务(ECDS) | 使用 ECDS,Envoy 可以独立于监听器获取扩展配置(例如,HTTP 过滤器配置)。 |
路由发现服务(RDS) | 使用 RDS,Envoy 可以在运行时发现 HTTP 连接管理器过滤器的整个路由配置。与 EDS 和 CDS 相结合,我们可以实现复杂的路由拓扑结构。 |
虚拟主机发现服务(VHDS) | 使用 VHDS 允许 Envoy 从路由配置中单独请求虚拟主机。当路由配置中有大量的虚拟主机时,就可以使用这个功能。 |
宽泛路由发现服务(SRDS) | 使用 SRDS,我们可以把路由表分解成多个部分。当我们有大的路由表时,就可以使用这个 API。 |
集群发现服务(CDS) | 使用 CDS,Envoy 可以发现上游集群。Envoy 将通过排空和重新连接所有现有的连接池来优雅地添加、更新或删除集群。Envoy 在初始化时不必知道所有的集群,因为我们可以在以后使用 CDS 配置它们。 |
端点发现服务(EDS) | 使用 EDS,Envoy 可以发现上游集群的成员。 |
秘密发现服务(SDS) | 使用 SDS,Envoy 可以为其监听器发现秘密(证书和私钥,TLS 会话密钥),并为对等的证书验证逻辑进行配置。 |
运行时发现服务(RTDS) | 使用 RTDS,Envoy 可以动态地发现运行时层。 |
聚合发现服务(ADS)
表中的发现服务是独立的,有不同的 gRPC/REST 服务名称。使用聚合发现服务(ADS),我们可以使用一个单一的 gRPC 服务,在一个 gRPC 流中支持所有的资源类型(监听器、路由、集群...)。ADS 还能确保不同资源的更新顺序正确。请注意,ADS 只支持 gRPC。如果没有 ADS,我们就需要协调其他 gRPC 流来实现正确的更新顺序。
增量 gRPC xDS
每次我们发送资源更新时,我们必须包括所有的资源。例如,每次 RDS 更新必须包含每条路由。如果我们不包括一个路由,Envoy 会认为该路由已被删除。这样做更新会导致很高的带宽和计算成本,特别是当有大量的资源在网络上被发送时。Envoy 支持 xDS 的 delta 变体,我们可以只包括我们想添加 / 删除 / 更新的资源,以改善这种情况。