女主宣言
本文出自于ADDOPS团队,该文章的译者霍明明参与了360 HULK云平台容器化及虚拟化平台相关服务建设,对微服务有着独到的见解。今天的主角Istio是Google/IBM/Lyft联合开发的开源项目,估计很多同学在此之前可能完全没有听过这个名字,请不必介意,因为Istio出世也才五个月而已。让我们跟着作者一起揭开Service Mesh的神秘面纱。
PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!
前言
有人将 Service Mesh 看成是一次 "Network Application Revolution",我还是非常认同的,所以也就有了进一步了解和学习Service Mesh的动力。
在看本文章前,强烈建议先看一下这两篇文章《深度剖析Service Mesh服务网格新生代Istio》,《从分布式到微服务,深挖Service Mesh》,了解一下Service Mesh的历史。
1
Envoy 简介
在 Service Mesh 模式中,每个服务都配备了一个代理“sidecar”,用于服务之间的通信。这些代理通常与应用程序代码一起部署,并且它不会被应用程序所感知。Service Mesh 将这些代理组织起来形成了一个轻量级网络代理矩阵,也就是服务网格。这些代理不再是孤立的组件,它们本身是一个有价值的网络。其部署模式如图所示:
-
绿色部分代表应用程序
-
蓝色部分则是sidecar
服务网格是用于处理服务到服务通信的“专用基础设施层”。它通过这些代理来管理复杂的服务拓扑,可靠地传递服务之间的请求。 从某种程度上说,这些代理接管了应用程序的网络通信层。
Envoy是 Service Mesh 中一个非常优秀的 sidecar 的开源实现。我们就来看看 Envoy 都是做些什么工作。
2
Envoy 用到的几个术语
-
Host: 通常我们将 Host 看做是一个具备网络通信功能的实体(可以是一台物理机,也可以是一台移动设备等等) 。在 Envoy 中,host 是一个逻辑网络中的应用. 可能运行在由有多个主机组成的底层硬件,只要它们各自独立寻址。
-
Downstream: 请求发起者(服务请求方)。
-
Upstream: 请求接收者(服务提供方)。
-
Listener: 服务(程序)监听者。就是真正干活的。 envoy 会暴露一个或者多个listener监听downstream的请求。
-
Cluster: upstream 集群。Envoy 通过服务发现定位集群成员并获取服务。具体请求到哪个集群成员是由负载均衡策略决定。通过健康检查服务来对集群成员服务状态进行检查。
-
Mesh: 在本文中 "Envoy mesh" 指的是由一组 Envoy 代理组成的,为不同服务之间可靠传递请求的服务网格。
-
Runtime configuration: Envoy 配置是热更新的,无需重启。
-
Filter: 过滤器。在 Envoy 中指的是一些“可插拔”和可组合的逻辑处理层。是 Envoy 核心逻辑处理单元。
3
Envoy 基础概念
线程模型
Envoy 使用单进程多线程模式。一个主线程,多个工作线程。主线程协调和管理这多个线程来工作。每个线程都独立监听服务,并对请求进行过滤和数据的转发等。
一个连接建立后,这个线程将会管理该连接的整个生命周期。通常 Envoy 是非阻塞的,对于大多数情况建议每个 Envoy 配置的工作线程数等于机器的 CPU 线程数。
Listeners
Envoy 中真正干活的(通常是一个监听服务端口的工作线程)。
Envoy 会启动一个或者多个listener,监听来自 downstream 的请求。当 listener 接收到新的请求时,会根据关联的filters模板初始化配置这些 filters,并根据这些 filters 链对这些请求做出处理(例如:限速、TLS 认证、HTTP 连接管理、MongoDB 嗅探、TCP 代理等等)。
Envoy 是多线程模型,支持单个进程配置任意数量的 listeners。通常建议一个机器上运行一个 Envoy 进程,而不关心配置了多少个listerners(如上:大多数情况listener数量等于机器的CPU线程数)。
目前 Envoy 只支持 TCP 类型的 listeners。每个 listener 都可以独立配置一些L3/L4层的 filters。
Listener 还可以通过 listener 发现服务来动态获取。
Network (L3/L4) filters
network (L3/L4) filters 构成了Envoy连接处理的核心。 在 listener 部分我们介绍过, 每个 listener 可以组合使用多个 filters 来处理连接数据。
目前有三种类型的 network (L3/L4) filters:
-
Read: 当 Envoy 接收来自下游服务请求数据时被调用。
-
Write: 当 Envoy 向上游服务发送数据时被调用。
-
Read/Write: 上面两种fileter都是单向控制,Read/Write filters 在接收来自下游服务请求数据和向上游服务发送数据时被调用,是双向控制。
这些 filter 通过分析原始字节流和少量连接事件(例如,TLS握手完成,本地或远程连接断开等)对连接进行处理。
Network Filter(L7)/HTTP Filter
HTTP 协议是当前许多服务构建的基础协议,作为核心组件,Envoy 内置了 HTTP 连接管理 filter。 该 filter 将原始数据字节转换成 HTTP 协议类型数据(比如: headers、body、trailers等)。它还会处理一些通用的问题(比如:request日志、request ID生成和request追踪、请求/响应头控制、路由表管理和状态数据统计等)。
HTTP 连接管理提供了三种类型的filter:
HTTP 协议是当前许多服务构建的基础协议,作为核心组件,Envoy 内置了 HTTP 连接管理 filter。 该 filter 将原始数据字节转换成 HTTP 协议类型数据(比如: headers、body、trailers等)。它还会处理一些通用的问题(比如:request日志、request ID生成和request追踪、请求/响应头控制、路由表管理和状态数据统计等)。
HTTP 连接管理提供了三种类型的filter