82

小黄人学 Service Mesh 之 Istio

 5 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzI5ODQ2MzI3NQ%3D%3D&%3Bmid=2247484901&%3Bidx=1&%3Bsn=bea8e3847cb95555881a7b5d3f7d8e72&%3Butm_source=tuicool&%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

M7NRBr3.gif

导读:Bob从图书馆出来,巧遇学霸学长....

BvYfuuE.jpg!web

FVremi7.jpg!web

这是证书文件:

IfmuyuR.jpg!web

qEV7byi.jpg!web

A3YFjie.jpg!web

JBFjyei.jpg!web

aaiUR3n.jpg!web

早在去年,Service Mesh 这个概念就开始火起来了,今年的时候 Service Mesh 更是爆发式地发展,Service Mesh 中的明星项目 Istio 更是只用了几个月的时间就已经从 0.1 到了 1.0 LTS 了。由于工作和毕业的压力,之前一直没有时间深入研究 Service Mesh。现在稍微有些时间了,所以打算写点什么关于 Service Mesh 的。

ZV3mEzY.jpg!web

3qINNbZ.jpg!web

Istio 的背景我不过多介绍,G 家等大厂搞出来并且在后面推动支持的肯定不会弱。

根据 Istio 的官方文档,是这么定义自己的:一个用来连接、管理和加密微服务(流量)的开放平台。

an open platform to connect, manage, and secure microservices

Istio 可以让你在不修改微服务源代码的情况之下,很轻松地给微服务加上诸如负载均衡、身份验证、监控等等的功能。Istio 通过在你的微服务中部署一个 sidecar 作为所有流量的代理来达成这个目标。

总结下来,Istio 提供了以下功能:

  • 流量管理(Traffic Management)

  • 服务的身份认证和安全(Service Identity and Security)

  • 策略配置(Policy Enforcement)

  • 遥感(Telemetry)

除了这些之外,Istio 还支持很多不同的平台(尤其是 Kubernetes),并且支持自定义的组件和集成。

ZJZZze7.jpg!web

VvABZru.jpg!web

Istio 是两层架构的,分别是数据层和控制层:

数据层是由所有的部署为 sidecar 的 Envoy 所组成的。

控制层有三个组件:Pilot、Mixer 和 Citadel,顾名思义是用来控制 Service Mesh 的行为的。

总体的架构如下图:

JJrMJry.jpg!web

au6zuqR.jpg!web

AV77Bb3.jpg!web

Istio 用了一个扩展版本的 Envoy 作为底层的代理。Envoy 是一个用 C++ 开发的高性能的代理,具有非常多功能,具体的可以参考官方文档,在此不做赘述。

Envoy 在 Istio 中是以 sidecar 模式部署在 pod 里面的,Istio 通过控制 Envoy 来控制所有的流量,获取监控数据等。

VviuiqF.jpg!web

Pilot 为 Envoy 提供服务发现、智能路由(如 AB 测试、金丝雀部署)和弹性流量管理功能(如超时、重试、熔断)。它负责将高层的抽象的路由规则转化成低级的 envoy 的配置。

Mixer 是一个平台无关的组件,用来控制访问策略和使用策略,同时会收集监控信息,将收集到的信息传给用户可以自定义的后端进行处理。

Citadel 提供了服务间和服务到终端用户的认证,同时可以直接将 http 流量升级成 https 流量。具体的可以查看官方文档。

MJFrQb6.jpg!web

QFzIRny.jpg!web

在这里我打算使用 helm 进行安装。

Prerequisite

首先,你得有一个可运行的 Kubernetes 集群,我是在 GKE上开了一个三节点的集群作为测试使用。

其次,你得需要有 helm 的客户端。mac 用户可以通过 brew 来安装。

下载 release

Istio 提供了一个很方便的脚本来下载并解压最新版的 Istio,如下:

等下载完之后,我们可以进入文件夹,并把 bin 目录加到 path 里面:

使用 helm 进行安装

要使用 helm 来安装 istio,首先需要在集群里面配置好 helm 和 tiller,如下:

等 helm 和 tiller 配置完之后,就可以使用 helm 来一键安装 Istio 了:

这样,Istio 就安装好了。

为了验证安装是否成功,我们可以看一下是否部署了以下的 service:

并且确认以下的 Pod 是否在 running 状态:

当然,我们也可以自定义一些参数,具体的请看官方文档 –name istio –namespace istio-system)。

VbEfmuA.jpg!web

我们的样例应用叫做 BookInfo,这个应用由四个微服务所组成,具体架构图如下:

Qfqyymz.jpg!web

这个应用是用不同的语言所写的,让我们来见识一下 Istio 的魔力吧。

安装这个应用非常简单,我们只要执行以下命令即可:

我们可以注意一下,在bookinfo.yaml中的 manifest 如下:

但是我们真正部署出来后,变成了这样:

可以看到,本来只有一个 container 的,现在里面多了一个 container 和 initContainer。这个就是 Istio 的 Auto Injection,可以自动把 sidecar 注入到 Pod 里面,让我们不需要手动一个一个修改 yaml 文件,也防止手动修改过程中出错的可能。

使用实例

这里我们以路由设置为例子。

首先我们打开刚才部署好的这个应用的网页,可以看到页面右方的 Book Reviews 部分里面每次刷新都会随机性地出现黑星星、红星星和没有星星三种情况,这是因为我们有三个不同的 backend,路由在默认情况下会随机路由到任意一个 backend 上。

我们先尝试把所有的路由都路由到 v1 版本上(就是没有星星的版本),路由规则如下:

命令如下:

然后我们再去刷新,就会发现不管怎么刷新星星都不见了。

接着,假如我们有一个用户是 jason,我们希望他能测试 v2 的 backend,就可以用下面的路由规则:

命令如下:

这时候,我们打开网页,以 jason 这个用户登录(密码随便填),就会发现每一次访问到的都是带有黑星星的版本。

这就是 Istio 提供的路由功能。

qmuYF3m.jpg!web

想要了解更多可以直接访问官网 https://istio.io/ 

BrM7JrQ.jpg!web7F3EniN.jpg!web

fA7FNjZ.jpg!web

推荐阅读


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK