目录
1概述
2. 基本术语
3 过滤器链
4 配置说明
4.1 管理接口配置
4.2 静态配置
4.3 动态配置
5 xDS
Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,它是Istio中的Sidecar官方标配。由C++11编写而成,具有良好的性能。sidecar模式部署,对业务无侵入。
支持的特性包括:L3/L4层代理、HTTP代理、顶级的HTTP2.0支持、gRPC支持、服务发现、健康检查、高级负载均衡、前端/边缘代理支持、最佳的可观察性和xDS动态配置等。
Envoy 接收到请求后,会先走 FilterChain,通过各种 L3/L4/L7 Filter 对请求进行微处理,然后再路由到指定的集群,并通过负载均衡获取一个目标地址,最后再转发出去。
其中每一个环节可以静态配置,也可以动态服务发现,也就是所谓的 xDS。这里的 x 是一个代词,代表一系列的Discovery Service。
Host:能够进行网络通信的实体(在手机或服务器等上的应用程序)。在 Envoy 中主机是指逻辑网络应用程序。只要每台主机都可以独立寻址,一块物理硬件上就运行多个主机。
Downstream:下游(downstream)主机连接到 Envoy,发送请求并或获得响应。
Upstream:上游(upstream)主机获取来自 Envoy 的链接请求和响应。
Cluster: 集群(cluster)是 Envoy 连接到的一组逻辑上相似的上游主机。Envoy 通过服务发现发现集群中的成员。Envoy 可以通过主动运行状况检查来确定集群成员的健康状况。Envoy 如何将请求路由到集群成员由负载均衡策略确定。
运行时配置:与 Envoy 一起部署的带外实时配置系统。可以在无需重启 Envoy 或 更改 Envoy 主配置的情况下,通过更改设置来影响操作。
Listener/监听器:监听器是命名网络地址(例如,端口、unix domain socket等),可以被下游客户端连接。Envoy 暴露一个或者多个监听器给下游主机连接。
监听器过滤器 (Listener filter) :Listener 使用 listener filter(监听器过滤器)来操作链接的元数据。它的作用是在不更改 Envoy 的核心功能的情况下添加更多的集成功能。
Listener 的核心就是过滤器链(FilterChain),链中每个过滤器都能够控制流量的处理流程。过滤器链中的过滤器分为两个类别:
网络过滤器(Network Filters): 工作在 L3/L4,是 Envoy 网络连接处理的核心,处理的是原始字节,分为 Read、Write 和 Read/Write 三类。
HTTP/L7 过滤器(HTTP Filters): 工作在 L7,HTTP过滤器由特殊的网络过滤器 HTTP connection manager 管理,专门处理 HTTP1/HTTP2/gRPC 请求。它将原始字节转换成 HTTP 格式,从而可以对 HTTP 协议进行精确控制。
Filter Chain的调用顺序:
以http为例, HttpConnectionManager在完成HTTP数据解析之后,会依次调用Http Filter提供的接口,对HTTP数据做进一步处理(简单的处理如替换header、复杂的处理如限流、错误注入、缓存等等)。Envoy丰富而强大的功能,很多都是依赖Filter来实现。大部分情况下,在对Envoy做扩展增强时,也是通过扩展Filter来做到。以Http Filter为例,实际工作流程如下图所示:
Router Router是一个特殊的Filter, 它决定Listener在接收到下游连接和数据之后,应该将数据交给哪一个Cluster处理。它定义了数据分发的规则。
admin:
access_log_path: /var/logs/admin.log #(required, string) 管理服务器的访问日志的路径。如果不需要访问日志,则指定"/dev/null"。
profile_path: /var/logs/profile #(optional, string) 管理服务器的cpu分析器的文件路径。如果配置未指定,则默认路径为"/var/log/envoy/envoy.prof"
address: #(required, string) 管理服务器将监听的地址,可以为socket地址也可以为uds。
socket_address: { address: 0.0.0.0, port_value: 8888}
管理接口的使用说明参见 Administration interface — envoy 1.21.0-dev-86ddd4 documentation
配置加载流程
如上图所示,服务启动时静态配置的解析过程如下:
1.读取listeners配置,监听socket地址或者uds(unix domain socket)
2.读取filter_chains配置,创建L4级Network Filters,这里是 envoy.http_connection_manager
3.读取L7级Filters配置,这里是http_filters,根据各个filter的配置创建对应filter的回调函数供http_connection_manager回调。根据各个filter实现的不同,会挂载到decoder_filters链或encoder_filters链
4.router filter作为一种特殊的filter还会读取route_config,以获取路由配置
请求解析与处理流程
当有下游请求连接时,filter_chains的处理流程如下:
1.匹配对应的listener
2.listener依次调用自己的filter_chains
3.解析数据头,根据decoder_filters链创建decoder filters 并依次调用
4.在调用router filter(一种特殊的decoder filter)时根据route_config匹配到对应的route信息
5.根据route信息找到对应的cluster
6.根据cluster的负载均衡策略选取end point
7.通过连接池建立与上游主机的连接,并发送请求
请求响应流程:
1.接收到请求响应之后,解析数据头
2.回调router filter中的请求响应回调函数
3.根据encoder_filters配置调用encoder filters
4.向下游主机发送响应
filter 调用示例
有如下filter chain
则请求顺序为:
响应顺序为:
octo-proxy的静态配置:
动态资源,是指由envoy通过xDS协议发现所需要的各项配置的机制,相关的配置信息保存于管理服务器Pilot的主机上,经由xDS API向外暴露;下面是一个动态资源的示例:
dynamic_resources:
cds_config:
ads: {}
resource_api_version: V3
initial_fetch_timeout: 0s
ads_config:
api_type: DELTA_GRPC # api类型 string,REST_LEGACY/REST/GRPC"
transport_api_version: V3 #api版本
grpc_services: # string,只用于GRPC,可以配置多个
- envoy_grpc:
cluster_name: xds_grpc #cluster名称,可以指向static_resources中的一个cluster
xDS 是一个关键概念,它是一类发现服务的统称,其包括如下几类:
CDS:Cluster Discovery Service 用于动态发现上游cluster信息
EDS:Endpoint Discovery Service 用于动态发现服务端点
SDS:Secret Discovery Service 用于动态发现证书
RDS:Route Discovery Service 用于发现路由配置
LDS:Listener Discovery Service 用于动态发现Listener
Envoy通过xDS协议与控制面实现配置数据的交换,Envoy配置下发流程如下图所示:
虽然Filter本身并没有专门的xDS服务来发现配置。但Filter所有配置都是嵌入在LDS、RDS以及CDS中的,可以通过xDS影响Filter的配置。
xDS以及各个资源之间的关系如下图所示:
官方文档: Envoy documentation — envoy 1.21.0-dev-86ddd4 documentation
中文翻译文档:说明 · Envoy proxy中文文档
envoy源码:GitHub - envoyproxy/envoy: Cloud-native high-performance edge/middle/service proxy