1 服务网格是什么
服务网格是一个专用的基础设施层,旨在“在微服务架构中实现可靠、快速和安全的服务间调用”。它不是一个“服务”的网格,而是一个“代理”的网格,服务可以插入这个代理,从而使网络抽象化。
2 为什么需要服务网格
业务复杂需要微服务化,微服务化导致技术和沟通门槛高,服务网格应势而生,将业务与基础技术解耦,业务更加专注和适应变化,技术更加稳定和精进。
3 服务网格解决了什么
- 连接: 对网格内部的服务之间的调用产生的流量进行智能管理,以此为基础,对微服务的部署、测试和升级提供保障
- 安全:认证、加密、和鉴权支持,在不入侵代码的情况下,加固现有服务,提高安全性。
- 策略:在控制面定制策略,并在服务中实施。
- 观察:对服务间调用进行跟踪和测量,并获取服务的状态信息。
4 服务网格全景图
- amalgam8 - 用于异构微服务的基于版本的路由网格
- ambassador - 开源的基于 Envoy proxy 构建的用于微服务的 Kubernetes 原生 API 网关 https://www.getambassador.io
- Apache APISIX - Apache APISIX 是一个动态、实时、高性能的 API 网关,基于 Nginx/Openresty 网络库和 etcd 实现,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等七层流量管理功能,可以用来处理网站、移动设备和 IoT 的流量,通常使用 Apache APISIX 来处理传统的南北向流量。 http://apisix.apache.org/
- aspen-mesh - 隶属于 F5 公司开发的 Service Mesh
- consul - Consul 一种分布式、高可用的数据中心感知解决方案,用于跨动态分布式基础架构连接和配置应用程序。https://www.consul.io/
- dubbo - Apache Dubbo is a high-performance, java based, open source RPC framework. http://dubbo.apache.org
- envoy - C++ 前端/服务代理 https://www.envoyproxy.io
- istio - 用于连接、保护、控制和观测服务。
- kong - 云原生 API 网关 https://konghq.com/install
- linkerd - 云原生应用的开源 Service Mesh https://linkerd.io
- mesher - 华为开源的轻量级基于 go chassis 的 Service Mesh。
- nginmesh - 基于 Nginx 的 Service Mesh
- nginx-unit - NGINX Unit is a new, lightweight, open source application server built to meet the demands of today’s dynamic and distributed applications.
- servicecomb - ServiceComb 是华为开源的微服务框架,提供便捷的在云中开发和部署应用的方式。
- tars - Tars 是腾讯开源的基于名称服务的高性能 RPC 框架。使用 tars 协议并提供半自动化运维平台。
- MOSN - MOSN 是由蚂蚁金服开源的云原生网络代理。https://mosn.io
- Orange - Orange 是一个简洁 高性能的云原生网关
5 主流service mesh方案对比 
6 Istio技术架构
Istio的技术基石是流量劫持(流量代理)
Istio的整体架构,从逻辑上,Istio分为数据平面和控制平面两个部分:数据平面是以 sidecar 方式部署的智能代理,Istio默认集成的是Envoy。数据平面用来控制微服务之间的网络通讯,以及和Mixer模块通信。控制平面负责管理和配置数据平面,控制数据平面的行为,如代理路由流量,实施策略,收集遥测数据,加密认证等。控制平面分为Pilot、Mixer、Citadel三个组件,后面再详细介绍。
-
控制平面
Mixer
Mixer 是一个独立于平台的组件,负责在服务网格上执行访问控制和使用策略,并从 Envoy 代理和其他服务收集遥测数据。代理提取请求级属性,发送到 Mixer 进行评估。 Mixer 中包括一个灵活的插件模型,使其能够接入到各种主机环境和基础设施后端,从这些细节中抽象出 Envoy 代理和 Istio 管理的服务。
Pilot
Pilot 为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。它将控制流量行为的高级路由规则转换为特定于 Envoy 的配置,并在运行时将它们传播到 sidecar。 Pilot 将平台特定的服务发现机制抽象化并将其合成为符合 Envoy 数据平面 API 的任何 sidecar 都可以使用的标准格式。这种松散耦合使得 Istio 能够在多种环境下运行(例如,Kubernetes、Consul、Nomad),同时保持用于流量管理的相同操作界面。
Citadel
Citadel 通过内置身份和凭证管理赋能强大的服务间和最终用户身份验证。可用于升级服务网格中未加密的流量,并为运维人员提供基于服务标识而不是网络控制的强制执行策略的能力。从 0.5 版本开始,Istio 支持基于角色的访问控制,以控制谁可以访问您的服务,而不是基于不稳定的三层或四层网络标识。
Galley
Galley 代表其他的 Istio 控制平面组件,用来验证用户编写的 Istio API 配置。随着时间的推移,Galley 将接管 Istio 获取配置、 处理和分配组件的顶级责任。它将负责将其他的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节中隔离开来。
-
数据平面
Envoy
Istio 使用 Envoy 代理的扩展版本,Envoy 是以 C++ 开发的高性能代理,用于调解服务网格中所有服务的所有入站和出站流量。Envoy 的许多内置功能被 Istio 发扬光大,例如:
- 动态服务发现
- 负载均衡
- TLS 终止
- HTTP/2 & gRPC 代理
- 熔断器
- 健康检查、基于百分比流量拆分的灰度发布
- 故障注入
- 丰富的度量指标
Envoy 被部署为 sidecar,和对应服务在同一个 Kubernetes pod 中。这允许 Istio 将大量关于流量行为的信号作为属性提取出来,而这些属性又可以在 Mixer 中用于执行策略决策,并发送给监控系统,以提供整个网格行为的信息。 Sidecar 代理模型还可以将 Istio 的功能添加到现有部署中,而无需重新构建或重写代码。
7 Istio 不足和未来
Istio 2016年发展至今,还存在不稳定、延迟大、Mixer性能等问题。