浅析 service mesh & istio

在云原生架构下,容器的使用给予了异构应用程序的更多可行性,Kubernetes 增强了应用的横向扩容能力,用户可以快速的编排出复杂环境、复杂依赖关系的应用程序,Istio可以使开发者又无须过分关心应用程序的监控、扩展性、服务发现和分布式追踪这些繁琐的事情而专注于程序开发,赋予开发者更多的创造性。

作者 guoxudong 发表于 2019年3月20日 更新于 2023年1月10日

前言

公司于18年10月正式确认服务容器化,到18年12月4日第一个服务正式部署到生产环境kubernetes集群,再到如今已有23个服务完成了生产环境容器化的切换,更多的服务在测试环境容器化部署随时可以切换到生产环境。目前新项目的开发,大部分都直接在测试环境容器化部署,不再需要新购ECS搭建测试环境。随着容器化的深入,服务间的通信和联系变的更加复杂,其中通信的可视化、流量的控制和服务质量的评估问题日益凸显,成为了微服务方案的短板。这个时候Service mesh就进入了我们的视野。

Service mesh是什么

Service mesh 又译作 “服务网格”,作为服务间通信的基础设施层。随着规模和复杂性的增长,服务网格越来越难以理解和管理。它的需求包括服务发现、负载均衡、故障恢复、指标收集和监控以及通常更加复杂的运维需求,例如 A/B 测试、金丝雀发布、限流、访问控制和端到端认证等。它负责通过包含现代云原生应用程序的复杂服务拓扑来可靠地传递请求。实际上,服务网格通常通过一组轻量级网络代理来实现,这些代理与应用程序代码一起部署,而不需要感知应用程序本身。

**这里注意:**istio只是Service mesh服务网格的一种。

服务网格的特点

服务网格有如下几个特点:

  • 应用程序间通讯的中间层
  • 轻量级网络代理
  • 应用程序无感知
  • 解耦应用程序的重试/超时、监控、追踪和服务发现

目前两款流行的服务网格开源软件 LinkerdIstio 都可以直接在 Kubernetes 中集成,其中 Linkerd 已经成为 CNCF 成员,Istio 在 2018年7月31日发布 1.0。

服务网格的发展历史

  • Spring Cloud

    Spring Cloud 诞生于2015年,Spring Cloud 最早在功能层面为微服务治理定义了一系列标准特性,比如:智能路由、服务熔断、服务注册于发现等这些名词我最早看到都是在 Sprint Cloud 相关文章中。同时也有一些缺点,比如:需要在代码级别对诸多组件进行控制,并且都依赖于 Java 的实现,这与微服务的多语言协作背道而驰;没有对资源的调度、devops等提供相关支持,需要借助平台来完成;众所周知的Eureka闭源等。

  • Linkerd

    Service mesh 这个命名就是来源于Linkerd。Linkerd 很好地结合了 kubernetes 所提供的功能,于2017年加入CNCF。

  • Istio

    2017年5月, Google、 IBM 和 Lyft 宣布了Istio的诞生。一经发布,便立即获得Red Hat、F5等大厂响应,社区活跃度高涨,很快超越了 Linkerd,成为了 Service mesh 的代表产品。

  • 国内服务网格

    这里不得不提的是国内服务网格的兴起,在 Service mesh 概念具体定义以前,国内的许多厂商就已经开始了微服务进程,同时在做自己的微服务治理产品。而在 Service mesh 概念普及之后,厂商意识到了自己产品也具有 Service mesh 的特点,将自己的服务治理平台进行了改造和完善,推出了自己的 Service mesh 产品。例如,微博、腾讯和华为都有自己的服务网格产品,华为更是已经将产品投入到公有云中进行商业应用。蚂蚁金服的 SOFAMesh 则是针对大流量的生产场景,在 Istio 的架构基础上进行修改并推广。

Istio又是什么

Istio 提供了一个完整的解决方案,通过为整个服务网格提供行为洞察和操作控制来满足微服务应用程序的多样化需求。Istio 允许您连接、保护、控制和观测服务。在较高的层次上,Istio 有助于降低这些部署的复杂性,并减轻开发团队的压力。它是一个完全开源的服务网格,可以透明地分层到现有的分布式应用程序上。它也是一个平台,包括允许它集成到任何日志记录平台、遥测或策略系统的 API。Istio 的多样化功能集使您能够成功高效地运行分布式微服务架构,并提供保护、连接和监控微服务的统一方法。

Istio的架构

Istio总的来说由两部分组成:控制平面数据平面

  • 数据平面由一组以 sidecar 方式部署的智能代理(Envoy)组成。sidecar通过注入的方式和业务容器共存于一个 Pod 中,会劫业务容器的流量,接受控制面组件的控制,可以调节和控制微服务及 Mixer 之间所有的网络通信。
  • 控制平面是 Istio 的核心,负责管理和配置代理来路由流量。此外控制平面配置 Mixer 以实施策略和收集遥测数据。

下图显示了构成每个面板的不同组件: image

Envoy

Istio 使用 Envoy 代理的扩展版本,Envoy 是以 C++ 开发的高性能代理,用于调解服务网格中所有服务的所有入站和出站流量。Envoy 的许多内置功能被 Istio 发扬光大,例如:

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

Envoy 被部署为 sidecar,和对应服务在同一个 Kubernetes pod 中。这允许 Istio 将大量关于流量行为的信号作为属性提取出来,而这些属性又可以在 Mixer 中用于执行策略决策,并发送给监控系统,以提供整个网格行为的信息。

Sidecar 代理模型还可以将 Istio 的功能添加到现有部署中,而无需重新构建或重写代码。可以阅读更多来了解为什么我们在设计目标中选择这种方式。

Mixer

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

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

Pilot

Pilot 为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。它将控制流量行为的高级路由规则转换为特定于 Envoy 的配置,并在运行时将它们传播到 sidecar。

Pilot 将平台特定的服务发现机制抽象化并将其合成为符合 Envoy 数据平面 API 的任何 sidecar 都可以使用的标准格式。这种松散耦合使得 Istio 能够在多种环境下运行(例如,Kubernetes、Consul、Nomad),同时保持用于流量管理的相同操作界面。

Citadel

Citadel 通过内置身份和凭证管理赋能强大的服务间和最终用户身份验证。可用于升级服务网格中未加密的流量,并为运维人员提供基于服务标识而不是网络控制的强制执行策略的能力。从 0.5 版本开始,Istio 支持基于角色的访问控制,以控制谁可以访问您的服务,而不是基于不稳定的三层或四层网络标识。

Galley(1.1版本新增)

Galley 代表其他的 Istio 控制平面组件,用来验证用户编写的 Istio API 配置。随着时间的推移,Galley 将接管 Istio 获取配置、 处理和分配组件的顶级责任。它将负责将其他的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节中隔离开来。

结语

在云原生架构下,容器的使用给予了异构应用程序的更多可行性,Kubernetes 增强了应用的横向扩容能力,用户可以快速的编排出复杂环境、复杂依赖关系的应用程序,Istio可以使开发者又无须过分关心应用程序的监控、扩展性、服务发现和分布式追踪这些繁琐的事情而专注于程序开发,赋予开发者更多的创造性。

参考