xDS API 端点

xDS 管理服务器将根据 gRPC 和/或 REST 服务的要求实现以下端点。在 gRPC 流和 REST-JSON 两种情况下,都按照 xDS 协议 发送 DiscoveryRequest 并接收 DiscoveryResponse

下面我们描述了 v2 和 v3 传输 API 版本的端点。

gRPC 流端点

POST /envoy.api.v2.ClusterDiscoveryService/StreamClusters
POST /envoy.service.cluster.v3.ClusterDiscoveryService/StreamClusters

有关服务定义,请参见 cds.proto 。当以下内容

cds_config:
  api_config_source:
    api_type: GRPC
    transport_api_version: <V2|V3>
    grpc_services:
      envoy_grpc:
        cluster_name: some_xds_cluster

Bootstrap 配置的 dynamic_resources 中设置时,Envoy 会将其用作客户端。

POST /envoy.api.v2.EndpointDiscoveryService/StreamEndpoints
POST /envoy.service.endpoint.v3.EndpointDiscoveryService/StreamEndpoints

有关服务定义,请参见 eds.proto 。当以下内容

eds_config:
  api_config_source:
    api_type: GRPC
    transport_api_version: <V2|V3>
    grpc_services:
      envoy_grpc:
        cluster_name: some_xds_cluster

Cluster 配置的 eds_cluster_config 字段中设置时,Envoy 会将其用作客户端。

POST /envoy.api.v2.ListenerDiscoveryService/StreamListeners
POST /envoy.service.listener.v3.ListenerDiscoveryService/StreamListeners

有关服务定义,请参见 lds.proto 。当以下内容

lds_config:
  api_config_source:
    api_type: GRPC
    transport_api_version: <V2|V3>
    grpc_services:
      envoy_grpc:
        cluster_name: some_xds_cluster

Bootstrap 配置的 dynamic_resources 中设置时,Envoy 会将其用作客户端。

POST /envoy.api.v2.RouteDiscoveryService/StreamRoutes
POST /envoy.service.route.v3.RouteDiscoveryService/StreamRoutes

有关服务定义,请参见 rds.proto 。当以下内容

route_config_name: some_route_name
config_source:
  api_config_source:
    api_type: GRPC
    transport_api_version: <V2|V3>
    grpc_services:
      envoy_grpc:
        cluster_name: some_xds_cluster

HttpConnectionManager 配置的 rds 字段中设置时,Envoy 会将其用作客户端。

POST /envoy.api.v2.ScopedRoutesDiscoveryService/StreamScopedRoutes
POST /envoy.service.route.v3.ScopedRoutesDiscoveryService/StreamScopedRoutes

有关服务定义,请参见 srds.proto 。当以下内容

name: some_scoped_route_name
scoped_rds:
  config_source:
    api_config_source:
      api_type: GRPC
      transport_api_version: <V2|V3>
      grpc_services:
        envoy_grpc:
          cluster_name: some_xds_cluster

HttpConnectionManager 配置的 scoped_routes 字段中设置时,Envoy 会将其用作客户端。

POST /envoy.service.discovery.v2.SecretDiscoveryService/StreamSecrets
POST /envoy.service.secret.v3.SecretDiscoveryService/StreamSecrets

有关服务定义,请参见 sds.proto 。当以下内容

name: some_secret_name
config_source:
  api_config_source:
    api_type: GRPC
    transport_api_version: <V2|V3>
    grpc_services:
      envoy_grpc:
        cluster_name: some_xds_cluster

SdsSecretConfig 消息中设置时, Envoy 会将其用作客户端。这种消息在各种地方都使用,如 CommonTlsContext

POST /envoy.service.discovery.v2.RuntimeDiscoveryService/StreamRuntime
POST /envoy.service.runtime.v3.RuntimeDiscoveryService/StreamRuntime

有关服务定义,请参见 rtds.proto 。当以下内容

name: some_runtime_layer_name
config_source:
  api_config_source:
    api_type: GRPC
    transport_api_version: <V2|V3>
    grpc_services:
      envoy_grpc:
        cluster_name: some_xds_cluster

rtds_layer 字段中设置时,Envoy 会将其用作客户端。

REST 端点

POST /v2/discovery:clusters
POST /v3/discovery:clusters

有关服务定义,请参见 cds.proto 。当以下内容

cds_config:
  api_config_source:
    api_type: REST
    transport_api_version: <V2|V3>
    cluster_names: [some_xds_cluster]

Bootstrap 配置的 dynamic_resources 中设置时,Envoy 会将其用作客户端。

POST /v2/discovery:endpoints
POST /v3/discovery:endpoints

有关服务定义,请参见 eds.proto 。当以下内容

