xDS 接口
2 分钟阅读
简要概述
Envoy 支持静态与动态两种配置方式,具体使用哪种根据实际情况而定。
- 静态方式:由管理员预先编写好 “yaml” 文件启动;
- 动态方式:由外部的 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)