装箱百万奖金,第六届全国工业互联网数据创新应用大赛火热报名中! 了解详情
写点什么

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

  • 2019-04-17
  • 本文字数:1961 字

    阅读完需:约 6 分钟

通过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-04-17 08:007360

评论

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

4个优化方法,让你能了解join计算过程更透彻

华为云开发者联盟

数据 高性能 哈希表 join 标识对齐

元宇宙100讲-0x003

hackstoic

元宇宙

专题:基于云的技术架构设计实践

hackstoic

DevOps 云原生 技术架构 内容合集 签约计划第二季

react源码解析7.Fiber架构

buchila11

React

现代配置指南——YAML 比 JSON 高级在哪?

杨成功

json 大前端 架构师 yaml 签约计划第二季

给弟弟的信第11封|Java学习路线

大菠萝

28天写作

对话中移上研院,分享DevOps及运维观点

龙智—DevSecOps解决方案

DevOps 运维 中移上研院

CSDN热榜、华为云博客都可用来练习Python scrapy 爬虫

梦想橡皮擦

12月日更

vivo浏览器的快速开发平台实践-总览篇

vivo互联网技术

敏捷开发 浏览器 开发平台

MySQL设置数据库为只读

Simon

MySQL

电商系统微服务拆分及架构设计

stars

架构训练营 电商微服务分析

Flutter 将整个App变为灰色(勿忘国殇 警钟长鸣)【Flutter专题21】

坚果

flutter 28天写作 12月日更

Vue3进阶(贰):Vue3 新特性

No Silver Bullet

Vue3 12月日更

如何优雅地在Vue页面中引入图片

编程江湖

前端开发

【LeetCode】统计「优美子数组」Java题解

Albert

算法 LeetCode 12月日更

文件写入的6种方法,你知道几种

编程江湖

JAVA开发

详细解读MySQL中的B+Tree 落地形式

秋水

MySQL优化 内容合集 签约计划第二季 B+tree

架构实战 - 毕业总结

咖啡

为什么一半的人员能够完成超过去年的事情?(13/28)

赵新龙

28天写作

react源码解析8.render阶段

buchila11

React

面试官:说说你对react生命周期的理解

全栈潇晨

React

初识 AspectJ ~

阿策小和尚

28天写作 Android 小菜鸟 12月日更

云图说|DRS数据对比——带您随时观测数据一致性

华为云开发者联盟

数据库 华为云 DRS 数据迁移

lancet: 一个全面、高效、可复用的go语言工具函数库

柳叶刀

Go web go modules

架构实战-毕业设计

咖啡

秒杀架构

企业内部控制体系介绍

管理在线

风险管理 内部控制 企业内部控制 内控体系 企业风险管理

企业文化管理体系介绍

管理在线

企业文化 企业文化管理 企业精神

模块六课后作业-拆分电商系统为微服务

断水风春

架构实战营

关于人脸识别的一个应用案例

为自己带盐

人脸识别 28天写作 百度智能云 12月日更

大数据基石之Hadoop的读写流程与2.X架构

编程江湖

大数据 hadoop

冰河整理 深入理解高并发编程 | 内容精选合集

冰河

并发编程 多线程 高并发 内容合集 签约计划第二季

通过Istio重新实现微服务 (一):认识 Istio_云原生_Rinor Maloku_InfoQ精选文章