Istio+K8s,微服务的双剑合璧!

很多企业都会面临从单体应用向微服务架构的转型,也会衍生出更多的分布式场景需求(www.fscape.com)。随着规模和复杂度的不断增长,如何才能更好的理解、高效的管理服务网格呢?

图片来自 Pexels

本节篇幅较长,我们主要围绕以下几点来展开:

  • 什么是服务网格?
  • 初识 Istio
  • 核心特性
  • 流程架构
  • 核心模块
  • Envoy 进阶
  • 方案畅想

对许多公司来说,Docker 和 Kubernetes 这样的工具已经解决了部署问题,或者说几乎解决了。

但他们还没有解决运行时的问题,这就是服务网格(Service Mesh)的由来。

什么是服务网格?

服务网格(Service Mesh)用来描述组成这些应用程序的微服务网络以及它们之间的交互。

它是一个用于保证服务间安全、快速、可靠通信的网络代理组件,是随着微服务和云原生应用兴起而诞生的基础设施层。

它通常以轻量级网络代理的方式同应用部署在一起。比如 Sidecar 方式,如下图所示:

我们对上图做个解释:Service Mesh 设计一般划分为两个模块,控制面和数据面。对于应用来说,所有流量都会经过数据面进行转发。

顺利转发的前提:数据面需要知道转发的目标地址,目标地址本身是由一些业务逻辑来决定的(例如服务发现)。

所以自然而然地,我们可以推断控制面需要负责管理数据面能正常运行所需要的一些配置:

  • 需要知道某次请求转发去哪里:服务发现配置。
  • 外部流量进入需要判断是否已经达到服务流量上限:限流配置。
  • 依赖服务返回错误时,需要能够执行相应的熔断逻辑:熔断配置。

Serivce Mesh 可以看作是一个位于 TCP/IP 之上的网络模型,抽象了服务间可靠通信的机制。

但与 TCP 不同,它是面向应用的,为应用提供了统一的可视化和控制。

Service Mesh 具有如下优点:

  • 屏蔽分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控追踪、流量控制等等),服务只用关注业务逻辑。
  • 真正的语言无关,服务可以用任何语言编写,只需和 Service Mesh 通信即可。
  • 对应用透明,Service Mesh 组件可以单独升级。

Service Mesh 目前也面临一些挑战:

  • Service Mesh 组件以代理模式计算并转发请求,一定程度上会降低通信系统性能,并增加系统资源开销。
  • Service Mesh 组件接管了网络流量,因此服务的整体稳定性依赖于 Service Mesh,同时额外引入的大量 Service Mesh 服务实例的运维和管理也是一个挑战。

随着服务网格的规模和复杂性不断的增长,它将会变得越来越难以理解和管理。

Service Mesh 的需求包括服务发现、负载均衡、故障恢复、度量和监控等。

Service Mesh 通常还有更复杂的运维需求,比如 A/B 测试、金丝雀发布、速率限制、访问控制和端到端认证。

Service Mesh 的出现,弥补了 Kubernetes 在微服务的连接、管理和监控方面的短板,为 Kubernetes 提供更好的应用和服务管理。

因此,Service Mesh 的代表 Istio 一经推出,就被认为是可以和 Kubernetes 形成双剑合璧效果的微服务管理的利器,受到了业界的推崇。

Istio 提供了对整个服务网格的行为洞察和操作控制的能力,以及一个完整的满足微服务应用各种需求的解决方案。

Istio 主要采用一种一致的方式来保护、连接和监控微服务,降低了管理微服务部署的复杂性。

初识 Istio

Istio 发音「意丝帝欧」,重音在意上。官方给出的 Istio 的总结,简单明了:

  1. Istio lets you connect, secure, control, and observe services.

连接、安全、控制和观测服务。

简单来说,Istio 针对现有的服务网格,提供一种简单的方式将连接、安全、控制和观测的模块,与应用程序或服务隔离开来,从而开发人员可以将更多的精力放在核心的业务逻辑上。

以下是 Istio 的核心功能:

  • HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡。
  • 通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制。
  • 可插入的策略层和配置 API,支持访问控制、速率限制和配额。
  • 对出入集群入口和出口中所有流量的自动度量指标、日志记录和追踪。
  • 通过强大的基于身份的验证和授权,在集群中实现安全的服务间通信。

