xDS协议

news2024/12/24 10:50:55

xDS

xDS协议是"X Discovery Service",这里的X表示它不是指具体的某个协议,是一组基于不同数据源的服务发现协议的总称,包括CDS,LDS,EDS,RDS和SDS等。客户端可以用噶多种方式获取数据资源,比如监听指定文件,订阅gRPC stream以及轮询相应的REST API等。

这个协议是Envoy规定的,Envoy是一个数据面,这个控制面实现了xDS的都可以叫做服务网格体系。Istio就是一个典型的例子,我们后续的讲解都将围绕Istio来进行。

在 Istio 架构中,基于 xDS 协议提供了标准的控制面规范,并以此向数据面传递服务信息和治理规则。在 Envoy 中,xDS 被称为数据平面 API,并且担任控制平面 Pilot 和数据平面 Envoy 的通信协议,同时这些 API 在特定场景里也可以被其他代理所使用。

xDS协议介绍

在 Pilot 和 Envoy 通信的场景中,xDS 协议是基于 gRPC 实现的传输协议,即 Envoy 通过 gRPC streaming 订阅 Pilot 的资源配置。Pilot 借助 ADS 对 API 更新推送排序的能力,按照 CDS-EDS-LDS-RDS 的顺序串行分发配置。

xDS 交互

这个图里面有一个名字叫做MCP,这里我来介绍一下MCP这个东西是什么:

MCP是Istio中的一个组件,它代码网格配置协议,用于在Istio控制平面中传递和同步配置信息,包括路由规则,策略配置和其他网络配置。

MCP 主要用于控制平面的组件之间进行配置信息的交互和同步。它通过 gRPC 接口提供了一种标准化的协议,用于配置更新的传输和处理。MCP 的主要作用是实现控制平面组件之间的配置一致性和同步,确保所有组件都具有相同的配置视图。

ADS可以将xDS所有的协议都聚合到一起,即上文提到的 CDS、EDS、LDS 和 RDS 等,Envoy 通过这些 API 可以动态地从 Pilot 获取对 Cluster(集群)、Endpoint(集群成员)、Listener(监听器)和 Route(路由)等资源的配置。下表整理了主要的 xDS API:

  • CDS:集群发现服务
  • EDS:集群成员发现服务
  • LDS:监听器发现服务
  • RDS:路由发现服务

CDS

Envoy使用它在进行路由的时候发现上游Cluster。Envoy通常会优雅的添加,更新和删除Cluster。有了CDS协议,Envoy在初次启动的时候不一定要感知拓扑里面所有的上游Cluster。在做路由HTTP请求的时候通过HTTP请求头里面添加Cluster信息实现请求转发。

EDS

EDS 即 Endpoint Discovery Service 的缩写。在 Envoy 术语中,Endpoint 即 Cluster 的成员。Envoy 通过 EDS API 可以更加智能地动态获取上游 Endpoint。

LDS

基于此,Envoy 可以在运行时发现所有的 Listener,包括 L3 和 L4 filter 等所有的 filter 栈,并由此执行各种代理工作,如认证、TCP 代理和 HTTP 代理等。添加 LDS 使得 Envoy 的任何配置都可以动态执行,只有发生一些非常罕见的变更(管理员、追踪驱动等)、证书轮转或二进制更新时才会使用热更新。

RDS

RDS 即 Router Discovery Service 的缩写,用于 Envoy 在运行时为 HTTP 连接管理 filter 获取完整的路由配置,比如 HTTP 头部修改等。并且路由配置会被优雅地写入而无需影响已有的请求。当 RDS 和 EDS、CDS 共同使用时,可以帮助构建一个复杂的路由拓扑蓝绿发布等。

ADS

EDS,CDS 等每个独立的服务都对应了不同的 gRPC 服务名称。对于需要控制不同类型资源抵达 Envoy 顺序的需求,可以使用聚合发现服务,即 Aggregated xDS,它可以通过单一的 gRPC 服务流支持所有的资源类型,借助于有序的配置分发,从而解决资源更新顺序的问题。

xDS协议的基本流程

作为 Pilot 和 Envoy 之间通信协议的 xDS,可以通过两种方式实现:gRPC 和 REST,无论哪种方法都是通过 xDS API 发送 DiscoveryRequest 请求,然后解析响应 DiscoveryResponse 中包含的配置信息并动态加载。

xDS 协议流程

DiscoveryRequest

DiscoveryRequest 是结构化的请求,它为某个 Envoy 请求包含了某些 xDS API 的一组版本化配置资源。相关字段展示如下表:

