Envoy架构介绍与配置说明

目录

1概述

2. 基本术语

3 过滤器链

4 配置说明

4.1 管理接口配置

4.2 静态配置

4.3 动态配置

5 xDS


1概述

Envoy架构介绍与配置说明_第1张图片

Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,它是Istio中的Sidecar官方标配。由C++11编写而成,具有良好的性能。sidecar模式部署,对业务无侵入。

支持的特性包括:L3/L4层代理、HTTP代理、顶级的HTTP2.0支持、gRPC支持、服务发现、健康检查、高级负载均衡、前端/边缘代理支持、最佳的可观察性和xDS动态配置等。

Envoy架构介绍与配置说明_第2张图片

Envoy 接收到请求后,会先走 FilterChain,通过各种 L3/L4/L7 Filter 对请求进行微处理,然后再路由到指定的集群,并通过负载均衡获取一个目标地址,最后再转发出去。

其中每一个环节可以静态配置,也可以动态服务发现,也就是所谓的 xDS。这里的 x 是一个代词,代表一系列的Discovery Service。

2. 基本术语

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 的核心功能的情况下添加更多的集成功能。

3 过滤器链

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 协议进行精确控制。

    Envoy 过滤器的架构如下图所示:
    Envoy架构介绍与配置说明_第3张图片

    Filter Chain的调用顺序:

    以http为例, HttpConnectionManager在完成HTTP数据解析之后,会依次调用Http Filter提供的接口,对HTTP数据做进一步处理(简单的处理如替换header、复杂的处理如限流、错误注入、缓存等等)。Envoy丰富而强大的功能,很多都是依赖Filter来实现。大部分情况下,在对Envoy做扩展增强时,也是通过扩展Filter来做到。以Http Filter为例,实际工作流程如下图所示:

    Envoy架构介绍与配置说明_第4张图片

    Router Router是一个特殊的Filter, 它决定Listener在接收到下游连接和数据之后,应该将数据交给哪一个Cluster处理。它定义了数据分发的规则。

4 配置说明

4.1 管理接口配置

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

4.2 静态配置

Envoy架构介绍与配置说明_第5张图片

配置加载流程

如上图所示,服务启动时静态配置的解析过程如下:

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

则请求顺序为:

Envoy架构介绍与配置说明_第6张图片

响应顺序为:

Envoy架构介绍与配置说明_第7张图片

octo-proxy的静态配置:

4.3 动态配置

动态资源,是指由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

5 xDS

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配置下发流程如下图所示:

Envoy架构介绍与配置说明_第8张图片

虽然Filter本身并没有专门的xDS服务来发现配置。但Filter所有配置都是嵌入在LDS、RDS以及CDS中的,可以通过xDS影响Filter的配置。

xDS以及各个资源之间的关系如下图所示:

Envoy架构介绍与配置说明_第9张图片

官方文档: Envoy documentation — envoy 1.21.0-dev-86ddd4 documentation

中文翻译文档:说明 · Envoy proxy中文文档

envoy源码:GitHub - envoyproxy/envoy: Cloud-native high-performance edge/middle/service proxy

你可能感兴趣的:(中间件,服务器,linux,service,mesh,中间件)