eds_config:
  api_config_source:
    api_type: REST
    transport_api_version: <V2|V3>
    cluster_names: [some_xds_cluster]

Cluster 配置的 eds_cluster_config 字段中设置时,Envoy 会将其用作客户端。

POST /v2/discovery:listeners
POST /v3/discovery:listeners

有关服务定义,请参见 lds.proto 。当以下内容

lds_config:
  api_config_source:
    api_type: REST
    transport_api_version: <V2|V3>
    cluster_names: [some_xds_cluster]

Bootstrap 配置的 dynamic_resources 中设置时,Envoy 会将其用作客户端。

POST /v2/discovery:routes
POST /v3/discovery:routes

有关服务定义,请参见 rds.proto 。当以下内容

route_config_name: some_route_name
config_source:
  api_config_source:
    api_type: REST
    transport_api_version: <V2|V3>
    cluster_names: [some_xds_cluster]

HttpConnectionManager 配置的 rds 字段中设置时,Envoy 会将其用作客户端。

Note

响应这些端点的管理服务器必须以 DiscoveryResponse 和 HTTP 状态 200 进行响应。此外,如果提供的配置未更改(如 Envoy 客户端提供的版本所示),则管理服务器可以响应具有空的正文,HTTP 状态为 304。

聚合发现服务

尽管 Envoy 从根本上采用了最终的一致性模型,但 ADS 提供了对 API 更新推送进行排序的机会,并确保单个管理服务器对 Envoy 节点的 API 更新具有亲和力。ADS 允许管理服务器在单个,双向 gRPC 流上交付一个或多个 API 及其资源。否则,某些 API(例如 RDS 和 EDS)可能需要管理多个流以及与不同管理服务器的连接。

ADS 将允许通过适当的顺序进行无中断的配置更新。例如,假设 foo.com 被映射到集群 X。我们希望在路由表来改变 foo.com 映射到集群 Y。为此,必须首先交付包含集群 X 和集群 Y 的 CDS/EDS 更新。

如果没有ADS,CDS/EDS/RDS 流可能指向不同的管理服务器,或者指向同一管理服务器上需要协调的不同 gRPC 流/连接。EDS 资源请求可以分为两个不同的流,一个用于 X,另一个用于 Y。ADS 允许将它们合并到单个管理服务器的单个流中,而无需进行分布式同步来正确地对更新进行排序。如果有 ADS,管理服务器将在单个流上交付 CDS,EDS 和 RDS 的更新。

ADS 仅可用于 gRPC 流式传输(不适用于 REST),并且在 xDS 文档中有更完整的描述。gRPC 端点是:

POST /envoy.service.discovery.v2.AggregatedDiscoveryService/StreamAggregatedResources
POST /envoy.service.discovery.v3.AggregatedDiscoveryService/StreamAggregatedResources

有关服务定义,请参见 discovery.proto 。当以下内容

ads_config:
  api_type: GRPC
  transport_api_version: <V2|V3>
  grpc_services:
    envoy_grpc:
      cluster_name: some_ads_cluster

Bootstrap 配置的 dynamic_resources 中设置时,Envoy 会将其用作客户端。

设置此选项后,可以将 以上 任何配置源设置为使用 ADS 通道。例如,可以将 LDS 配置从

lds_config:
  api_config_source:
    api_type: REST
    cluster_names: [some_xds_cluster]

改为

lds_config: {ads: {}}

结果是 LDS 流将通过共享的 ADS 通道定向到 some_ads_cluster

Delta 端点

REST,文件系统和原始 gRPC xDS 实现都提供全量更新:每个 CDS 更新都必须包含每个集群,更新中没有集群意味着集群已消失。对于具有大量资源甚至是少量流失的 Envoy 部署,这些最新状态的更新可能很麻烦。

从 1.12.0 版开始, Envoy 支持 xDS(包括 ADS)的“delta”变体, 其中更新仅包含添加/更改/删除的资源。Delta xDS 是 gRPC (仅) 协议。Delta 使用与 SotW(DeltaDiscovery {Request,Response})不同的请求/响应 proto;请参阅 discovery.proto 。从概念上讲,应将 delta 视为一种新的 xDS 传输类型:存在静态,文件系统,REST,gRPC-SotW 和现在的 gRPC-delta。(Envoy 的 gRPC-SotW/delta 客户端实现恰好在两者之间共享了大部分代码,并且在服务器端可能有类似的可能。但是,它们实际上是不兼容的协议。delta xDS 协议行为的规范在这里。)

要使用 delta,只需将你 ApiConfigSource 上原始 api_type 字段设置为 DELTA_GRPC。这对 xDS 和 ADS 都适用;对于 ADS,它是 DynamicResources.ads_config 的 api_type 字段 ,如上一节所述。