xDS 接口

简要概述

Envoy 支持静态与动态两种配置方式,具体使用哪种根据实际情况而定。

  1. 静态方式:由管理员预先编写好 “yaml” 文件启动;
  2. 动态方式:由外部的 grpc 或 http 服务提供 API 接口,这些接口称为 xDS(发现服务)。
xDS 类型
LDS envoy.config.listener.v3.Listener
RDS envoy.config.route.v3.RouteConfiguration
x envoy.config.route.v3.ScopedRouteConfiguration
VHDS envoy.config.route.v3.VirtualHost
CDS []envoy.config.cluster.v3.Cluster
EDS envoy.config.endpoint.v3.ClusterLoadAssignment
x envoy.extensions.transport_sockets.tls.v3.Secret
x envoy.service.runtime.v3.Runtime

静态方式

在完全静态的配置中,实施者提供一组监听器(和过滤器链)、集群等。动态主机发现仅通过基于DNS的服务发现实现。配置重载必须通过内置的热重启机制进行。

尽管这种方式相对简单,但可以使用静态配置和优雅的热重启创建相当复杂的部署。这种方法适用于一些场景,尤其是在环境相对静态、变化不频繁的情况下。

动态方式

端点发现服务(EDS)

端点发现服务(Endpoint Discovery Service (EDS) API),相比在静态配置中使用 DNS 实现动态主机发现,但 EDS 更灵活可自定义性强。

eds.proto 服务定义:

service EndpointDiscoveryService {
  option (envoy.annotations.resource).type = "envoy.config.endpoint.v3.ClusterLoadAssignment";

  // The resource_names field in DiscoveryRequest specifies a list of clusters
  // to subscribe to updates for.
  rpc StreamEndpoints(stream discovery.v3.DiscoveryRequest)
      returns (stream discovery.v3.DiscoveryResponse) {
  }

  rpc DeltaEndpoints(stream discovery.v3.DeltaDiscoveryRequest)
      returns (stream discovery.v3.DeltaDiscoveryResponse) {
  }

  rpc FetchEndpoints(discovery.v3.DiscoveryRequest) returns (discovery.v3.DiscoveryResponse) {
    option (google.api.http).post = "/v3/discovery:endpoints";
    option (google.api.http).body = "*";
  }
}

在 envoy 的 cluster 中使用:

static_resources:
  ......

  clusters:
  - name: xds_cluster
    type: EDS
    eds_cluster_config:
      eds_config:
        resource_api_version: V3
  ......

示例配置见 上游集群 / EDS

集群发现服务(CDS)

集群发现服务 (CDS) API (Cluster Discovery Service (CDS) API)

cds.proto

// Return list of all clusters this proxy will load balance to.
service ClusterDiscoveryService {
  option (envoy.annotations.resource).type = "envoy.config.cluster.v3.Cluster";

  rpc StreamClusters(stream discovery.v3.DiscoveryRequest)
      returns (stream discovery.v3.DiscoveryResponse) {
  }

  rpc DeltaClusters(stream discovery.v3.DeltaDiscoveryRequest)
      returns (stream discovery.v3.DeltaDiscoveryResponse) {
  }

  rpc FetchClusters(discovery.v3.DiscoveryRequest) returns (discovery.v3.DiscoveryResponse) {
    option (google.api.http).post = "/v3/discovery:clusters";
    option (google.api.http).body = "*";
  }
}

在 envoy 的 dynamic_resources 中使用:

......
static_resources:
  ......

dynamic_resources:
  cds_config:
    resource_api_version: V3
    api_config_source:
      api_type: REST
      transport_api_version: V3
      refresh_delay: 2s
      cluster_names:
      - xds-cluster

......

路由发现服务(RDS)

路由发现服务 (RDS) API

rcs.proto

service RouteDiscoveryService {
  option (envoy.annotations.resource).type = "envoy.config.route.v3.RouteConfiguration";

  rpc StreamRoutes(stream discovery.v3.DiscoveryRequest)
      returns (stream discovery.v3.DiscoveryResponse) {
  }

  rpc DeltaRoutes(stream discovery.v3.DeltaDiscoveryRequest)
      returns (stream discovery.v3.DeltaDiscoveryResponse) {
  }

  rpc FetchRoutes(discovery.v3.DiscoveryRequest) returns (discovery.v3.DiscoveryResponse) {
    option (google.api.http).post = "/v3/discovery:routes";
    option (google.api.http).body = "*";
  }
}

在 envoy 的 HttpConnectionManager 中使用:

...

static_resources:
  listeners:
  - name: listener_0
    address:

    ......

    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          rds:
            route_config_name: test-route-1
            config_source: 
              resource_api_version: V3
              api_config_source:
                api_type: REST
                transport_api_version: V3
                refresh_delay: 2s
                cluster_names:
                - xds-cluster
...

虚拟主机发现服务(VHDS)

TODO;

虚拟主机发现服务 Virtual Host Discovery Service

在 envoy 的 route.proto 中 “vhds” 使用:

虚拟主机发现服务(VHDS)协议使用增量xDS协议。

路由发现服务(SRDS)

TODO;

侦听器发现服务(LDS)

TODO;

lds.proto 服务定义:

service ListenerDiscoveryService {
  option (envoy.annotations.resource).type = "envoy.config.listener.v3.Listener";

  rpc DeltaListeners(stream discovery.v3.DeltaDiscoveryRequest)
      returns (stream discovery.v3.DeltaDiscoveryResponse) {
  }

  rpc StreamListeners(stream discovery.v3.DiscoveryRequest)
      returns (stream discovery.v3.DiscoveryResponse) {
  }

  rpc FetchListeners(discovery.v3.DiscoveryRequest) returns (discovery.v3.DiscoveryResponse) {
    option (google.api.http).post = "/v3/discovery:listeners";
    option (google.api.http).body = "*";
  }
}

密钥发现服务(SDS)

TODO;

运行时发现服务(RTDS)

TODO;

扩展配置发现服务(ECDS)

TODO;




最后修改 2024.02.06: docs: update xds (a7a4a38)