属性名类型作用
VersionInfostring成功加载的资源版本号,首次为空
Node*core.Node发起请求的节点信息,如位置信息等元数据
ResourceNames[]string请求的资源名称列表,为空表示订阅所有的资源
TypeUrlstring资源类型
ResponseNoncestringACK/NACK 特定的 response
ErrorDetail*rpc.Status代理加载配置失败,ACK 为空

DiscoveryResponse

类似于 DiscoveryRequest,DiscoveryResponse 的相关字段如下表:

属性名类型作用
VersionInfostringPilot 响应版本号
Resources[]types.Any序列化资源,可表示任意类型的资源
TypeUrlstring资源类型
Noncestring基于 gRPC 的订阅使用,nonce 提供了一种在随后的 DiscoveryRequest 中明确 ACK 特定 DiscoveryResponse 的方法

ACK/NACK

当 Envoy 使用 DiscoveryRequest 和 DiscoveryResponse 进行通信的时候,除了可以在类型级别指定版本,还有一种资源实例版本,它不属于 API 的属性。例如如下的 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 解析完 DiscoveryResponse 以后,将通过流发送一个新的请求,指明最近成功应用的版本以及服务器提供的 Nonce(注:Nonce 是加密通信中用于一次一密的随机数,以免重放攻击)。借助于这个版本给 Envoy 和管理服务端同时指明当前所使用的配置版本。这种 ACK/NACK 的机制分别实现对应用新 API 配置版本或先前的 API 配置版本进行标识。

ACK

如果更新被成功应用,version_info 将如图所示置为 X:

xDS ACK

NACK

如果 Envoy 拒绝了配置更新 X,那么会返回具体的 error_detail 以及之前的版本号,下图中为空。

xDS NACK

对于 xDS 客户端来说,每当收到 DiscoveryResponse 时都应该进行 ACK 或 NACK。ACK 标识成功的配置更新,并且包含来自 DiscoveryResponse 的 version_info,而 NACK 标识失败的配置更新,并且包含之前的 version_info。只有 NACK 应该有 error_detail 字段。

基于xDS的推和拉

Envoy 在启动时会和 Pilot 建立全双工的长链接,这就为实现双向配置分发提供了条件。具体来说在 Pilot 与 Envoy 进行通信的时候有主动和被动两种方式,它们分别对应推和拉两个动作。在主动分发模式里,由 Pilot 监听到事件变化以后分发给 Envoy 。在被动分发模式里,由 Envoy 订阅特定资源事件,当资源更新时生成配置并下发。

xDS协议的特点

对于通过 gRPC streaming 传输的 xDS 协议有四个变种,它们覆盖了两个维度。

第一个维度是全量(State of the World:SotW)传输对比增量(Incremental)传输。早期的 xDS 使用了全量传输,客户端必须在每个请求里指定所有的资源名,服务端返回所有资源。这种方式的扩展性受限。所以后来引入了增量传输,在这种方式里允许客户端和服务端指定相对之前状态变化的部分,这样服务端就只需返回那些发生了变化的资源。同时增量传输还提供了对于资源的 “慢加载”。

第二个维度是每种资源独立的 gRPC stream 对比所有资源聚合 gRPC stream。同样前者是早期 xDS 早期使用的方式,它提供了最终一致性模型。后者对应于那些需要显式控制传输流的场景。

所以这四个变种分别为: 1. State of the World(Basic xDS):全量传输独立 gRPC stream; 2. Incremental xDS:增量传输独立 gRPC stream; 3. Aggregated Discovery Service(ADS):全量传输聚合 gRPC stream; 4. Incremental ADS:增量传输聚合 gRPC stream

对于所有的全量方法,请求和响应类型分别为 DiscoveryRequest 和 DiscoverResponse;对于所有的增量方法,请求和响应类型分别为 DeltaDiscoveryRequest 和 DeltaDiscoveryResposne。

增量xDS

每个xDS协议都拥有两种Grpc服务,一种是Stream,另一种是Delta。在Envoy设计早期采用全量更新策略,即以 Stream 的方式来提供强一致的配置同步。如此一来,任何配置的变更都会触发全量配置下发,显然这种全量更新的方式会为整个网格带来很高的负担。所以 Envoy 社区提出了 Delta xDS 方案,当配置发生变化时,仅下发和更新发生变化的配置部分。

增量 xDS 利用 gRPC 全双工流,支持 xDS 服务器追踪 xDS 客户端的状态。在增量 xDS 协议中,nonce 域用来指明 DeltaDiscoveryResponse 和 DeltaDiscoveryRequest ACK 或 NACK。

