前言
上篇介绍了服务网格的定义,大家对服务网格也有了一个初步的认识。对于想使用网格的人员来说,有没有具体的落地产品呢?
当然,那就是当今炙手可热的开源项目Istio。
Isitio作为google维护的顶级开源项目,目前已进入CNCF孵化阶段。Istio提供的无侵入的流量治理、开箱即用的可观测以及默认安全能力,彻底解放了业务人员对底层技术的束缚,进而聚焦业务本身。
接下来,让我们一起进入Istio的世界…
一、Isitio概述
首先先回答一下,什么是istio?
参考Istio的官方定义:
Istio 是一个开源服务网格,它透明地进入到现有的分布式应用程序上。 Istio
强大的特性提供了一种统一和更有效的方式来保护、连接和监视服务。 Istio
是实现负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码。
了解了istio的定义,接下来看一下Istio的架构。
二、Istio总体架构
Istio总体架构采用了控制面ControlPlane与数据面DataPlane分离的架构,隔离了故障域,使得两个平面相互独立互不影响。
其中控制平面由Istiod承担,主要负责网格的服务发现、流量规则下发和证书管理;数据平面由Envoy组成,被部署为 Sidecar。这些代理负责协调和控制微服务之间的所有网络通信。它们还收集和报告所有网格流量的遥测数据。控制平面向数据面代理sidecar下发流量配置策略,实现流量路由。官方架构如下:
控制平面大脑Istiod
Istiod 是控制平面的服务,为服务网格提供服务发现、流量规则配置和证书管理功能。
Istiod 将控制流量行为的高级路由规则转换为 Envoy 特定的配置,并在运行时将其传播给 Sidecar。Pilot 提取了特定平台的服务发现机制,并将其综合为一种标准格式,任何符合 Envoy API 的 Sidecar 都可以使用。
数据平面代理Envoy
Istio 使用 Envoy 作为数据面代理。Envoy 是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。Envoy 代理是唯一与数据平面流量交互的 Istio 组件。
Envoy 代理被部署为业务服务的 Sidecar,独立的接收 Istio控制面下发的流量、安全等策略,并提取丰富的遥测数据,接着将这些数据发送到监视系统如Prometeus,jagger等,以提供有关整个网格的拓扑和流量行为信息。
在扩展能力上,首先Envoy代理与业务代码分离部署,向现有业务服务追加额外的 Istio 功能,不需要重新设计业务架构或重写业务代码;其次,Envoy本身内置丰富的流量治理、网络弹性、安全和流量二次扩展模型:
流量控制功能:通过丰富的 HTTP、gRPC、WebSocket 和 TCP 流量路由规则,进行细粒度的流量控制;
网络弹性特性:重试设置、故障转移、熔断器和故障注入;
安全性和身份认证特性:执行安全性策略,并强制实行通过配置 API 定义的访问控制;
基于 WASM的可插拔扩展模型:允许使用WASM插件(WebAssembly)二次开发Envoy,实现自定义的流量解析和业务元数据回写(如http header头中加入用户等级),并且WASM插件支持动态插拔式生效;
再介绍了istio的架构之后,在如此架构之下Istio的核心特性有哪些?
三、Istio核心特性
流量管理
流量管理是Istio最核心的特性之一,提供了丰富的流量管理原子能力。Istio将流量的路由过程高度抽象为Gateway,VirtualService,DestinationRule,ServiceEntry等资源,并通过上述资源的组合编排,实现流量在端到端路由过程中的精细化管控。例如通过配置按用户等级user-level引流的VirtualService策略,实现不同等级的用户精准引流到业务服务的不同版本(稳定版本、灰度版本)。
既然流量管理是Istio的最核心特性,与现有产品如nginx等的流量管理有什么优势呢?
我们先来看一个使用nginx实现蓝绿发布场景的例子:
首先,默认情况下(切流前)用户只访问app部署在生产环境的v1版本,运维人员通过定义nginx.conf配置实现该流量访问规则,具体为:
server配置:定义nginx对外监听的代理端口如8080,用于接收http连接;
location配置:定义端口监听到http的请求连接后,对应http的url的命中规则,如默认url命中规则(即/)为将请求流量转发到mysvr的upstream配置的后端实例,即 {app-v1-ip}:7878;
upstream配置:定义后端实例列表。当location命中后,流量可以访问的后端实例,以及各个实例的流量比例配置。如app-v1的后端实例接收100%的用户流量。
随着app的功能不断迭代,会发布服务的新版本,并上线到生产环境,这就需要蓝绿发布完成生产环境的版本发布。蓝绿发布一般是先部署一个app的新版本如v2,当新版本的基本功能可用后,将用户流量由线上版本v1全部引入到新版本v2。
一般的操作流程是:运维人员先部署app的v2版本,此时由于nginx的转发规则不变,流量并不会进入到v2版本。当v2版本功能正常可以接收流量后,运维人员通过修改nginx.conf中的upstream配置项,追加新的v2后端实例并设置100%引流到v2版本,下发该配置并reload nginx使配置生效;将用户访问流量全部引入到app的v2版本,实现蓝绿切流。
通过上面的蓝绿发布过程可以发现,对于nginx的流量变更操作,存在2个问题:
每次都需要修改nginx.conf配置文件并reload,一旦出现配置文件的语法错误或配置项错误,就会引起nginx的整体不可用导致用户流量中断;
在云原生场景下,服务的后端实例由于弹性的原因会经常发生变化,这就意味着需要有一个nginx的配置系统不断监听、感知后端实例的变化,持续刷新nginx.conf配置文件中的upstream参数然后对nginx进行reload。这也间接说明了nginx的基于配置文件的更新生效机制在云原生场景下,不是很适用;
对于蓝绿发布比较简单的场景,nginx可以通过nginx.conf配置解决,而对于复杂的流量调度场景如按照用户级别切流(匹配用户流量中的header头user-level=lv1)无法简单的通过nginx.conf配置文件解决,一般需要引入插件机制如lua扩展包解决。扩展包需要额外的开发和维护工作,投入成本较大;
那么重点来了,Istio是如何解决上述问题的呢?
还是上面蓝绿发布的案例,Istio只需要简单修改VirtualService和DestinationRule的参数(VirtualService和DestinationRule是Istio在K8s中定义的CRD资源),就可以实现将流量切换到特定的服务版本,并且整个配置的有效性以及下发生效都由istio托管,当后端实例发生变化时,Istio可以自动发现并按照默认的负载均衡策略向新的实例分发流量,如下:
这得益于Istio开箱即用的服务注册发现能力和精细化的流量治理能力,主要体现在:
Istio使用k8s的服务注册发现机制,在后端pod实例发生变化时能够被Istio自动发现,在流量分发环节,通过已定义的负载均衡策略选择后端的pod实例并分发;
Istio将流量的治理抽象为Gateway、VirtualService、DestinationRule、ServiceEntry等模型,分别对应对外暴露的监听端口即网络位置、流量的路由策略、流量接收的抽象实体以及具体的后端实例集合。每个模型分别负责整个流量调度过程的不同环节,例如Gateway只关注对外暴露的端口和允许接收流量的hostname,8080端口只接收test.com的流量
可观察性
Istio 提供了开箱即用的全局监控和调用链分析能力,如服务注册发现信息、服务间流量拓扑、调用链数据等,这些开箱即用的特性,得益于无侵入的sidecar对业务流量的劫持,通过流量的路由以及请求响应情况,绘制全局的流量拓扑和调用链。
调用链:
流量拓扑:
安全
Istio 的安全特性解放了开发人员,使其只需要专注于应用程序级别的安全。Istio 提供了底层的安全通信通道,如服务通信管理认证、授权和加密。有了 Istio,服务通信在默认情况下就是受保护的,可以让您在跨不同协议和运行时的情况下实施一致的策略——而所有这些都只需要很少甚至不需要修改应用程序。
Istio 安全功能提供强大的身份,强大的策略,透明的 TLS 加密,认证,授权和审计(AAA)工具来保护你的服务和数据。Istio 安全的目标是:
默认安全:应用程序代码和基础设施无需更改
深度防御:与现有安全系统集成以提供多层防御
零信任网络:在不受信任的网络上构建安全解决方案
如下,是Istio整体提供的安全能力架构:
总结
今天主要介绍了服务网格的顶级项目Istio的基本概念、整体架构以及核心特性,对于Istio来说,具备了服务网格定义的全部能力,尤其是强大的流量治理能力、开箱即用的监控和调用链的可观测能力以及默认安全的能力。后面的章节会展开每个核心能力,详细讲解如何使用,希望进一步了解Istio的朋友可以继续关注。