从较高的层面来说,Istio 有助于降低这些部署的复杂性,并减轻开发团队的压力。

它是一个完全开源的服务网格,作为透明的一层接入到现有的分布式应用程序里。它也是一个平台,拥有可以集成任何日志、遥测和策略系统的 API 接口。

Istio 多样化的特性使我们能够成功且高效地运行分布式微服务架构,并提供保护、连接和监控微服务的统一方法。

核心特性

Istio 以统一的方式提供了许多跨服务网格的关键功能:

①流量管理

Istio 简单的规则配置和流量路由允许我们控制服务之间的流量和 API 调用过程。

Istio 简化了服务级属性(如熔断器、超时和重试)的配置,并且让它轻而易举的执行重要的任务(如 A/B 测试、金丝雀发布和按流量百分比划分的分阶段发布)。

有了更好的对流量的可视性和开箱即用的故障恢复特性,我们就可以在问题产生之前捕获它们,无论面对什么情况都可以使调用更可靠,网络更健壮。

②安全

Istio 的安全特性解放了开发人员,使其只需要专注于应用程序级别的安全。

Istio 提供了底层的安全通信通道,并为大规模的服务通信管理认证、授权和加密。

有了 Istio,服务通信在默认情况下就是受保护的,可以在跨不同协议和运行时的情况下实施一致的策略,而所有这些都只需要很少甚至不需要修改应用程序。

Istio 是独立于平台的,可以与 Kubernetes(或基础设施)的网络策略一起使用。

但它更强大,能够在网络和应用层面保护 Pod 到 Pod 或者服务到服务之间的通信。

③可观察性

Istio 健壮的追踪、监控和日志特性让我们能够深入的了解服务网格部署。通过 Istio 的监控能力,可以真正的了解到服务的性能是如何影响上游和下游的。

而它的定制 Dashboard 提供了对所有服务性能的可视化能力,并让我们看到它如何影响其他进程。

Istio 的 Mixer 组件负责策略控制和遥测数据收集。它提供了后端抽象和中介,将一部分 Istio与后端的基础设施实现细节隔离开来,并为运维人员提供了对网格与后端基础实施之间交互的细粒度控制。

所有这些特性都使我们能够更有效地设置、监控和加强服务的 SLO。当然,底线是我们可以快速有效地检测到并修复出现的问题。

④平台支持

Istio 独立于平台,被设计为可以在各种环境中运行,包括跨云、内部环境、Kubernetes、Mesos 等等。

我们可以在 Kubernetes 或是装有 Consul 的 Nomad 环境上部署 Istio。

Istio 目前支持:

  • Kubernetes 上的服务部署。
  • 基于 Consul 的服务注册。
  • 服务运行在独立的虚拟机上。

⑤整合和定制

Istio 的策略实施组件可以扩展和定制,与现有的 ACL、日志、监控、配额、审查等解决方案集成。

流程架构

Istio 服务网格逻辑上分为数据平面(Control Plane)和控制平面(Data Plane),架构图如下所示:

数据平面(Data Plane)

由一组以 Sidecar 方式部署的智能代理 Envoy 组成。Envoy 被部署为 Sidecar,和对应服务在同一个 Kubernetes pod 中。

这允许 Istio 将大量关于流量行为的信号作为属性提取出来,而这些属性又可以在 Mixer 中用于执行策略决策,并发送给监控系统,以提供整个网格行为的信息。

这些代理可以调节和控制微服务及 Mixer 之间所有的网络通信。

控制平面(Control Plane)

负责管理和配置代理来路由流量,此外配置 Mixer 以实施策略和收集遥测数据。

主要包含如下几部分内容:

  • Mixer:策略和请求追踪。
  • Pilot:提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。
  • Citadel:分发 TLS 证书到智能代理。
  • Sidecar injector:可以允许向应用中无侵入的添加功能,避免为了满足第三方需求而添加额外的代码。

核心模块

上文提到了很多技术名词,我们需要重点解释一下:

①什么是 Sidecar 模式?

Sidecar 是一种将应用功能从应用本身剥离出来作为单独进程的设计模式,可以允许向应用中无侵入的添加功能,避免为了满足第三方需求而添加额外的代码。

