当前位置: 首页 > news >正文

一文读懂Istio服务网格

今天小编带大家来了解Istio可以帮助开发者解决哪些困难,然后介绍它的主要组件。

1.1 前方的挑战

当前,软件开发领域正处于数字化转型时代,正在追求更好地服务客户和用户。如今的数字化创造者,也就是应用程序员们,不仅已通过运用Agile标准进入更快的开发周期,而且还在不断追求更快的开发速度。尽管单体应用有可能每月或每周做一次部署,但是,通过将大型单体应用拆分为更小的单元,将大型开发团队拆分为更小的小组,采用小组间无依赖的工作流、管理模型和开发流水线,我们还可能取得更快的产品交付速度。业界将这称为微服务架构。

关于使用微服务而会面临的各种挑战已有很多报道,首当其冲的,是将它和分布式计算(distributed computing)混为一谈。最大的假象是“网络是可靠的”。微服务通过网络(即微服务之间的连接)进行有效通信。这是过去几十年来大多数企业软件制作方式的根本变化。当你将网络依赖性添加到应用程序的逻辑中时,就会导致很多潜在风险,这些风险与应用程序所依赖的连接数量成指数性增长,而不是成倍增加。

很容易理解的是,当部署周期从每几个月一次显著提升到每周甚至可能每天数十次时,挑战会层出不穷。

一些大型互联网公司不得不开发特殊的框架和库来帮助缓解不可靠的网络、易失性的云主机以及海量代码量所带来的挑战。例如,像Netflix这样的公司创建了Ribbon、Hystrix和Eureka等项目来解决这种问题。Twitter和Google等其他公司也做了类似的事情。他们创建的这些框架具有非常强的语言和平台依赖性,因此,当使用这些框架不支持的编程语言时,这些框架将很难用得上。每当这些框架更新后,还需要相应地更新应用程序。最后,即使他们为每种语言运行时在框架中都增加了支持,在使用过程中也会有大量开销。至少在Netflix中,这些库的创建是在虚拟机(VM)作为主要可部署单元的情景中,它们只能在单个云平台和单个应用程序运行时(Java虚拟机)上实现标准化。大多数公司不能也不会这样做。

Linux容器(例如Docker)和Kubernetes / OpenShift的出现,使得DevOps团队通过在高度自动化的流水线中使用快速流转的不可变镜像来获得更高的速度。现在,开发团队管理流水线的方式独立于容器内运行的语言或框架。OpenShift使我们能够为一组复杂的分布式多语种工作负载提供更好的弹性和整体管理。OpenShift确保开发人员可以轻松部署和管理数百个甚至数千个微服务。这些服务被打包为在Kubernetes Pod中运行的容器,并带有它们各自的语言运行时(例如Java Virtual Machine,CPython和V8)及其所有必要的依赖库,通常以特定语言的框架的形式出现(例如Spring或Express)和库(例如jar或npms)。但是,OpenShift并不介入在各个Pod中运行的应用程序组件之间的交互。这是架构师和开发人员所面临的挑战。快速部署和管理多语言服务的工具和基础架构已经成熟,但是当处理这些服务之间的交互时,我们却缺少类似功能。在这里,Istio这种服务网格将使你作为应用程序开发人员可构建更好的软件并比以往更快地交付它。

1.2 初始Istio

Istio是一种服务网格(service mesh)的实现。服务网格是服务之间的连接组织,带有一些附加功能,例如流量控制、服务发现、负载平衡、弹性、可观察性和安全性等。服务网格使得应用程序从代码中卸载这些功能,以让开发人员专注于业务逻辑。

Istio一开始就被设计为可跨部署平台工作的,同时它具有一流的对Kubernetes的集成性支持。

就像Kubernetes生态系统中的许多开源项目一样,Istio是希腊航海术语,意为“风帆”,就像Kubernetes本身是希腊语中的“舵手”或“船上驾驶员”一样。有了Istio后,人们对服务网格概念的兴趣与日俱增,而Kubernetes / OpenShift离开的地方就是Istio的起点。Istio为开发人员和架构师提供了丰富的声明式服务发现和路由功能。在Kubernetes / OpenShift的服务(service)组件为你提供默认的轮询(round-robin)负载均衡功能时,Istio允许你在网格内的所有服务之间引入唯一且细粒度的路由规则。Istio还为我们提供了强大的可观察性,以能更深入地研究分布式微服务间的网络拓扑,了解它们之间的流(跟踪)并能够即时查看关键指标。

