导读:Bob从图书馆出来,巧遇学霸学长....
这是证书文件:
早在去年,Service Mesh 这个概念就开始火起来了,今年的时候 Service Mesh 更是爆发式地发展,Service Mesh 中的明星项目 Istio 更是只用了几个月的时间就已经从 0.1 到了 1.0 LTS 了。由于工作和毕业的压力,之前一直没有时间深入研究 Service Mesh。现在稍微有些时间了,所以打算写点什么关于 Service Mesh 的。
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),并且支持自定义的组件和集成。
Istio 是两层架构的,分别是数据层和控制层:
数据层是由所有的部署为 sidecar 的 Envoy 所组成的。
控制层有三个组件:Pilot、Mixer 和 Citadel,顾名思义是用来控制 Service Mesh 的行为的。
总体的架构如下图:
Istio 用了一个扩展版本的 Envoy 作为底层的代理。Envoy 是一个用 C++ 开发的高性能的代理,具有非常多功能,具体的可以参考官方文档,在此不做赘述。
Envoy 在 Istio 中是以 sidecar 模式部署在 pod 里面的,Istio 通过控制 Envoy 来控制所有的流量,获取监控数据等。
Pilot 为 Envoy 提供服务发现、智能路由(如 AB 测试、金丝雀部署)和弹性流量管理功能(如超时、重试、熔断)。它负责将高层的抽象的路由规则转化成低级的 envoy 的配置。
Mixer 是一个平台无关的组件,用来控制访问策略和使用策略,同时会收集监控信息,将收集到的信息传给用户可以自定义的后端进行处理。
Citadel 提供了服务间和服务到终端用户的认证,同时可以直接将 http 流量升级成 https 流量。具体的可以查看官方文档。
在这里我打算使用 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)。
我们的样例应用叫做 BookInfo,这个应用由四个微服务所组成,具体架构图如下:
这个应用是用不同的语言所写的,让我们来见识一下 Istio 的魔力吧。
安装这个应用非常简单,我们只要执行以下命令即可:
我们可以注意一下,在bookinfo.yaml中的 manifest 如下:
但是我们真正部署出来后,变成了这样:
可以看到,本来只有一个 container 的,现在里面多了一个 container 和 initContainer。这个就是 Istio 的 Auto Injection,可以自动把 sidecar 注入到 Pod 里面,让我们不需要手动一个一个修改 yaml 文件,也防止手动修改过程中出错的可能。
使用实例
这里我们以路由设置为例子。
首先我们打开刚才部署好的这个应用的网页,可以看到页面右方的 Book Reviews 部分里面每次刷新都会随机性地出现黑星星、红星星和没有星星三种情况,这是因为我们有三个不同的 backend,路由在默认情况下会随机路由到任意一个 backend 上。
我们先尝试把所有的路由都路由到 v1 版本上(就是没有星星的版本),路由规则如下:
命令如下:
然后我们再去刷新,就会发现不管怎么刷新星星都不见了。
接着,假如我们有一个用户是 jason,我们希望他能测试 v2 的 backend,就可以用下面的路由规则:
命令如下:
这时候,我们打开网页,以 jason 这个用户登录(密码随便填),就会发现每一次访问到的都是带有黑星星的版本。
这就是 Istio 提供的路由功能。
想要了解更多可以直接访问官网 https://istio.io/
领取专属 10元无门槛券
私享最新 技术干货