本文最初发表于 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 是如何实现重试和断路器的
简单总结一下:
Envoy 发送请求给服务 B 的第一个实例,不过调用失败了;
Envoy Sidecar 会进行重试;(1)
失败的请求返回发起调用的代理;
开启断路器并在随后的请求中调用下一个服务。(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 所提供的功能而已。
我们已经讲了太多的理论,接下来的内容我们将知识转化为实践。
评论