既然网络实际上并不总是可靠的,那么,就需要对微服务间的关键链路进行更严格的监控和操作。Istio为我们提供了网络层的弹性功能,例如重试、超时以及各种断路器功能。

Istio还为开发人员和架构师提供了实践混沌工程学的能力。在第5章中,我们描述了Istio推动混沌注入的能力,以便你可以看到整个应用程序及其潜在的数十种相互依赖的微服务的弹性和健壮性。

在开始讨论之前,我们想确保你对Istio有基本的了解。以下部分将概述Istio的基本组件。

1.3 理解Istio组件

Istio服务网络主要包含两个平面:数据平面(data plane)和控制平面(control plane),如图1-1所示。

图1-1 Istio的数据平面和控制平面

1.3.1 数据平面

数据平面的实现方式是拦截所有入站(ingress,入口)和出站(egress,出口)网络流量。你的业务逻辑、应用程序和微服务都不会觉察到这种拦截。你的微服务可使用简单框架在整个网络上调用远程HTTP端点(例如Spring RestTemplate或JAX-RS客户端),并且大多数情况下对这种拦截带来的众多有趣能力全然不知。图1-2描述了Istio出现之前的典型微服务。

图1-2 Istio出现前的微服务架构

Istio服务网格的数据平面由以边车容器(sidecar container)形式运行的istio-proxy实例组成,如图1-3所示。

图1-3 Evoy边车(istio-proxy)

服务代理

服务代理(Service proxy)增强了应用程序服务。每当需要通过网络进行通信时,应用程序服务就会通过服务代理进行调用。服务代理充当中介或拦截器,可以添加诸如自动重试、断路器、服务发现和安全性等功能。Istio的默认服务代理基于Envoy代理。

Envoy代理是Lyft开发的第7层(L7)代理(请参阅Wiki上的OSI模型),目前Lyft在生产环境中使用该代理每秒处理数百万个请求。它使用C ++编写,经过了实战测试,性能高和轻量级。它提供诸如HTTP1.1,HTTP2和gRPC的负载平衡功能。它具有收集请求级别指标和跟踪范围(trace span)能力,提供服务发现和注入故障等功能。你可能会注意到Istio的某些功能与Envoy重叠。由于Istio使用Envoy来实现这些功能,因此这一点很好理解。

但是Istio如何将Envoy部署为服务代理呢?Istio使用一种称为边车(sidecar)的部署技术,使服务代理功能与应用程序代码尽可能靠近。

边车(Sidecar)

当Kubernetes / OpenShift诞生时,它们并没有像人们原本期望的那样将Linux容器用作可运行和可部署单元。相反,它创造了Pod概念,这是在Kubernetes / OpenShift世界中被管理的主要目标。为什么需要Pod呢?有人认为这借鉴了1956年的电影《Invasion of the Body Snatchers》,但实际上借鉴了家庭或鲸鱼概念。鲸鱼是与Docker开源项目相关联的早期映像,该项目是那个时代最流行的Linux容器解决方案。Pod可以是一组Linux容器。Sidecar是另一个Linux容器,直接与你的业务逻辑应用程序或微服务容器并存。在现实世界中,边车被固定在摩托车的一侧作为一简单附属品;与之不同的是,Istio中的边车可以接管车把和油门。

使用Istio,可以将第二个Linux容器“ istio-proxy”(也称为Envoy服务代理)手动或自动注入到容纳你的应用程序或微服务的pod中。该边车负责拦截来自业务逻辑容器的所有入站(入口)和出站(出口)网络流量,这意味着可以应用新策略来重新路由传入或传出的流量,还可以应用诸如访问控制列表之类的策略( ACL)或速率限制,还会抓取监视和跟踪数据(Mixer),甚至引入一些混乱,例如网络延迟或HTTP错误。

1.3.2 控制平面

控制平面负责成为配置和策略的中心,并使数据平面在群集中变得可操作,该群集可能由分散在多个节点上的数百个Pod组成。Istio的控制平面包括Istio的三项主要服务:Pilot,Mixer和Citadel。

Pilot

Pilot是一个Istio组件,它负责管理在Kubernetes / OpenShift集群中运行的所有微服务的边车。Istio Pilot将每个独立的istio-proxy微服务包装成Linux容器并在应用程序pod中运行,并具有整体拓扑的实时视图和保持更新的“路由表”。Pilot提供了服务发现等功能,以及对VirtualService的支持。VirtualService使你可以进行细粒度的请求分发、重试、超时等。我们将在第3章和第4章中对此进行详细介绍。

