一、前言

背景:容器化|微服务架构

优势:灵活性|可伸缩性

挑战:通信复杂|流量管理|故障恢复|安全

二、Kubernetes VS Istio Service Mesh

Day10-服务治理-图1

Kubernetes 集群的每个节点都部署了一个 kube-proxy 组件,该组件会与 Kubernetes API Server通信,获取集群中的 service 信息,然后设置 iptables 规则,直接将对某个 service 的请求发送到对应的 Endpoint(属于同一组 service 的 pod)上。

Istio Service Mesh 中沿用了 Kubernetes 中的 service 做服务注册,通过 Control Plane 来生成数据平面的配置(使用 CRD 声明,保存在 etcd 中),数据平面的透明代理(transparent proxy)以 sidecar 容器的形式部署在每个应用服务的 pod 中,这些 proxy 都需要请求 Control Plane 来同步代理配置,之所以说是透明代理,是因为应用 程序容器完全无感知代理的存在,该过程 kube-proxy 组件一样需要拦截流量,只不过kube-proxy 拦截的是进出 Kubernetes 节点的流量,而 sidecar proxy 拦截的是进出该Pod的流量,详见理解 Istio Service Mesh 中 Envoy Sidecar 代理的路由转发。

Service Mesh 的优势:

kube-proxy 的设置都是全局生效的,无法对每个服务做细粒度的控制,而 Service Mesh 通过 sidecar proxy 的方式将 Kubernetes 中对流量的控制从 service 一层抽离出 来,可以做更多的扩展。

三、Service Mesh对比:Istio VS Linkerd

特征 Istio Linkerd
易于安装 各种配置选项和灵活性可能会使团队不知所措 开箱即用的配置,安装相对容易
平台 Kubernetes,虚拟机 Kubernetes
支持的协议 gRPC,HTTP/2,HTTP/1.x,Websocket和所 有TCP流量 gRPC,HTTP/2, HTTP/1.x, Websocket和所有 TCP流量
入口控制器 Envoy,Istio网关本身 Linkerd本身不提供入口功能
多集群和扩展支持 通过各种配置选项支持多集群部署,并可以在 Kubernetes集群外部扩展网格 多群集部署趋于稳定。
Service Mesh接口 (SMI)兼容性 通过第三方CRD 本机用于流量拆分和指标,不用于流量访问控制
监控功能 功能丰富 功能丰富
追踪支持 Jaeger, Zipkin 支持OpenCensus的所有后端
路由功能 各种负载均衡算法(Round-Robin, Random Least Connection), 支持基于百分比的流量 拆分,支持基于报头和路径的流量拆分 支持EWMA负载均衡算法,通过SNI支持 基于百分比的流量拆分
弹性 断路器,重试和超时,故障注入,延迟注入 无断路器,无延迟注入支持
安全 mTLS支持所有协议,可以使用外部CA证书/密钥,支持授权规则。 除TCP之外,还支持 mTLS,可以使用外 部CA /密钥,但尚不支持授权规则
性能 Istio的资源占用量越来越大,延迟得到了改善。 Linkerd的设计非常 轻巧,根据某些第三方基准测试,它比 Istio快3-5倍。
企业支援 不适用于OSS版本。如果您将Google的GKE与 Istio结合使用,或者将Red Hat OpenShift与 Istio作为Service Mesh使用,则可能会得到各 个供应商的支持。 开发了Linkerd OSS 版本的Buoyant提供了完整的企业级工 程,支持和培训

结论:

Service Mesh正在成为云原生解决方案和微服务架构中的重要组成部分。它几乎能够完成所有繁重的工作,例如流量管理,弹性和可观察性,并减轻开发人员对业务逻辑的关注。

Istio和Linkerd都已经成熟,并已被多家企业用于生产环境。对软件项目需求的计划和分 析对于选择要使用的Service Mesh至关重要。

请在起始阶段花费足够的时间做好技术选型,因为在后期再做调整改变会很复杂。

四、初识Istio

4.1 架构图

Day10-服务治理-图2

Istio 是一个开源的服务网格平台,为微服务架构提供了一种可靠的方式来解决服务之间 的通信、安全性、流量管理和观测等问题。

它通过在应用程序部署的边缘注入一个专用的代理(称为 sidecar),来实现对微服务的 控制和管理。

Istio 的工作原理是在服务之间插入代理,这些代理与应用程序部署一起运行,并通过 Envoy 代理来实现。

例如如上:服务之间的通信(比如这里的 Service A 访问 Service B)会通过代理(默认 是 Envoy)来进行。

4.2 核心组件包括

数据平面(Data Plane):数据平面由一组智能代理构成,负责处理真实的网络流量。 每个微服务都有一个 sidecar 代理,它由 Envoy 构成。这些代理通过与彼此通信,形成服务之间的网络网格。

控制平面(Control Plane):控制平面包含用于配置、监视和控制数据平面的组件。 它包含以下核心组件:

  • Pilot:负责服务发现和流量管理,流量管理和智能路由(AB 测试、金丝雀发布 等),以及错误处理(超时、重试、熔断)功能。
  • Citadel:提供服务间的安全和身份验证。Citadel 管理服务之间的安全通信,支持基于证书的身份验证和流量加密。
  • Galley:负责验证、转换和发布配置信息。Galley 将管理员定义的高级配置转换为 底层平台可理解的格式,并将其发布到数据平面中的代理。

