系列目录

一、行业现状

简单来说,服务端架构发展经历了4个主要历程:单体架构、SOA架构、微服务架构、云原生架构(服务端架构演进史)。2017年Kubernetes一统虚拟化和容器化技术后,基于 Kubernetes 之上构筑的服务网格(Service Mesh)开始火起来。

服务网格,通过中间人流量劫持的方式,以介乎于应用和基础设施之间的边车代理(Sidecar)来做到既让用户代码可以专注业务需求,不必关注分布式的技术,又能实现几乎不亚于Spring Cloud 的那种通过代码来解决分布式问题的可配置、安全和可观测性。目前服务网格代表作有很多,不列举(背后有极其惨烈的利益斗争,来自云计算大厂的血拼),其中Istio(Google、IBM 和 Lyft 公司联手打造)较为出彩。本系列就从Istio入手,剖析云原生架构。目的就一个:体验一把云原生架构,后续如果真要做云原生架构,也好有个准备。

二、原理概览

2.1 服务网格

2.1.1 概念

2016 年,原 Twitter 基础设施工程师 William Morgan 和 Oliver Gould 在 GitHub 上发布了第一代的服务网格产品 Linkerd,并在很短的时间内围绕着 Linkerd 组建了 Buoyant 公司,担任 CEO 的 William Morgan 发表的文章《What's A Service Mesh? And Why Do I Need One?》中首次正式地定义了“服务网格”(Service Mesh)一词。原文如下:

服务网格(Service Mesh)

A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.

服务网格是一种用于管控服务间通信的基础设施,职责是为现代云原生应用支持网络请求在复杂的拓扑环境中可靠地传递。在实践中,服务网格通常会以轻量化网络代理的形式来体现,这些代理与应用程序代码会部署在一起,对应用程序来说,它完全不会感知到代理的存在。

2.1.2 原理

服务网格是分布式发展至今的最新一代“分布式服务通信架构”。将边车代理统一管控起来实现安全、可控、可观测的通信,将数据平面与控制平面分离开来,实现通用、透明的通信。将“程序”与“网络”进行解耦,将网络可能出现的问题(譬如中断后重试、降级),与可能需要的功能(譬如实现追踪度量)的处理过程从程序中拿出,放到由控制平面指导的数据平面通信中去处理。

1)边车代理Sidecar

一个服务对应一个边车代理(数据平面Data Plane),将网络代理以边车的形式注入到应用容器,强制劫持应用的网络流量。如下图所示:蓝色部分就是Sidecar。

云原生服务网格Istio 云原生服务架构_ide

 

2)服务网格Sevice Mesh

在边车代理模式的基础上,增加一个总的管理器(控制平面Control Plane),用以传递路由管理、服务发现、数据遥测等控制信息。下图中蓝色实线就表示数据平面通信蓝色虚线表示控制平面通信

云原生服务网格Istio 云原生服务架构_ide_02

 

2.2 Istio

2.2.1 Istio的愿景

Istio官网首页一句话概括了Istio的愿景

Simplify observability, traffic management, security, and policy with the leading service mesh.

简化可观测性、流量管理、安全性和领先的服务网格策略。

 

  • 流量管理:Istio 的流量路由规则可以让您很容易的控制服务之间的流量和 API 调用。Istio 简化了服务级别属性的配置,比如熔断器、超时和重试,并且能轻松的设置重要的任务,如 A/B 测试、金丝雀发布、基于流量百分比切分的概率发布等。
  • 安全:提供强大的身份,强大的策略,透明的 TLS 加密,认证,授权和审计(AAA)工具来保护你的服务和数据。Istio 安全的目标是:
  • 默认安全:应用程序代码和基础设施无需更改
  • 深度防御:与现有安全系统集成以提供多层防御
  • 零信任网络:在不受信任的网络上构建安全解决方案
  • 可观测性:Istio 为网格内所有的服务通信生成详细的遥测数据。这种遥测技术提供了服务行为的可观测性,使运维人员能够排查故障、维护和优化应用程序。Istio 生成以下类型的遥测数据:
  • 指标:Istio 基于 4 个监控的黄金标识(延迟、流量、错误、饱和)生成了一系列服务指标。Istio 还为网格控制平面提供了更详细的指标。除此以外还提供了一组默认的基于这些指标的网格监控仪表板。
  • 分布式追踪:Istio 为每个服务生成分布式追踪 span,运维人员可以理解网格内服务的依赖和调用流程。
  • 访问日志:当流量流入网格中的服务时,Istio 可以生成每个请求的完整记录,包括源和目标的元数据。

2.2.2  架构概览

Istio 服务网格从逻辑上分为数据平面控制平面

  • 数据平面 由一组智能代理(Envoy)组成,被部署为 Sidecar。这些代理负责协调和控制微服务之间的所有网络通信。它们还收集和报告所有网格流量的遥测数据。
  • 控制平面 管理并配置代理来进行流量路由。 

云原生服务网格Istio 云原生服务架构_微服务_03

官网对Istio架构描述的很松散,我们采用GitHib上的一段描述:

Istio is an open platform for providing a uniform way to integrate microservices, manage traffic flow across microservices, enforce policies and aggregate telemetry data. Istio's control plane provides an abstraction layer over the underlying cluster management platform, such as Kubernetes.

Istio是一个开放平台,提供统一的方式来集成微服务、管理微服务之间的流量、执行策略和聚合遥测数据。Istio的控制平面在底层集群管理平台(如Kubernetes)上提供了一个抽象层。

Istio is composed of these components:Istio由以下组件组成:

一、Envoy(数据平面) - Sidecar proxies per microservice to handle ingress/egress traffic between services in the cluster and from a service to external services. The proxies form a secure microservice mesh providing a rich set of functions like discovery, rich layer-7 routing, circuit breakers, policy enforcement and telemetry recording/reporting functions.

每个微服务都有Sidecar代理,用于处理集群中服务之间以及服务与外部服务之间的入口/出口流量。代理形成了一个安全的微服务网格,提供了一组丰富的功能,如服务发现、丰富的7层路由、断路器、策略实施和遥测记录/报告功能。

 

二、Istiod(控制平面) - The Istio control plane. It provides service discovery, configuration and certificate management. It consists of the following sub-components:

Istio控制平面。提供服务发现、配置和证书管理功能。它由以下子组件组成:

  • Pilot飞行员 - Responsible for configuring the proxies at runtime.负责在运行时配置代理。
  • Citadel城堡 - Responsible for certificate issuance and rotation.负责证书的发放和轮换。
  • Galley厨房 - Responsible for validating, ingesting, aggregating, transforming and distributing config within Istio.负责在Istio中验证、摄取、聚合、转换和分发配置。

 

三、Operator(操作人) - The component provides user friendly options to operate the Istio service mesh.该组件提供了用户友好的选项来操作Istio服务网格。