在软件架构中,Sidecar 附加到主应用,或者叫父应用上,以扩展、增强功能特性,同时 Sidecar 与主应用是松耦合的。

Sidecar 是一种单节点多容器的应用设计形式,主张以额外的容器来扩展或增强主容器。

②Envoy 的作用是什么?

Envoy 是一个独立的进程,旨在与每个应用程序服务器一起运行。

所有 Envoy组成了一个透明的通信网格,其中每个应用程序发送和接收来自本地主机的消息,并且不需要知道网络拓扑。

与传统的服务通信服务的库方法相比,进程外架构有两个实质性好处:

  • Envoy 支持任何编程语言写的服务。只用部署一个 Envoy 就可以在 Java、C++、Go、PHP、Python 等服务间形成网格。
  • 任何使用过大型面向服务的体系结构的人都知道,部署库升级可能会非常痛苦。Envoy 可以在整个基础设施中迅速部署和升级。

Envoy 以透明的方式弥合了面向服务的体系结构使用多个应用程序框架和语言的情况。

③Mixer

Mixer 是一个独立于平台的组件,负责在服务网格上执行访问控制和使用策略,并从 Envoy 代理和其他服务收集遥测数据,代理提取请求级属性,发送到 Mixer 进行评估。有关属性提取和策略评估的更多信息,请参见 Mixer 配置。

Mixer 中包括一个灵活的插件模型,使其能够接入到各种主机环境和基础设施后端,从这些细节中抽象出 Envoy 代理和 Istio 管理的服务。

④Pilot

控制面中负责流量管理的组件为 Pilot,它为 Envoy Sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。

它将控制流量行为的高级路由规则转换为特定于 Envoy 的配置,并在运行时将它们传播到 Sidecar。

⑤Istio 如何保证服务通信的安全?

Istio 以可扩缩的方式管理微服务间通信的身份验证、授权和加密。Istio 提供基础的安全通信渠道,使开发者可以专注于应用层级的安全。

Istio 可以增强微服务及其通信(包括服务到服务和最终用户到服务的通信)的安全性,且不需要更改服务代码。

它为每个服务提供基于角色的强大身份机制,以实现跨集群、跨云端的互操作性。

如果我们结合使用 Istio 与 Kubernetes(或基础架构)网络政策,Pod 到 Pod 或服务到服务的通信在网络层和应用层都将安全无虞。

Istio 以 Google 的深度防御策略为基础构建而成,以确保微服务通信的安全。

当我们在 Google Cloud 中使用 Istio 时,Google 的基础架构可让我们构建真正安全的应用部署。

Istio 可确保服务通信在默认情况下是安全的,并且我们可以跨不同协议和运行时一致地实施安全政策,而只需对应用稍作调整,甚至无需调整。

Envoy 进阶

Istio 使用 Envoy 代理的扩展版本,Envoy 是以 C++ 开发的高性能代理,用于调解服务网格中所有服务的所有入站和出站流量。

Envoy 的许多内置功能被 Istio 发扬光大,例如:

  • 动态服务发现
  • 负载均衡
  • TLS 终止
  • HTTP2 & gRPC 代理
  • 熔断器
  • 健康检查、基于百分比流量拆分的灰度发布
  • 故障注入
  • 丰富的度量指标

Envoy 分为主线程、工作线程、文件刷新线程,其中主线程就是负责工作线程和文件刷新线程的管理和调度。

而工作线程主要负责监听、过滤和转发,工作线程里面会包含一个监听器,如果收到一个请求之后会通过过滤链来进行数据过滤。

前面两个都是非阻塞的,唯一一个阻塞的是这种 IO 操作的,会不断地把内存里面一些缓存进行落盘。

总结来说,我们可以围绕如下五方面:

①服务的动态注册和发现

Envoy 可以选择使用一组分层的动态配置 API 来进行集中管理。

这些层为 Envoy 提供了动态更新,后端群集的主机、后端群集本身、HTTP 路由、侦听套接字和通信加密。

为了实现更简单的部署,后端主机发现可以通过 DNS 解析 (甚至完全跳过) 完成,层也可以替换为静态配置文件。

②健康检查