对于 DeltaDiscoveryRequest 可以在如下场景里发送:

  • xDS 全双工 gRPC stream 中的初始化消息;
  • 作为对前序 DeltaDiscoveryResponse 的 ACK 或 NACK;
  • 在动态添加或移除资源时客户端自动发来的 DeltaDiscoveryRequest,此场景中必须忽略 response_nonce 字段;

在下面第一个例子中,客户端收到第一个更新并且返回 ACK,而第二次更新失败返回了 NACK,之后 xDS 客户端自发请求 ‘wc’ 资源:

增量 xDS

在网络重连以后,因为并没有对之前的状态进行保存,增量 xDS 客户端需要向服务器告知它已拥有的资源从而避免重复发送:

xDS 增量重连

最终一致性

对于分布式系统而言,在设计之初选择强一致性还是最终一致性是很关键的一步,它直接关系到未来的应用场景。比如 ZooKeeper 就是强一致性服务发现的代表。但是对于服务网格的场景来说,可能同时存在成百上千个节点,这些节点间进行如此庞大的数据复制是相当困难的,并且很有可能会耗尽资源。也就是说对于分布式系统来说,为了提供强一致性需要付出巨大的代价。Envoy 在设计之初就选择了最终一致性,并且从底层线程模型到上层配置发现都进行了相应的实现。这样一来不仅简化了系统,提供了更好的性能,也更方便运维。

因为 Envoy xDS API 是满足最终一致性,部分流量可能在更新时被丢弃。比如只有集群 X 可以通过 CDS/EDS 发现,那么当引用集群 X 的路由配置更新时,并且在 CDS/EDS 更新前将配置指向集群 Y,那么在 Envoy 实例获取配置前的部分流量会被丢弃。

对于一些应用来说可以接受暂时的流量丢弃,在客户端或者其他 Envoy Sidecar 的重试会掩盖这次丢弃。对于其它无法忍受数据丢弃的场景来说,流量丢弃可以通过更新对集群 X 和 Y 的 CDS/EDS 来避免,然后 RDS 更新里将 X 指向 Y,并且 CDS/EDS 更新中丢弃集群 X。

通常为了避免丢弃,更新的顺序应该遵循 make before break 规则,即:

  • CDS 更新应该被最先推送;
  • 对相应集群的 EDS 更新必须在 CDS 更新后到达;
  • LDS 更新必须在对应的 CDS/EDS 更新后到达;
  • 对新增的相关监听器的 RDS 更新必须在 CDS/EDS/LDS 更新后到达;
  • 对任何新增路由配置相关的 VHDS 更新必须在 RDS 更新后到达;
  • 过期的 CDS 集群和相关的 EDS 端点此刻被移除;

如果没有新的集群、路由或监听器添加,或者应用可以接受短期的流量丢弃,那么 xDS 更新可以被独立推送。在 LDS 更新的场景里,监听器要在收到流量前被预热。当添加、移除或更新集群时要对集群进行预热。另一方面,路由不需要被预热。

参考资料

https://www.envoyproxy.io/docs/envoy/latest/api-docs/xds_protocol

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SAP UI5 控件学习】DAY01 Input组Part I

UI5常用控件 1.Input组 1.1 Feed Input控件 这个控件通常是用来显示发布评论的。它可以显示用户头像,并且在内容输入方面,可以设置PlaceHolder,自增扩展大小,限制行数,以及限制字数等诸多设置。 1.1.1 没有头像的输…

电压放大器的应用领域有哪些

电压放大器是一种电子器件,其主要作用是将输入信号的电压放大到输出端。在现代电子技术中,电压放大器被广泛应用于各种领域,包括通信、医疗、工业控制、汽车电子等。下面安泰电子就来详细了解一下电压放大器的应用领域。 通信领域&#xff1a…

软考:中级软件设计师:系统总线,系统可靠性,串联和并联可靠度

软考:中级软件设计师:系统总线, 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心…

4.39ue4:ue4表格设置、读取

1.创建表格,内容浏览器,右键,其他,数据表格,下拉选择一个数据结构类型的起始项。 2.被选择的数据结构将以表格的形式列出数据。 3.使用方式: i: 输出一行数据(text) ii&#xff…

Stable Diffusion 图片生成AI模型 Windows Mac部署指南

Stable Diffusion是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像,它也可以应用于其他任务,如内补绘制、外补绘制,以及在提示词​(英语)指导下产生图生图的翻译。 DreamStudio 现已…

一条MYSQL记录是如何储存的

主要还是看MYSQL默认的储存引擎 InnoDB 每个创建一个数据库 就会在/var/lib/mysql/ 目录里面创建一个以 database 为名的目录 目录里面包含以下三个文件 db.opt,用来存储当前数据库的默认字符集和字符校验规则。(数据库的数据)t_order.frm ,t_order 的…

