Envoy

本文基于Envoy中文文档和Envoy入门整理。

Envoy用C++开发的网络7层代理,被设计用于在大型的、服务导向的架构中做通信总线。
既可以作为应用整体的API Gateway也可以作为每个为微服务的sidecar,组成服务网格。
Envoy_第1张图片
南北流量:来自应用外部的流量
东西流量:服务内部的流量
listeners / 侦听器:类似与nginx中的server类似,面向客户端提供服务,用于接受客户端、前端的请求。
cluster:类似与nginx中的upstream servers,用于归类上游服务组。
filter:过滤器,listener内部的子组件,支持4层网络过滤器和7层网络过滤器,比如http connection manager。
filter chains:过滤器链,以流水线的方式处理请求,并向后端代理。
endpoint / 端点:和后端服务一一对应,
xDS API:从外部读入配置参数,动态生成以上资源。
Envoy_第2张图片

xDS API 术语

  • Cluster:集群是Envoy连接到一组逻辑上相似的端点
  • Downstream:下游,即Envoy的客户端,下游连接到Envoy,发送请求并接受响应
  • Upstream:上游,即Envoy代理的后端服务器,接受Envoy的连接请求并返回响应
  • Endpoint:端点,即上游主机,是一个或多个集群的成员,可用过EDS发现
  • Listener:侦听器,是下游客户端能够连接的命名网络位置,例如端口或Unix socket
  • Locality:位置,上游端点运行的区域拓扑,包括地域、区域和子区域
  • Management Server:管理服务器,实现v2 API的服务器,支持复制和分片,并且能够在不同的物理机器上实现针对不同xDS API的API服务
  • Region:地域,地理位置
  • Zone:区域
  • 子区域
  • xDS:CDS、EDS、HDS、LDS、RLS(Rate Limit)、RDS、SDS、VHD和RTD等API的总称

Envoy常见部署类型:

Envoy_第3张图片

  • Service to Service only
    • Engress listener:用于服务和应用内的其他服务通信,相当于正向代理
    • Ingress listener:用于远程Envoy和本地Envoy通信,相当于反向代理
    • External service egress listener
  • Service to Service Plus front proxy
    • 终止TLS连接
    • 支持HTTP/1.1和HTTP/2
    • HTTP L7路由
    • 通过front-Envoy的Ingress接入请求,并结合发现服务与Service to Service的Envoy网格通信
  • double proxy:目标是尽可能接近用户地终止TLS和客户端连接会更高效。
    比如跨区域大规模部署时,A地域的用户要请求B地域的边缘代理,则请求发给A地域的代理,由A地域的代理终止TLS后,通过double proxy代理给B地域的代理

Envoy线程模型

使用单进程/多线程的架构模式,一个主线程负责实现各类管理任务,一些工作线程负责执行监听、过滤和转发等代理服务器的核心功能。

  • 主线程:负责Envoy的启动和关闭、xDS API调用处理(包括DNS、健康状态检测和集群管理等)、运行时配置、统计数据刷新、管理接口维护和其他线程管理(信号和热重启等)等。所有县官时间均以异步非阻塞模式完成
  • 工作线程:默认情况下,Envoy根据主机CPU核心数创建同等数量的工作线程,但也可以通过–concurrency指定。每个工作线程运行一个非阻塞型事件循环,负责为每个侦听器监听指定的套接字、接受新请求、为每个连接初始一个过滤器栈并处理此连接整个生命周期中的所有事件
  • 文件刷写线程:Envoy写入的每个文件都有一个专用、独立的阻塞型刷写线程,当工作线程需要写入文件时,数据实际上被移入内存缓冲区,最终通过文件刷写线程同步至文件中。

Envoy连接处理

