Envoy架构理解--理解xDS/Listener/Cluster/Router/Filter
Envoy 是一个开源的边缘服务代理,也是 Istio Service Mesh 默认的数据平面,专为云原生应用程序设计。
与HAProxy以及Nginx等传统Proxy依赖静态配置文件来定义各种资源以及数据转发规则不同,Envoy几乎所有配置都可以通过订阅来动态获取。对应的发现服务以及各种各样的API统称为xDS。Envoy与xDS之间通过Proto约定请求和响应的数据模型,不同类型资源,对应的数据模型也不同。
1 Envoy整体架构
Envoy 的架构如图所示:
Envoy 中也可能有多个 Listener,每个 Listener 中可能会有多个 filter 组成了 chain。
Envoy 接收到请求后,会先走 FilterChain,通过各种 L3/L4/L7 Filter 对请求进行微处理,然后再路由到指定的集群,并通过负载均衡获取一个目标地址,最后再转发出去。
在Envoy中,具有最为核心的四种资源:Listener,Router,Cluster,以及Filter。
1.1 Listener:Envoy工作的基础
简单理解,Listener是Envoy打开的一个监听端口,用于接收来自Downstream(客户端)连接。Envoy可以支持复数个Listener。多个Listener之间几乎所有的配置都是隔离的。Listener配置中核心包括监听地址、Filter链等。
Listener对应的配置/资源发现服务称之为LDS。LDS是Envoy正常工作的基础,没有LDS,Envoy就不能实现端口监听(如果启动配置也没有提供静态Listener的话),其他所有xDS服务也失去了作用。
1.2 Cluster:对上游服务的抽象
在Envoy中,每个Upstream上游服务都被抽象成一个Cluster。Cluster包含该服务的连接池、超时时间、endpoints地址、端口、类型(类型决定了Envoy获取该Cluster具体可以访问的endpoint方法)等等。
Cluster对应的配置/资源发现服务称之为CDS。一般情况下,CDS服务会将其发现的所有可访问服务全量推送给Envoy。与CDS紧密相关的另一种服务称之为EDS。CDS服务负责Cluster资源的推送。而当该Cluster类型为EDS时,说明该Cluster的所有endpoints需要由xDS服务下发,而不使用DNS等去解析。下发endpoints的服务就称之为EDS。
1.3 Router:上下游之间的桥梁
Listener可以接收来自下游的连接,Cluster可以将流量发送给具体的上游服务,而Router则决定Listener在接收到下游连接和数据之后,应该将数据交给哪一个Cluster处理。它定义了数据分发的规则。虽然说到Router大部分时候都可以默认理解为HTTP路由,但是Envoy支持多种协议,如Dubbo、Redis等,所以此处Router泛指所有用于桥接Listener和后端服务(不限定HTTP)的规则与资源集合。
Route对应的配置/资源发现服务称之为RDS。Router中最核心配置包含匹配规则和目标Cluster,此外,也可能包含重试、分流、限流等等。
1.4 Filter:强大源于可扩展
Filter,通俗的讲,就是插件。通过Filter机制,Envoy提供了极为强大的可扩展能力。
利用Filter机制,Envoy理论上可以实现任意协议的支持以及协议之间的转换,可以对请求流量进行全方位的修改和定制。强大的Filter机制带来的不仅仅是强大的可扩展性,同时还有优秀的可维护性。Filter机制让Envoy的使用者可以在不侵入社区源码的基础上对Envoy做各个方面的增强。
- 网络过滤器(Network Filters): 工作在 L3/L4,是 Envoy 网络连接处理的核心,处理的是原始字节,分为 Read、Write 和 Read/Write 三类。
- HTTP 过滤器(HTTP Filters): 工作在 L7,由特殊的网络过滤器 HTTP connection manager 管理,专门处理 HTTP1/HTTP2/gRPC 请求。它将原始字节转换成 HTTP 格式,从而可以对 HTTP 协议进行精确控制。
2 配置
Envoy流程中每一个环节可以静态配置,也可以动态服务发现。
2.1 静态配置
下面的配置将所有流量代理到 baidu.com,配置完成后我们应该能够通过请求 Envoy 的端点就可以直接看到百度的主页了,而无需更改 URL 地址。
static_resources:# 1. 监听器listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 10000 }# 2. 过滤器filter_chains:- filters:- name: envoy.http_connection_managerconfig:stat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match: { prefix: "/" }route: { host_rewrite: www.baidu.com, cluster: service_baidu }http_filters:- name: envoy.router# 3. 集群clusters:- name: service_baiduconnect_timeout: 0.25stype: LOGICAL_DNSdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINhosts: [{ socket_address: { address: www.baidu.com, port_value: 443 }}]tls_context: { sni: baidu.com }# 4. 管理
admin:access_log_path: /tmp/admin_access.logaddress:socket_address: { address: 0.0.0.0, port_value: 9901 }
2.2 动态配置xDS协议(动态服务发现)
Envoy 通过查询文件或管理服务器来动态发现资源。这些发现服务及其相应的 API 被统称为 xDS。
Envoy 通过订阅(subscription)方式来获取资源,如监控指定路径下的文件、启动 gRPC 流(streaming)或轮询 REST-JSON URL。后两种方式会发送 DiscoveryRequest 请求消息,发现的对应资源则包含在响应消息 DiscoveryResponse 中。
xDS 协议是 “X Discovery Service” 的简写,这里的 “X” 表示它不是指具体的某个协议,是一组基于不同数据源的服务发现协议的总称:
- CDS:Cluster Discovery Service
- EDS:Endpoint Discovery Service
- SDS:Secret Discovery Service
- RDS:Route Discovery Service
- LDS:Listener Discovery Service
xDS 协议是由 Envoy 提出的,目前已成为服务网格的协议标准之一。
Envoy是 Istio 中默认的 sidecar 代理,但只要实现了 xDS 协议,理论上也可以作为 Istio 中的 sidecar 代理 —— 比如蚂蚁集团开源的 MOSN。
比如每个 Envoy 流以发送一个 DiscoveryRequest 开始,包括了列表订阅的资源、订阅资源对应的类型 URL、节点标识符和空的 version_info。EDS 请求示例如下:
version_info:
node: { id: envoy }
resource_names:
- foo
- bar
type_url: type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
response_nonce
管理服务器可立刻或等待资源就绪时发送 DiscoveryResponse 作为响应,示例如下:
version_info: X
resources:
- foo ClusterLoadAssignment proto encoding
- bar ClusterLoadAssignment proto encoding
type_url: type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
nonce: A
参考
Envoy 入门教程
https://www.envoyproxy.io/docs/envoy/v1.18.3/
Envoy架构理解--理解xDS/Listener/Cluster/Router/Filter相关推荐
- BlockChain:《Blockchain Gate》听课笔记——区块链的1.0架构 VS 区块链3.0架构+个人理解
BlockChain:<Blockchain Gate>听课笔记--区块链的1.0架构 VS 区块链3.0架构+个人理解 相关文章 BlockChain:<Blockchain G ...
- 云技术-SaaS架构初步理解
最近公司准备整一个SaaS的东西.有幸参入这一块东西的搭建,借着這个机会也重新好好梳理了一下对SaaS的认识.今天整理一下! 一.云计算与SaaS 说起SaaS,就得先说说云计算了.关于云计算分为三层 ...
- 阿里道延:我对技术架构的理解与架构师角色的思考
我叫道延, 2014 年加入阿里,在阿里通信工作了近两年.2016 年年底加入业务平台团队,当时 Leader 找我的第一件事就是要解决大促的问题,第二件事就是解决安全生产的问题. 我带着这个命题进入 ...
- 对微服务监控系统分层和监控架构的理解
对微服务监控系统分层和监控架构的理解 目录 微服务专栏地址 目录 1. 简介 2. 为什么需要监控体系 3. 与单体应用有什么区别 4. 要监控什么 5. 监控体系和分层 6. 监控架构和主流技术栈 ...
- 新的一年,谈谈我对技术架构的理解
作者 | 道延 责编 | 张文 来源 | 转载自阿里巴巴中间件(ID:Aliware_2018) 我叫道延, 2014 年加入阿里,在阿里通信工作了近两年.2016 年年底加入业务平台团队,当时 ...
- 我对架构的理解-概念篇
这两天和一朋友讨论这样一个问题:你认为公司的架构怎样,有哪些缺点? 其实在回答这个问题之前,有一些概念需要搞清楚,那就是什么是架构? 目前对于架构还并未有一个统 ...
- 从WebService到面向服务架构SOA理解【二】
概要: (1)通过上一篇项目的WebService搭建学习,能够有了对WebService一定的认识. (2)接下来记录自己通过对WebService的学习对面向服务架构的理解. WebService ...
- 关于linux UART驱动和tty架构的理解
关于linux UART驱动和tty架构的理解 最近要开发一个驱动程序,需要用到串口和SPI接口.平台的串口驱动程序本身在开发板中已经被实现了,也可以就这样直接使用,但是这样分开使用的结果就是在串口和 ...
- MVC三层架构简单理解
文章目录 MVC三层架构: 1.理解MVC: 2.以前的架构(只有两层): 3 MVC 三层架构: MVC三层架构: 1.理解MVC: Model view Controller 模型.视图.控制器 ...
最新文章
- 请求Get和Post对于utf-8字符的处理的考虑
- 101个脚本之linux回收站
- python:软件目录结构规范
- 【百度分享】基于内核模块的测试代码编写(二)
- Tomcat 的 Server 文件配置详解
- MD5和SHA1加密
- Crystal 语法概述[转]
- 深入理解C++中的explicit关键字
- JAVA进阶开发之(二维数组)
- Ubuntu 下无法Tab键自动补全功能解决办法
- 本田da屏怎么进wince系统_谁说思域要停产的?打脸来得不是一般的快 第十一代本田思域Prototype...
- python地图图表和3d_Python地图可视化三大秘密武器
- 起底 ARM:留给中国队的时间不多了
- plc程序ST语言接近C语言,【PLC高级编程语言之ST文本】4.ST语言的运算符介绍
- 记一次简单的burpsuite弱口令爆破实验
- dsolve函数的功能_MATLAB 求解常微分方程的函数是dsolve()。
- 106短信通道等6种常见短信通道介绍,你了解多少呢
- 运用R语言绘制小提琴图
- 使用O2OA二次开发搭建企业办公平台(十三)流程开发篇:报销审批流程表单开发
- 【C语言航路】第一站:初识C语言(三)