通过这些核心组件的协同工作,Istio 实现了以下功能:

  • 服务发现和负载均衡:Istio 可以自动进行服务发现,并通过动态负载均衡在服务之间分配请求流量。
  • 流量控制:Istio 允许您定义丰富的路由规则和策略来管理请求流量,包括分流、故障注入、熔断等。
  • 安全性:Istio 提供了强大的安全功能,包括身份认证、请求授权、流量加密和服务间的安全通信。
  • 观测和遥测:Istio 收集和分析服务之间的流量数据,提供度量、日志和追踪等功能,以便进行监视和故障排查。
  • 策略执行:Istio 可以在服务间执行访问控制策略、配额策略和审计策略,确保服务间的安全和合规性。

五、Istio原理

Istio 的作用原理是拦截 Kubernetes 部署 Pod 的事件,然后从 Pod 中注入一个名为 Envoy 的容器,这个容器会拦截外部到业务应用的流量。由于所有流量都被 Envoy “劫 持” 了,所以 Istio 可以对流量进行分析例如收集请求信息,以及一系列的流量管理操 作,也可以验证授权信息。当 Envoy 拦截流量并执行一系列操作之后,如果请求没问 题,就会转发流量到业务应用的 Pod 中。

Day10-服务治理-图3

【左:普通 Pod;Istio;右:Istio 代理了出入口流量】

当然,由于 Envoy 需要拦截流量之后转发给业务应用,这样就多了一层转发,会导致系统响应速度会有所下降,但是增加的响应时间几乎可以忽略不计

每个 Pod 都有一个 Envoy 负责拦截、处理和转发进出 Pod 的所有网络流量,这种方式 被称为 Sidecar。

以下是 Istio Sidecar 的一些主要功能:

  • 流量管理:Envoy 代理可以根据 Istio 配置的路由规则(如 DestinationRule)实现流量的转发、分割和镜像等功能。
  • 安全通信:Envoy 代理负责在服务之间建立安全的双向 的安全性。

  • 遥测数据收集:Envoy 代理可以收集关于网络流量的详细遥测数据(如延迟、成功率等),并将这些数据上报给 Istio 的遥测组件,以便进行监控和分析。

  • 策略执行:Envoy 代理可以根据 Istio 配置的策略规则(如 RateLimit 和 AuthorizationPolicy)执行限流、访问控制等策略。

由于 Pod 是通过 Envoy 暴露端口的,所有进出口流量都需要经过 Envoy 的检查,所以 很容易判断访问来源,如果请求方不是在 Istio 中的服务,那么 Envoy 便会拒绝访问。

Day10-服务治理-图4

六、为什么使用 Istio?

6.1 核心特性

通过负载均衡、服务间的身份验证、监控等方法,Istio 可以轻松地创建一个已经部署了 服务的网络,而服务的代码只需很少更改甚至无需更改。通过在整个环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信, 然后使用其控制平面的功能来配置和管理 Istio,这包括:

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

6.2 流量管理

Istio 简化了服务级属性(如熔断器、超时和重试)的配置,并且让它轻而易举的执行重要的任务(如 A/B 测试、金丝雀发布和按流量百分比划分的分阶段发布)。有了更好的对流量的可视性和开箱即用的故障恢复特性,就可以在问题产生之前捕获它们,无论面对什么情况都可以使调用更可靠,网络更健壮。

6.3 安全

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

Istio 提供了底层的安全通信通道,并为大规模的服务通信管理认证、授权和加密。有了 Istio,服务通信在默认情况下就是受保护的,可以在跨不同协议和运行时的情况下实施 一致的策略,而所有这些都只需要很少甚至不需要修改应用程序。

Istio 是独立于平台的,可以与 Kubernetes(或基础设施)的网络策略一起使用。但它 更强大,能够在网络和应用层面保护pod到 pod 或者服务到服务之间的通信。

6.4 可观察性

Istio 健壮的追踪、监控和日志特性让您能够深入的了解服务网格部署。

通过 Istio 的监控能力,可以真正的了解到服务的性能是如何影响上游和下游的;而它的定制 Dashboard 提供了对所有服务性能的可视化能力,并让您看到它如何影响其他进程。

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

6.5 平台支持

Istio是一个开源项目,并且广泛支持各种云平台和容器编排工具。它可以与Kubernetes 等容器编排系统紧密集成,以简化部署和管理过程。

此外,Istio还支持多种语言和框架,这让它可以适用于各种技术栈和应用程序类型。

七、总结

Istio是一款开源服务网格平台,以其核心特性、灵活的流量管理、强大的安全功能和全 面的可观察性,提供了对微服务架构的细粒度控制和管理能力。无论在Kubernetes、虚 拟机还是原生环境中,Istio都能提供一致的服务治理,并通过智能代理实现动态负载均 衡、故障注入、熔断等策略,确保服务之间的可靠通信与流量控制。同时,它集成了身 份认证、授权、流量加密等安全机制,以及度量、日志和追踪等可观察性工具,帮助用 户实时监测和排查问题,更好地管理和运营微服务架构。