Istio流控,服务发现,负载均衡,核心流程是如何实现的?

开发 开发工具 架构
灰度发布的过程在《Istio,灰度发布》一文中已经有过描述,今天重点说说Pilot和Envoy的交互流程与内部结构。

前情提要:

Istio架构体系中,流控(Traffic Management)虽然是数据平面的Envoy Proxy实施的,但整个架构的核心其实在于控制平面的Pilot。

灰度发布的过程在《Istio,灰度发布》一文中已经有过描述,今天重点说说Pilot和Envoy的交互流程与内部结构。

[[267516]]

一、通用交互流程

图示:

  • 灰色圆形,为业务服务
  • 紫色六边形,为Envoy代理

二者相生相伴。

起初,上游调用方ServiceA访问下游服务提供方ServiceB的V1版本,在ServiceB的V2版本部署好之后,调用方如何知道“SvcA切分1%的流量至SvcB的V2版本”这个指令的呢?

整个过程主要分为三大步骤:

  • 用户在控制平面的后台,通过Pilot的API,修改A到B的路由策略(标号1);
  • Pilot将路由策略固化存储,以便未来新注册的调用方A能够知道当前***的路由策略;对于已经存在的调用方A,Pilot则通过主动通知的方式告之调用方A对应的Envoy(标号2);
  • Envoy作为数据平面,实施***的路由策略(标号3),在本例中,即将1%的流量导给灰度版本Bv2;

二、服务发现与负载均衡

讲了通用的流控策略实施通用流程,而服务发现与负载均衡,只是一个种策略实施的特例:

  • 提供服务的SvcB新增一个Pod(标号1);
  • 在Pilot后台修改SvcB的集群配置(标号2);
  • Pilot将SvcB的***信息同步给该配置的订阅方(标号3),即SvcB的调用方SvcA对应的Proxy;
  • SvcA对应的Proxy增加到SvcB的链接(标号4),并实施负载均衡;

画外音:实际是链接到SvcB对应的Proxy。

整个过程,与使用配置中心来实施服务发现基本类似。

三、请求的入口及出口

ServiceMesh的核心,是技术基础设施与业务服务的解耦,服务A调用服务B,再次强调:

  • 一个容器Pod内的一个服务,服务进程(SrvA/SrvB)和边车进程(Proxy)是相生相伴的,他们之间的交互是本地交互(标号1)
  • 跨容器Pod之间的远程调用,必须通过Proxy进行(标号2)

言下之意,服务A调用服务B,请求的流程是:

  1. SvcA -> SvcA Proxy -> SvcB Proxy -> SvcB 

响应的流程则反过来:

  1. SvcB -> SvcB Proxy -> SvcA Proxy -> SvcA 

跨网之间调用,请求的入口和出口,都是Proxy。

四、Pilot内部结构

Pilot它的内部结构并不复杂:

  • Pilot的核心,是各种流控策略的维护,Abstract Model;
  • 必然,Pilot需要提供接口给用户,增删查改这些策略,Rules API;
  • 一方面,Pilot需要保持各类底层基础设施的兼容性,Platform Adapter;
  • 另一方面,Pilot又需要保持不同Proxy实接口的兼容性,Envoy API;

这么设计的好处是:

  • Istio设计时已经考虑了异构的基础设施,不管底层是K8s还是其他体系,都可以兼容
  • 任何第三方可以实现自己的proxy,只要符合相关的API标准,都可以和Pilot集成

Pilot与Envoy的配合,是Istio的核心,如此一来:

  • 服务发现(discovery)
  • 负载均衡(load balancing)
  • 故障恢复(failure recovery)
  • 服务度量(metrics)
  • 服务监控(monitoring)
  • A/B测试(A/B testing)
  • 灰度发布(canary rollouts)
  • 限流限速(rate limiting)

等很多能力都可以实现了。

MerviceMesh并没有大家想的复杂。

思路比结论重要。

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2020-04-15 22:18:55

架构负载均衡分布式

2019-09-10 09:58:19

Dubbo负载均衡Hash

2019-09-19 09:03:13

Docker负载均衡服务

2011-11-22 21:26:59

pfSense配置Web服务器负载均衡

2019-09-19 14:57:27

Docker语言技术

2010-05-10 17:52:30

实现负载均衡

2013-12-13 09:52:58

VDI服务器负载均衡

2019-11-29 08:05:26

连接池负载均衡互联网架构

2023-02-13 16:39:45

Kubernetes容器负载均衡器

2022-04-27 08:23:34

微服务负载均衡

2015-11-03 11:15:54

负载均衡微服务web

2023-07-04 07:45:11

gogRPC服务

2009-07-22 10:25:37

2009-01-10 18:53:01

服务器ServerDNS

2021-09-07 09:18:18

Kubernetes负载均衡服务发现

2010-05-05 22:40:21

apache服务器负载均衡

2010-05-10 15:22:57

实现负载均衡

2010-04-20 14:31:29

负载均衡功能

2021-08-23 06:59:22

Nacos负载均衡客户端

2019-06-24 15:58:53

TCPUDPNginx
点赞
收藏

51CTO技术栈公众号