写点什么

通过Istio重新实现微服务 (一):认识 Istio

2019 年 4 月 17 日

通过Istio重新实现微服务 (一):认识 Istio

本文最初发表于Rinor Maloku的个人站点,经原作者授权由InfoQ中文站翻译分享。


Istio 是一个开源项目,由来自 Google、IBM 和 Lyft 团队协作开发,它为一组特定的问题提供了解决方案,要理解这个解决方案,我们就要明白这些问题到底是什么。当从单体架构迁移到基于微服务的应用时,会带来很多的复杂性,举例来说:


  • 流量管理(Traffic management):超时、重试、负载均衡;

  • 安全性(Security):终端用户的认证和授权;

  • 可观察性(Observability):跟踪、监控和日志。


这些问题都可以在应用层解决,但这样的话,你的服务就无法称其为“微”了,实现这些功能所出的努力都会对公司的资源带来一定的压力,而这些资源本来是可以用来交付业务价值的。我们举个例子:


PM:如果增加一个反馈的特性,预计需要多长时间?

Dev:两个sprint。

PM:什么?!这只是一个简单的CURD!

Dev:创建CURD的功能是非常简单的,但是我们需要对用户和服务进行认证和授权。而且因为网络不可靠,我们需要在客户端实现重试和断路器,为了避免整个系统出现停止响应的情况,我们还需要超时和舱壁模式,除此之外,为了探测出现的问题,我们还需要监控、跟踪……

PM:好吧,那就把这个特性放到Product服务中吧!


到这里,你可能已经发现,针对每个服务,所有的过程和努力必须都要再来一遍,对我们来说,添加一个服务是一项巨大的任务。在本文中,我们将会展示 Istio 如何帮助我们移除服务中的这些横切性关注点。



图 1 构建一个微服务所需的繁琐过程


注意:本文假设你已经对 Kubernetes 有了一定的了解,如果事实并非如此的话,建议你阅读一下我所撰写的Kubernetes入门介绍,然后继续阅读本文。


Istio 的理念


在没有 Istio 的时候,某个服务会直接发起对另一个服务的访问,如果出现失败的话,这个服务需要作出的处理包括重试、超时以及打开断路器等等。



图 2 Kubernetes 中的网络流量


Istio 提供了一个非常巧妙的方案,它能够从服务中完全分离出来,只拦截所有的网络通信来发挥作用。通过这种方式,它能够实现如下功能:


  • 容错:当请求失败和重试的时候,使用它能够理解的响应状态码;

  • 金丝雀发布:只将特定百分比的请求转发到服务的新版本上;

  • 监控和指标:统计服务响应所耗费的时间;

  • 跟踪和可观察性:它在每个请求上添加了一个特殊的头部信息,并在集群中跟踪它们;

  • 安全性:抽取JWT Token并对用户进行认证和授权。


上面所提及的功能(仅仅是很少的一部分)只是为了提起你的兴趣,接下来,我们会讨论技术细节。


Istio 的架构


Istio 会拦截所有的网络流量,并且会在每个 pod 上以 sidecar 的形式注入一个智能代理,从而能够应用一组特定的规则。让所有特性生效的代理是由数据平面(Data Plane) 组成的,而数据平面是由控制平面(Control Plane)动态配置的。


数据平面


注入的代理能够让 Istio 很容易地满足我们的需求。举例来说,我们看一下重试和断路器功能。



图 3 Envoy 是如何实现重试和断路器的


简单总结一下:


  1. Envoy发送请求给服务B的第一个实例,不过调用失败了;

  2. Envoy Sidecar会进行重试;(1)

  3. 失败的请求返回发起调用的代理;

  4. 开启断路器并在随后的请求中调用下一个服务。(2)


这意味着我们不需要使用额外的重试库,也不需要使用各种各样的语言实现断路器和服务发现功能。这些特性都是由 Istio 所提供的,我们不需要任何的代码修改。


我想现在你应该已经想要加入 Istio 的旅程了,但是依然有一些疑虑,有些问题依然没有得到解答。你可能会想,它是一个适用于所有场景的解决方案吗?通常来讲,适用所有场景意味着难以非常好地适用任何场景。


你可能会默默地问一句:“它是可配置的吗?”


朋友们,欢迎加入我们的旅程,接下来我会为你介绍控制平面。


控制平面


控制平面由三个组件组成:Pilot、Mixer 和 Citadel,它们组合配置 Envoy 以便于路由流量、执行策略和收集遥测数据。它们的可视化展现如下图所示。



