From ab0fcb2f679f4c1f98849431de5227d0bbb82412 Mon Sep 17 00:00:00 2001 From: Liu-HongYe Date: Wed, 10 Jun 2020 11:57:37 +0800 Subject: [PATCH] add: concepts/data-plane.md (#265) * add: concepts/data-plane.md * add: concepts/data-plane.md * fix concepts/data-plane.md --- concepts/data-plane.md | 30 ++++++++++++++++++++++-- images/concepts-data-plane-arch.png | Bin 0 -> 10333 bytes images/concepts-data-plane-overview.png | Bin 0 -> 28385 bytes 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 images/concepts-data-plane-arch.png create mode 100644 images/concepts-data-plane-overview.png diff --git a/concepts/data-plane.md b/concepts/data-plane.md index 02087b18..923eb32e 100644 --- a/concepts/data-plane.md +++ b/concepts/data-plane.md @@ -1,6 +1,32 @@ --- -authors: [""] +authors: ["Liu-HongYe"] reviewers: [""] --- -# 数据平面 \ No newline at end of file +# 数据平面 + +数据平面(data plane)是最先出现在分层网络中的概念,网络层一般被分为控制平面(control plane)与数据平面。控制平面主要为数据包的快速转发准备必要信息,如:路由协议,设备管理,命令行,ARP,IGMP 等;而数据平面则主要负责高速地处理和转发数据包,因为所有由网络处理器处理的数据包都必须经过这里,所以是影响整个系统性能的关键因素。这样划分的目的是把不同类型的工作分离开,避免不同类型的处理相互干扰。数据平面的转发工作无疑是网络层的重要工作,需要最高的优先级;而控制平面的路由协议等不需要在段时间内处理大量的包,可以将其放到次一级的优先级中。数据平面可以专注使用定制序列化等各种技术来提高传输速率,而控制平面则可以借助于通用库来达到更好的控制与保护效果。 + +服务网格(Service Mesh)是一个用于处理服务间通信的基础设施层,它负责为构建复杂的云原生应用传递可靠的网络请求。在实践中,服务网格通常实现为一组和应用程序部署在一起的轻量级的网络代理,但对应用程序来说是透明的。这看起来和分层网络中的网络层极为相似,因此作为 Service Mesh 的典型实现,Istio 采用同样的设计,如下图,将系统分为数据平面与控制平面。类似的,数据平面由通信代理组件(Envoy/Linkerd等)和组件之间的网络通信组成;控制平面负责对通信代理组件进行管理和配置。 + +![Service Mesh 分层架构](../images/concepts-data-plane-overview.png) + +Istio 数据平面核心是以边车(sidecar)模式运行的智能代理。边车模式将数据平面核心组件部署到单独的流程或容器中,以提供隔离和封装。边车应用与父应用程序共享相同的生命周期,与父应用程序一起创建和退出。边车应用附加到父应用程序,并为应用程序提供额外的特性支持,边车模式详细介绍请参照背书[边车模式](sidecar.md)中的相关内容。 +如下图所示,数据平面的边车代理可以调节和控制微服务之间所有的网络通信,每个服务 Pod 启动时会伴随启动 istio-init 和 proxy 容器。其中 istio-init 容器主要功能是初始化 Pod 网络和对 Pod 设置 iptable 规则,设置完成后自动结束。Proxy 容器会启动两个服务:istio-agent 以及网络代理组件。istio-agent 的作用是同步管理数据,启动并管理网络代理服务进程,上报遥测数据;网络代理组件则根据管理策略完成流量管控、生成遥测数据。数据平面真正触及到对网络数据包的相关操作,是上层控制平面策略的具体执行者。 + +![Data Plane 架构图](../images/concepts-data-plane-arch.png) + +在 Istio 中,数据平面主要负责执行如下任务: +- 服务发现:探测所有可用的上游或后端服务实例 +- 健康检测:探测上游或后端服务实例是否健康,是否准备好接收网络流量 +- 流量路由:将网络请求路由到正确的上游或后端服务 +- 负载均衡:在对上游或后端服务进行请求时,选择合适的服务实例接收请求,同时负责处理超时、断路、重试等情况 +- 身份验证和授权:在 istio-agent 与 istiod 配合下,对网络请求进行身份验证、权限验证,以决定是否响应以及如何响应,使用 mTLS 或其他机制对链路进行加密等 +- 链路追踪:对于每个请求,生成详细的统计信息、日志记录和分布式追踪数据,以便操作人员能够理解调用路径并在出现问题时进行调试 + +简单来说,数据平面的工作就是负责有条件地转换、转发以及观察进出服务实例的每个网络包。 + +现在常见的数据平面实现有: +- Envoy:Istio 默认使用的数据平面实现方案,使用C++开发,性能较高。 +- MOSN:阿里巴巴公司开源,设计类似 Envoy,使用 Go 语言开发,优化过多协议支持。 +- Linkerd:一个提供弹性云端原生应用服务网格的开源项目,也是面向微服务的开源 RPC 代理,使用 Scala 开发。它的核心是一个透明代理。因此也可作为典型的数据平面的实现。 \ No newline at end of file diff --git a/images/concepts-data-plane-arch.png b/images/concepts-data-plane-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..f440d038a1d498cb51d335fe0b574149d9ae6b1f GIT binary patch literal 10333 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 literal 0 HcmV?d00001 diff --git a/images/concepts-data-plane-overview.png b/images/concepts-data-plane-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3997423abfefc159c4897b74a6ebea78fb9b6d GIT binary patch literal 28385 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

Cd}v^phhiZyee` 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