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 实例连接,实现集中式动态配置管理。

最后更新于 2024/11/27