html---链接跳转案例

目录 一、要求:设置一个网页如下图所示,可实现首页、列表页、详情页、登录页链接 二、实现:实现代码及截图如下 三、寄语 一、要求:设置一个网页如下图所示,可实现首页、列表页、详情页、登录页链接 二、实现&…

飞书深诺、恒生面试(部分)(未完全解析)

飞书深诺 说一下你对SaaS项目的理解?数据隔离是怎么处理的?Answer: 我们采用的是SAAS服务多租户数据隔离架构中的1.3共享数据库,通过租户ID来隔离,成本最低,隔离级别最低。Q:有没有开发隔离的中间件&#x…

shopee,lazada卖家如何提高店铺权重,带来更多销量

1、优化标题关键词 标题关键词可以在很大程度上影响产品的显示,如果商店自然流量低,必须检查标题是否选择合适的关键词,如果关键词不合适需要优化并进行更换,可以选择一些准确的长尾关键词获得准确的流量,如果收集产品…

在Linux中查找用户帐户信息和登录详细信息的11种方法

在Linux系统中,用户帐户和登录详细信息对于系统管理和安全非常重要。本文将介绍 11 种在 Linux 系统查找用户相关信息的有用方法。这里,我们会讲解在系统中获取一个用户账户详细信息、展示登录详细信息以及用户行为数据的命令。 首先,我们会…

【ARM7.5作业】

作业1 作业2 代码实现: head.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//初始化相关操作 void hal_uart4_init();//发送一个字符 void h…

Mockito的使用案例

流水线的单元测试 代码没有覆盖到,使用的是Mockito测试框架,原来是Mockito没有正确使用 package com.hmdp;import com.hmdp.controller.BlogController; import com.hmdp.entity.Blog; import com.hmdp.service.IBlogService; import com.hmdp.service.…

文心一言 VS 讯飞星火 VS chatgpt (55)-- 算法导论6.3 1题

文心一言 VS 讯飞星火 VS chatgpt (55)-- 算法导论6.3 1题 一、参照图6-3 的方法,说明 BUILD-MAX-HEAP在数组 A(5,3,17,10,84,19,6,22,9)上的操作…

C#(五十二)之线程

线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。 C#线程操作,需要使用到Thread类。 使用命名空间 using Sy…

grafana+prometheus+pushgateway+flink可视化实时监控

文章目录 一、各部分介绍二、安装配置1、安装pushgateway2、安装Prometheus3、Grafana 安装 三、测试使用 一、各部分介绍 采集层 flink APP和linux system两部分,是我们要收集指标数据的组件传输层 Pushgateway:是一个推送收集和推送数据的组件 Node_ex…

【网络安全带你练爬虫-100练】第5练:爬虫的翻页操作+错误情况过滤

目录 一、翻页分析: 二、代码逻辑 1、入口程序修改 2、page参数传入 三、完整代码 1、运行结果 2、错误分析: 3、缺陷代码: 4、完善逻辑: 5、完善代码: (说在前面,任何逻辑都有很多方…

Python软件安装后,Scripts文件夹下为空解决办法

安装Python后,需要使用pip,发现Scripts下为空,无法install pip: 解决办法: cmd进入Windows命令提示符界面,进入Python的安装目录,并使用python -m ensurepip命令执行即可:

R语言——字符串处理

paste(abc, def, gh, sep ) #粘贴字符串 substr(abcdefg, 2, 3) # 取特定字符串 gsub(abc, , c(abc, abcc, abcbc)) # 将字符串中abc替换为空 strsplit(a;b;c, ;, fixed T) # 按照;切分字符串 strsplit(a222b2.2c, 2.2, fixed F) # 按照正则表达式分隔,这里的.是…

15.1 BP神经网络实现图像压缩——了解神经网络在图像处理方面的应用(matlab程序)

1.简述 BP神经网络现在来说是一种比较成熟的网络模型了,因为神经网络对于数字图像处理的先天优势,特别是在图像压缩方面更具有先天的优势,因此,我这一段时间在研究神经网络的时候同时研究了一下关于BP网络实现图像压缩的原理和过程,并且是在MATLAB上进行了仿真的实验,结果发现设…

Java:ThreadLocal解析

Java:ThreadLocal解析 前言一、 什么是ThreadLocal?二、ThreadLocal的内存泄漏问题1.什么是内存泄漏?2.为什么会出现内存泄漏问题?3.如何解决内存泄漏问题?(1)ThreadLocal会自动清除key为null的…