通过侦听器监听套接字并接收客户端请求,而Envoy的所有工作线程会同时共同监听用户配置的所有套接字,对于某次连接请求,由内核负责将其派发至某个具体的工作线程处理;随后相关工作线程基于特定的处理逻辑分别由相关组件一次完成连接管理。
Envoy_第4张图片
Envoy中有很多过滤器,在某一次代理中使用哪些过滤器是管理员指定的。无论四层过滤器还是七层过滤器,最重要的是route过滤器,route过滤器的目标是本地定义的cluster,cluster管理器基于某种机制把上游服务器包含进cluster,可以通过静态指定,也可以通过服务发现机制来发现后端服务器。发现机制由DNS(指定域名)、Endpoint Discovery Server(EDS)。xDS轮询EDS,EDS中定义每个cluster包含哪些服务,所以EDS中的服务改变时,Envoy可以短时间内知道。Listener也可以通过静态定义或通过Listener Discovery Server(LDS)发现。Cluster由Cluster Discovery Server(CDS)发现。Route通过Route Discovery Server(RDS)发现。TLS加密的密钥通过Secret Discovery Server(SDS)发现。

Envoy的配置方式

支持灵活的配置方式。

  • 纯静态配置:用户自行提供侦听器、过滤器链、集群以及HTTP路由,上游端点发现可以通过DNS服务进行,且配置的重载必须通过内置的热重启完成
  • 仅使用EDS:EDS提供的端点发现功能可有效规避DNS的限制
  • 使用EDS和CDS:CDS能够让Envoy以优雅的方式添加、更新和删除上游集群,于是初始配置时,无需事先了解所有上游集群
  • EDS、CDS和RDS:动态发现路由配置;RDS与EDS、CDS一起使用时,为用户提供了构建复杂路由拓扑的能力(流量转移、蓝绿部署等)
  • EDS、CDS、RDS和LDS:动态发现侦听器配置,包括内嵌的过滤器链;启用此四种发现服务后,除了较罕见的配置变动、证书轮替或更新Envoy程序外,几乎无须热启动Envoy
  • EDS、CDS、RDS、LDS和SDS:动态发现侦听器密钥相关的证书、私钥以及TLS会话票据,以及对证书验证逻辑的配置(受信任的根证书和撤销机制等)

配置中的概念

  • Bootstrap配置中的基础概念
    • node:节点标识,呈现给管理服务器用与标识目的
    • static_resource:静态配置的资源,用于配置静态的listener、cluster和secret
    • dynamic_resource:动态配置的资源,用于配置基于xDS API获取listener、cluster和secret配置的lds_config、cds_config和ads_config;
    • admin:Envoy内置的管理接口
    • tracing:分布式跟踪
    • layered_runtime:层级化的运行时,支持使用RTDS从管理服务器动态加载
    • hds_config:使用HDS从管理服务器加载上游主机健康状态检测相关的配置
    • overload_manager:过载管理器
    • stats_sinks:统计信息接收器
      启动时从Bootsrap配置文件中加载初始配置,
      支持动态配置:
  • xDS API:
    • 从配置文件加载
    • 从管理服务器基于xds协议加载
  • runtime
    • 某些关键特性(Feature flags)保存为key:value数据
    • 支持多层配置和覆盖机制
      侦听器:代理类的过滤器负责路由请求,例如tcp_proxy和http_connection_manager等。
      HTTP connection manager:虽然是L3/L4过滤器,但能够将原始字节转换为HTTP级别的消息和事件。还处理所有HTTP连接和请求共有的功能,例如访问日志记录、请求ID生成和跟踪、请求/响应头操作、路由表管理和统计信息等。
      与L3/L4过滤器堆栈相似,Envoy还支持在HTTP连接管理器中使用HTTP级过滤器堆栈,HTTP过滤器在L7运行,访问和操作HTTP请求和响应,例如gRPC-JSON Transcoder Filter为gRPC后端公开REST API,并将请求和响应转换为相应的格式。常用HTTP过滤器有Router、Rate limit、Health check、Gzip和Fault Injection等

你可能感兴趣的:(Envoy,服务网格)