图 4 控制平面与数据平面的关系


Envoy(也就是数据平面)会由 Istio 规定的Kubernetes自定义资源定义(Kubernetes Custom Resource Definition)来进行配置,这些定义是专门为了实现该目的的。这就是说,对你而言,它只是具有熟悉语法的 Kubernetes 资源而已。在创建之后,控制平面会获取到它,并将其用到 Envoy 上。


服务与 Istio 的关系


我们已经描述了 Istio 与服务之间的关系,但是回过头来看一下,我们的服务与 Istio 之间是什么关系呢?


坦白讲,你的服务仅仅需要知道 Istio 存在就足够了,就像鱼和水一样,鱼可能会问“水到底是什么呢”?



图 5 水是什么?本图由Victoria Dimitrakopoulos绘制


我们可以选取一个可运行的集群,在安装 Istio 组件之后,集群中的服务依然能够继续运行,我们可以按照相同的方式将组件移除掉,所有的事情都能正常运行,只不多我们失去了 Istio 所提供的功能而已。


我们已经讲了太多的理论,接下来的内容我们将知识转化为实践。


2019 年 4 月 17 日 08:006733

评论

发布
暂无评论
发现更多内容

【人人都懂密码学】一篇最易懂的Java密码学入门教程

华为云开发者社区

加密 密码

本周学习总结

饺子

看看专科程序员与本科程序员之间,到底有什么区别?

Java架构师迁哥

《Java核心技术总结》+《面试题总结》PDF整理,阿里P8大牛熬了半个月肝出来的!

Java架构之路

Java 阿里巴巴 程序员 面试 编程语言

MySQL-技术专题-主从复制原理

李浩宇/Alex

Go语言小规范

小高

拯救深度学习:标注数据不足下的深度学习方法

华为云开发者社区

学习 AI 训练

浅析 Golang 垃圾回收机制

郭旭东

go golang

上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间

Java架构师迁哥

全面到哭!BAT内部Java求职面试宝典,必须人手一份!

Java成神之路

Java 阿里巴巴 程序员 面试 编程语言

塞上江南之旅

谋生亦谋爱

美食 旅行

亿级数据库毫秒级查询?看完这一篇,海量数据赋能你也行

京东智联云开发者

MySQL 数据库

个人精简xml,实现mybatis存取blob类型数据(Mysql)

小Q

Java MySQL 学习 面试 mybatis

架构师训练营第 1 期第四周总结

Leo乐

极客大学架构师训练营

区块链将这样影响你的生产生活

CECBC区块链专委会

区块链 信息发展

通证、通证经济与区块链

CECBC区块链专委会

区块链 通证经济

2020亚马逊全球Prime会员日为会员节省金额超过14亿美金

爱极客侠

Vidyo整个产品架构是怎样的?

dwqcmo

音视频会议 集成架构 解决方案 智能硬件

MySQL-技术专题-SQL优化系列

李浩宇/Alex

Presto在滴滴的探索与实践

滴滴技术

开源项目 滴滴技术 滴滴开源 presto

阿里P8架构师得意弟子,应聘华为Java岗居然一面就失败了?

Java架构师迁哥

你掉进过“伪敏捷”的陷阱吗?

华为云开发者社区

项目管理 软件 敏捷

十二、深入Python列表和元组

刘润森

Python

重磅推荐!阿里巴巴技术专家认证的Java系统性能圣经,太香了

996小迁

Java 架构 面试 Java系统性能

上线GitHub七天后就标星87.6K的Java大牛成长宝典,啃完之后成功面进字节!

Java架构追梦

Java 学习 架构 面试 核心知识点

大型互联网应用系统的技术方案和手段

饺子

数据库技术丨GaussDB(DWS)数据同步状态查看方法

华为云开发者社区

数据库 高可用

《Linux学习笔记》从常用命令、常用操作到网络管理、性能优化

Java架构之路

Java Linux 程序员 面试 编程语言

阿里内部绝密《百亿级并发系统设计》实战教程,冒着被劝退的风险免费分享

Java架构之路

Java 阿里巴巴 程序员 面试 编程语言

六年Java老鸟,写给1-3年程序员的几点建议,满满干货指导

周老师

Java 编程 程序员 架构 面试

研发和测试在多国陆续展开 全球央行数字货币研发驶入快车道

CECBC区块链专委会

数字货币 金融

2021年,算法还“香”吗?

2021年,算法还“香”吗?

通过Istio重新实现微服务 (一):认识 Istio-InfoQ