Dawn's Blogs

分享技术 记录成长

0%

Istio学习笔记 (1) 理解Istio

Istio 介绍

服务网格

服务网格(Service mesh),作为服务间通信的基础设施层。与应用部署一起,但对应用透明。应用作为服务的发起方,只需要用最简单的方式将请求发送给本地的服务网格代理,然后网格代理会进行后续的操作,如服务发现,负载均衡,最后将请求转发给目标服务。

服务网格目的是解决系统架构微服务化后的服务间通信和治理问题。服务网格由 Sidecar 节点组成,实现了数据面和控制面的解耦。服务网格的功能旨在实现以下方面:

  • 流量控制:包括两个方面:
    • 流量管理:服务发现、服务注册、负载均衡、路由等。
    • 弹性:超时、重试、熔断等。
  • 可观测性:指标、分布式追踪、日志。
  • 安全性:服务间访问控制、加密通信。

Istio 是什么

Istio 是由谷歌、IBM 和 Lyft 创建的服务网格开源实现,以透明的方式向服务架构中添加流量控制、可观测性、安全性。Istio 由一个控制平面和基于 Envoy 的数据平面组成。

服务网格与 SOA 中企业服务总线(ESB)之间的关系:

相同点:在架构中,不论是服务网格还是 ESB,对于应用来说都是透明的,应用程序不应该感知到。并且,ESB 与服务网格之间功能重合,如都提供重试、超时、熔断、服务发现、负载均衡。

不同点:

  • ESB 非常集中化的部署,而服务网格是分布式的部署,sidecar 与应用程序一起被分布式的部署在集群中。
  • ESB 非常复杂,提供了业务转换、服务编排等不属于服务网格的职责,也就是 ESB 基于复杂的专有供应商软件。

服务网格和 API 网关之间的关系:

相同点:都具有服务发现、可见性、安全、流量管理等特性(二者之间的用途有重叠)。

不同点:

  • API Gateway 主要的作用是暴露 API 给外部,API 通过调用下游的组合或者单个微服务的方式,来提供业务逻辑。
  • 而服务网格仅仅是服务之间的基础设施,不了解应用中的业务逻辑。

所以,可以将 API Gateway 和 Service Mesh 一起部署。API Gateway 负责应用逻辑,Service Mesh 负责服务发现、可见性等服务基础设施(可能会影响性能,多了本地连接的时间,但是可以通过水平扩展来弥补)。

数据平面通过代理(Envoy)拦截微服务架构集群中的所有网络流量,与每个服务一起部署,提供流量管理、可观测性等功能。

控制平面提供 API 供运维人员配置数据平面,动态的对数据平面进行配置。

基本特性

Istio 透明的为微服务之间提供了三个特性,流量管理、可观测性、安全性。

流量管理

  • 流量管理:
    • 路由规则:Istio 提供流量路由规则,可以控制服务之间的流量和 API 调用。
    • 简化服务级别属性的配置:提供熔断器、超时、重试机制,透明的为服务增加弹性
    • 可设置重要任务:可以进行 A/B 测试、canary 部署和基于百分比流量分割的分阶段部署。
    • 开箱即用的故障恢复:使得应用更健壮地应对网络或者服务故障。

可观测性

  • 可观测性:为服务网格内的所有通信生成详细的遥测数据。这种遥测技术提供了服务行为的可观测性,使开发者能够排除故障、维护和优化其应用。 更好的是,它对于服务来说是透明的,不会为开发带来负担。

Istio 的遥测技术包括详细的指标分布式跟踪和完整的访问日志

安全性

  • 安全性:包括全面的安全解决方案,Istio 提供了强大的身份、强大的策略、透明的 TLS 加密,以及验证、授权和审计(AAA)工具来保护服务和数据。

架构

Istio 分为数据平面和控制平面,数据平面为 Proxy,控制平面为 istiod:

  • Proxy:位于数据平面,即边车代理,与应用服务以 Sidecar 方式部署在同一个 Pod 中。实际上包括 istio-proxy 和 pilot-agent 两部分,它们以两个不同的进程部署在同一个容器 istio/proxy 中。
    • istio-proxy:是 Istio 基于 Envoy 新增的一些扩展,istio 默认使用 Envoy。
    • polit-agent:负责管理 istio-proxy 的整个生命周期,具体包括 istio-proxy 的启动参数和配置文件,负责管理 istio-proxy 的启动过程、运行状态监控以及重启等。poilt-agent 将会以子进程的方式启动 istio-proxy,并监控 istio-proxy 的运行状态。
  • Istiod:自 Istio 1.5 版本开始,控制平面由原来分散、独立部署的三个组件(Pilot、Citadel、Galley)整合为一个独立的 istiod,变成了一个单进程、多模块的组织形态,极大的降低了原来部署的复杂度。
    • Pilot:负责 Istio 数据平面的 xDS 配置管理(实际上指的是 polit-discovery)。
    • Citadel:负责安全证书的管理和发放,可以实现授权和认证等操作。
    • Galley:是 istio 1.1 版本引入的配置管理组件,主要负责配置的验证、提取和处理等功能。其目的是将 Istio 和底层平台(如 Kubernetes)进行解耦。

Istio架构图

补充 - 服务发布策略

上文提到了 A/B 测试、canary(金丝雀)发布,本节说一说常用的发布策略,包括蓝绿发布、金丝雀发布。

A/B 测试是效果测试,如测试不同功能的实际效果(如转化率、订单情况),这些功能有差异但是没有新旧之分。

蓝绿发布

蓝绿发布需要对服务的新版本进行冗余部署,一般新版本的机器规格和数量与旧版本保持一致,相当于该服务有两套完全相同的部署环境,新版本作为热备。

服务版本升级时,只需将流量全部切换到新版本即可,旧版本作为热备。

如果新版本上线后出现严重的程序 BUG,那么只需将流量全部切回至旧版本,大大缩短故障恢复的时间。待新版本完成 BUG 修复并重新部署之后,再将旧版本的流量切换到新版本。

img

金丝雀发布

金丝雀发布的思想则是将少量的请求引流到新版本上。验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用。

金丝雀发布的流量选择有多种策略:随机样本策略(随机引入)、狗粮策略(就是内部用户或员工先尝鲜)、分区策略(不同区域用户使用不同版本)、用户特征策略(根据用户特征选择版本)。

img

A/B 测试

A/B 测试与发布没什么关系,A/B测试是效果测试,如测试不同功能的实际效果(如转化率、订单情况),这些功能有差异但是没有新旧之分。

A/B测试时,线上同时运行多个版本的服务,这些服务通常会有一些体验上的差异,譬如说页面样式、颜色、操作流程不同。

A/B 测试基于用户请求的元信息将流量路由到新版本,基于请求内容匹配。只有匹配特定规则的请求才会被引流到特定版本,常见的做法包括基于 Http Header 和 Cookie。

基于 Http Header 方式的例子,例如 User-Agent 的值为 Android 的请求可以访问一个版本,其他系统仍然访问另一个版本。

基于 Cookie 方式的例子,例如普通用户可以访问一个版本,VIP 用户仍然访问另一个版本。

相关人员通过分析各个版本服务的实际效果,选出效果最好的版本

A/B 测试中,需要预估中匹配特定规则的请求规模,然后按需为新版本分配额外的机器资源。

img