Mixer

顾名思义,Mixer是将事物整合在一起的Istio服务。每个分布式istio-proxy将遥测数据传递回Mixer。此外,Mixer维护整个微服务套件使用和访问策略的规范模型。使用Mixer,你可以创建策略,应用速率限制规则,甚至抓取自定义指标。Mixer具有可插拔的后端体系结构,并随着新插件和合作伙伴的发展而迅速发展,这些插件和合作伙伴以许多新颖有趣的方式扩展了Mixer的默认功能。Mixer的许多功能超出了本书的范围,但我们会在第6章中介绍可观察性,在第7章中介绍了安全性。

Citadel

Istio Citadel组件(以前称为Istio CA或Auth)负责证书签名、颁发、吊销及轮换。Istio向所有微服务颁发X.509证书,从而允许服务间进行双向传输层安全(mTLS)通信并透明地加密所有流量。它使用内置在基础平台中的身份,并将其构建到证书中。此身份使你可以执行策略。第7章讨论了设置mTLS的示例。 

本中文译稿版权由本人所有。水平有限,错误肯定是有的,还请海涵。


RECOMMEND

推荐阅读

 

扫码了解详情并购买

《Istio入门与实战》

适读人群 :云计算开发人员和微服务开发人员

本书通过从零开始搭建一个微服务实验,逐一展示Istio的主要功能,直观地帮助读者理解Istio,非常适合入门级读者快速掌握Istio技术。

扫码了解详情并购买

《Service Mesh实战:基于Linkerd和Kubernetes的微服务实践》

适读人群 :所有正在从事微服务开发或即将使用微服务技术的企业和个人

作者是思科的高级工程师,是国内Service Mesh领域的早期实践者,是的架构师和微服务技术专家。 

详细讲解Linkerd的配置、部署、管理、运维和监控,以及它的工作原理,对理解其他Service Mesh产品也有帮助。


相关文章:

  • 网络安全百科全书,非它莫属
  • 【直播预告】2月27日|数字孪生造就Tesla——兼介我的“准工业4.0”生活
  • 千亿市场空间开启!网络安全开启新纪元步入黄金时代
  • 【直播预告】2月28日|老男孩创始人教你如何学好Linux运维
  • 反向压力:异步系统中的OOM问题
  • 一个月读完6本书?这些烧脑神书,你能读完1本,就是学霸!
  • 搜索引擎的竞价排名是怎样实现的?
  • 掌握Java核心技术,看我!
  • 【新书速递】斯坦福算法博弈论二十讲
  • 【直播预告】「甦:知识蓄力2020」编辑讲书智慧接力行动
  • 【一周书讯】网络安全、云计算、人工智能、大数据一网打尽
  • 计算机仿真模拟告诉你,为什么现在还不能开学
  • 物联网领域新计算范式技术、架构、应用方面的前沿指南
  • 无处不在的流计算到底是什么?终于有人讲明白了(附导图)
  • 打破VR-AR的“神话” 揭开VR-AR的“现实”
  • SegmentFault for Android 3.0 发布
  • 10个最佳ES6特性 ES7与ES8的特性
  • C++类中的特殊成员函数
  • ES6系列(二)变量的解构赋值
  • Hibernate【inverse和cascade属性】知识要点
  • javascript 哈希表
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • learning koa2.x
  • magento 货币换算
  • Markdown 语法简单说明
  • Mithril.js 入门介绍
  • Promise初体验
  • Python_OOP
  • vue-router 实现分析
  • 从输入URL到页面加载发生了什么
  • 分布式事物理论与实践
  • 机器学习中为什么要做归一化normalization
  • 免费小说阅读小程序
  • 悄悄地说一个bug
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #考研#计算机文化知识1(局域网及网络互联)
  • #微信小程序:微信小程序常见的配置传旨
  • $(selector).each()和$.each()的区别
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (pojstep1.1.2)2654(直叙式模拟)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (九)信息融合方式简介
  • (四)linux文件内容查看
  • (四)模仿学习-完成后台管理页面查询
  • (转)ABI是什么
  • (转)ObjectiveC 深浅拷贝学习
  • (转)socket Aio demo
  • (转)关于多人操作数据的处理策略
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库