虚拟主机发现服务 (VHDS)

虚拟主机发现服务 (VHDS) API 是一种可选的 API,Envoy 会调用它来动态获取 虚拟主机。虚拟主机包括一个名称和一组域名,根据传入请求的 Host 头部对其进行路由。

在 RDS 中,默认情况下,集群的所有路由都会发送到网格中的每个 Envoy 实例。随着集群规模的增长,这会导致扩展问题。大部分复杂性都存在于虚拟主机配置中,其中大部分对于任何单个代理来说都是不必要的。

为了解决此问题,虚拟主机发现服务 (VHDS) 协议使用 delta xDS 协议来允许订阅路由配置,并在需要时请求必要的虚拟主机。使用 VHDS 时,不会发送所有带有路由配置的虚拟主机,而是允许 Envoy 实例订阅和取消订阅 xDS 管理服务器内部存储的虚拟主机列表。xDS 管理服务器将监视此列表,并使用它来过滤发送到单个 Envoy 实例的配置,以使其仅包含已订阅的虚拟主机。

虚拟主机资源命名约定

VHDS 中的虚拟主机通过属于该虚拟主机的路由配置的名称以及 HTTP host 头部 (HTTP2 为 :authority) 条目来标识。资源的命名方式如下

<route configuration name>/<host entry>

请注意,匹配应该从右到左进行,因为主机条目不能包含斜杠,而路由配置名称可以。

订阅资源

VHDS 允许使用 订阅 资源,使用 DeltaDiscoveryRequest,其中 type_url 设置为 type.googleapis.com/envoy.config.route.v3.VirtualHost,并且 resource_names_subscribe 设置为它希望配置的虚拟主机资源名称列表。

如果无法解析 Host/authority 头部内容的路由,则会暂停活动流,同时发送 DeltaDiscoveryRequest。当收到 DeltaDiscoveryResponse 时,其中响应中的一个 别名名称resource_names_subscribe 中的条目完全匹配,DeltaDiscoveryRequest,路由配置将被更新,流将恢复,并且过滤器链的处理将继续进行。

虚拟主机更新以两种方式发生。如果最初通过 RDS 发送了虚拟主机,则应通过 RDS 更新虚拟主机。如果通过 VHDS 订阅了虚拟主机,则更新将通过 VHDS 进行。

当路由配置条目更新时,如果 vhds 字段 已更改,则该路由配置的虚拟主机表将被清除,这将要求再次发送所有虚拟主机。

与作用域 RDS 的兼容性

VHDS 不应与 作用域 RDS 存在任何兼容性问题。路由配置名称仍然可以用于虚拟主机匹配,但如果配置了作用域 RDS,它将指向作用域路由配置。

但是,需要注意的是,同时使用按需 作用域 RDS 和 VHDS 将需要对每个路由范围进行两次按需订阅。

统计信息

VHDS 具有以 http.<stat_prefix>.vhds.<virtual_host_name>. 为根的统计信息树。:virtual_host_name 名称中的任何字符都会在统计信息树中被替换为 _。统计信息树包含以下统计信息

名称

类型

说明

config_reload

计数器

由于不同的配置导致配置重新加载的总 API 获取次数

empty_update

计数器

接收到的空更新的总数