构建 Envoy 网格的建议方法是将服务发现视为最终一致的过程。Envoy 包括一个运行状况检查子系统,该子系统可以选择对上游服务集群执行主动运行状况检查。

然后,Envoy 使用服务发现和运行状况检查信息的联合来确定健康的负载均衡服务器。Envoy 还支持通过异常检测子系统进行被动运行状况检查。

③高级负载均衡

分布式系统中不同组件之间的负载平衡是一个复杂的问题。

由于 Envoy 是一个独立的代理而不是库,因此它能够在一个位置实现高级负载平衡技术,并使任何应用程序都可以访问。

目前 Envoy 包括支持自动重试、断路、通过外部速率限制服务限制全局速率、请求隐藏和异常值检测。未来计划为 Request Racing 提供支持。

④前端/边缘系统代理支持

虽然 Envoy 主要是为服务通信系统而设计的,但对前端/边缘系统也是很有用的,如:可观测性、管理、相同的服务发现和负载平衡算法等。

Envoy 包含足够的功能,使其可用作大多数 Web 应用服务用例的边缘代理。这包括作为 TLS 的终点、HTTP/1.1 和 HTTP/2 支持,以及 HTTP L7 路由。

⑤最好的观察统计能力

Envoy 的首要目标是使网络透明。但是在网络级别和应用程序级都无法避免的容易出现问题。

Envoy 包含了对所有子系统的强有力的统计支持。statsd 和其他兼容的数据提供程序是当前支持的统计接收器,插入不同的统计接收器也并不困难。

Envoy 可以通过管理端口查看统计信息,还支持通过第三方供应商进行分布式追踪。

更多详情请参考:什么是 Envoy?

  1. https://www.jianshu.com/p/a6f7f46683e1?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

方案畅想

应用上面的原理,我们可以有很多具体的方案应用于日常开发。

方案一:应用 Istio 改造微服务

模仿在线书店的一个分类,显示一本书的信息。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

应用的端到端架构:Bookinfo 应用中的几个微服务是由不同的语言编写的。

这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。

用 Istio 改造后架构如下:要在 Istio 中运行这一应用,无需对应用自身做出任何改变。我们只需要把 Envoy Sidecar 注入到每个服务之中。

最终的部署结果将如下图所示:

所有的微服务都和 Envoy Sidecar 集成在一起,被集成服务所有的出入流量都被 Sidecar 所劫持。

这样就为外部控制准备了所需的 Hook,然后就可以利用 Istio 控制平面为应用提供服务路由、遥测数据收集以及策略实施等功能。

更多细节,请移步官网示例:

  1. https://istio.io/latest/zh/docs/examples/bookinfo/

方案二:用 Istio 改造 CI/CD 流程

对上述流程图简单解释一下:

  • 通过 Docker 对代码进行容器化处理。
  • 通过 Gitlab 托管代码。
  • Jenkins 监听 Gitlab 下的代码,触发自动构建,并执行 Kustomize 文件。
  • Kustomize 通过配置文件,设置了 Istio 的配置(染色识别、流量分发),并启动 K8s 部署应用。
  • 最终我们通过 Rancher 来对多容器进行界面化管理。
  • 打开浏览器进行访问。

看到这里,相信你也了解了,我们实现了一个前端多容器化部署的案例。

它有什么意义呢?

  • 首先,当然是环境隔离了,研发每人一个容器开发,互不干扰。
  • 其次,我们可以做很多小流量、灰度发布等事情。
  • 自动化部署,一站式的流程体验。

如果你对容器化还不太了解,请先看看前面两篇文章:

  • Docker 边学边用
  • 一文了解 Kubernetes

Istio 还是有很多可圈可点的地方,相信看到这里你也有了更全面的认识。如果你想深入了解,不妨仔细研究官方示例,并且在实际项目中不断打磨。

参考资料:

  • Istio 官网
  • 什么是 Envoy
  • 微服务之 Service Mesh
  • 什么是 Service Mesh
  • Istio 如何连接、管理和保护微服务 2.0?
  • 在 MOSN 中玩转 dubbo-go

主营产品:建筑供暖设施,复合管,钢管,无缝管,保温、隔热材料,冷热水系统,发泡设备,管道用管