深度解析Istio系列之流量控制篇
分类:技术社区 发布时间:2019/6/4 0:00:00

在我们公众号的上一篇文章中,我们对比当前较流的几款服务网格产品,主要关注的是Istio。得益于良好的模块化设计,Istio的各个组件设计清晰,分工明确,几个大的组件之间甚至可以独立工作,所以接下来我们将逐一深入分析Istio的各个组件。本文首先详细分析一下我们最常用的流管理功能所对应的模块——PilotEnvoy

 

 

01 Istio基本架构

Istio基本架构图如下图所示,网格东西向及南向的流控制,核心思是由Pilot维护管理策,并通过标准接口下发到Envoy Proxy中,由Envoy最终实现流量的转发。

 

 

 

 

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

1. 数据平面:由一组以Sidecar方式部署的智能代Envoy)组成,这些代可以调节和控制微服务之间所有的网络通信。

2. 控制平面:服务管理和配置代由流

 

其中与流管理相关的主要包括控制层面的Pilot以及数据层面的Envoy Proxy

 

 

02 控制平面组件——Pilot

 

Pilot的基本架构如下图所示。

 

 

  1

Pilot功能

根据上图,Pilot主要实现下述功能:

 

1.统一服务模型

统一服务模型主要功能是从底层平台获取服务相关信息以及通过RuleAPI定义的服务间流规则,以kubernetes,统一服务模型从平台上获取注册在PodServiceNode以及流规则信息,获取到各种信息后转变成数据平面上可解的数据格式存储在Abstract Model中。

 

2.   标准数据平面API

获取到各种服务信息以及流规则之后,会通过该API下发到数据面的Sidecar中。

 

3.   业务DSL语言(Domain Specific Language)

SL语言提供面向业务的高层抽象,可以被运维人员理解和使用。运维人员使用该DSL定义流规则并下发到Pilot,这些规则被Pilot翻译成数据面的配置,再通过标准API分发到Envoy,可以在运期对微服务的流量进控制和调整。

 

Pilot的规则DSL是采用K8S API Server中的Custom Resource (CRD)实现的,因此和其他资源类型如Service Pod Deployment的创建和使用方法类似,都可以Kubectl创建。

 

通过运用同的流量规则,可以对网格中微服务精细化的流控制,如按版本分流,断路器,故障注入,灰度发布等。

 

  2 Pilot实现

Pilot相关的服务主要有两个:

 

1Discovery Service

对应的dockergcr.io/istio-release/pilot,进程为pilot-discovery,该组件的功能包括:

· Service Provider中获取服务信息,除主要介绍的Kubernetes之外,Istio还支持Consul作为Service Provider

· Kubernetes API Server中获取流规则(Kubernetes CRD Resource)。

· 将服务信息和流量规则转化为数据面可以解的格式,通过标准的数据面API下发到网格中的各个Sidecar中。

 

2Kubernetes API Server

提供Pilot相关的CRD Resource的增、删、改、查。和Pilot相关的CRD有以下几种:

· Virtualservice:用于定义由规则,如根据来源或 Header 制定规则,或在同服务版本之间分拆流

· DestinationRule:定义目的服务的配置策以及可由子集。策略包括断路负载均衡以及 TLS 等。

· ServiceEntry:用 ServiceEntry 可以向Istio中加入附加的服务条目,以使网格内可以向Istio 服务网格之外的服务发出请求。

· Gateway:为网格配置网关,以允许一个服务可以被网格外部访问。

· EnvoyFilter:可以为Envoy配置过滤。由于Envoy已经支持Lua过滤,因此可以通过EnvoyFilter启用Lua过滤,动态改变Envoy的过滤链为。我之前一直在考虑如何才能动态扩展Envoy的能EnvoyFilter提供很灵活的扩展性。

 

 

03数据平面组件——Envoy

 

  1 Envoy实现

Istio通过K8sAdmission Webhook机制实现sidecar的自动注入,Istio集群中的每个微服务会被加入Envoy相关的容。下面是官方示例productpage微服务的Pod内容,可见除productpage之外,Istio还在该Pod中注入了两个容器gcr.io/istio-release/proxy_initgcr.io/istio-release/proxyv2

 

1.初始化容器proxy_init

ProductpagePod中有一个InitContainer proxy_initInitContrainerK8S提供的机制,用于在Pod中执一些初始化任务,在Initialcontainer完毕并退出后,才会启动Pod中的其它container

 

proxy_init中执行iptables.sh脚本,该脚本的作用是通过配置iptable来劫持Pod中的流

 

2.运行时Sidecar容器proxyv2

Envoy的大部分配置都是dynamic resource,包括网格中服务相关的service cluster, listener, route规则等。这些dynamic resource是通过xDS接口从Istio控制面中动态获取的。但Envoy如何知道xDS server的地址呢?这是在Envoy初始化配置文件中以static resource的方式配置的。

 

Proxyv2容器时,有两个进程pilot-agentenvoy

 

1)pilot-agent进程

该进程根据K8S API Server中的配置信息生成Envoy的配置文件,并负责启动Envoy进程。注意Envoy的大部分配置信息都是通过xDS接口从Pilot中动态获取的,因此Agent生成的只是用于初始化Envoy的少量静态配置。

 

2)envoy进程

EnvoyPilot-agent进程启动,启动后,Envoy读取Pilot-agent为它生成的配置文件,然后根据该文件的配置获取到Pilot的地址,通过数据面标准APIxDS口从pilot拉取动态配置信息,包括路由(route),监听器listener),服务集群(cluster)和服务端点(endpoint)。Envoy初始化完成后,就根据这些配置信息对微服务间的通信进寻址和路由。

 

  2 Envoy相关概念

数据面组件中涉及的概念比较多,这里举如下。

 

· Host:能够进网络通信的实体(在手机或服务等上的应用程序)。在 Envoy 中主机是指逻辑网络应用程序。只要每台主机都可以独立寻址,一块硬件上就运多个主机。

 

· Downstream:下游(downstream)主机连接到 Envoy,发送请求并或获得响应。

 

· Upstream:上游(upstream)主机获取来自 Envoy 的链接请求和响应。

 

· Cluster:集群(cluster)是 Envoy 连接到的一组逻辑上相似的上游主机。Envoy 通过服务发现发现集群中的成员。Envoy 可以通过主动运状况检查来确定集群成员的健康状况。Envoy 如何将请求由到集群成员由负载均衡确定。

 

· Mesh:一组互相协调以提供一致网络扑的主机。Envoy mesh 是指一组 Envoy ,它们构成由多种同服务和应用程序平台组成的分布式系统的消息传递基础。

 

· 时配置:与 Envoy 一起部署的带外实时配置系统。可以在无需重启 Envoy  Envoy 主配置的情况下,通过改设置来影响操作。

 

· Listener: 侦听listener)是可以由下游客户端连接的命名网络位置(例如,端口、unix域套接字等)。Envoy 公开一个或多个下游主机连接的侦听。一般是每台主机运一个 Envoy,使用单进程运,但是每个进程中可以启动任意数 Listener(监听),目前只监听 TCP,每个监听器都独立配置一定数的(L3/L4)网络过滤Listenter 也可以通过 Listener Discovery ServiceLDS)动态获取。

 

· Listener filterListener 使用 listener filter(监听过滤器)来操作链接的元数据。它的作用是在不更 Envoy 的核心功能的情况下添加多的集成功能。Listener filter  API 相对简单,因为这些过滤器最终是在新接受的套接字上运。在链中可以互相衔接以支持复杂的场景,如调用速率限制。

 

· Envoy 已经包含多个监听过滤

 

· Http Route TableHTTP 由规则,例如请求的域名,Path 符合什么规则,转发给哪个 Cluster

 

· Health checking:健康检查会与SDS服务发现配合使用。但是,即使用其他服务发现方式,也有相应需要进主动健康检查的情况。

 

· xDSxDS 是一个关键概念,它是一类发现服务的统称,通过对 xDS 的请求来动态 Envoy 配置,其包括如下几类:

o CDSCluster Discovery Service

o EDSEndpoint Discovery Service

o SDSService Discovery Service

o RDSRoute Discovery Service

o LDSListener Discovery Service

 

  3 Envoy配置

Envoy的配置包含两部分,初始化配置和动态新的配置。

 

1.Envoy初始配置

Pilot-agent进程根据启动参数和K8S API Server中的配置信息生成Envoy的初始配置文件,并负责启动Envoy进程。从ps命令输出可以看到Pilot-agent在启动Envoy进程时传入了pilot地址和zipkin地址,并为Envoy生成一个初始化配置文件envoy-rev0.json

 

2.Envoy动态更新配置

通过管接口获取完整配置。从Envoy初始化配置文件中,我们可以大致看到Istio通过Envoy来实现服务发现和流管理的基本原。即控制面将xDS server息通过static resource的方式配置到Envoy的初始化配置文件中,Envoy启动后通过xDS server获取到dynamic resource,包括网格中的service信息及由规则。

 

 

 

详细流程如下:

1. Pilot-agent根据启动参数和K8S API Server中的配置信息生成Envoy的初始配置文件envoy-rev0.json,该文件告诉EnvoyxDS server中获取动态配置信息,并配置了了xDS server的地址信息,即控制面的Pilot

2. Pilot-agent使用envoy-rev0.json启动Envoy进程。

3. Envoy根据初始配置获得Pilot地址,采用xDS接口从Pilot获取到ListenerClusterRouted动态配置信息。

4. Envoy根据获取到的动态配置启动Listener,并根据Listener的配置,结合RouteCluster对拦截到的流量进

 

 

04服务间交互流程

 

下图表述服务与服务之间通过sidecar交互的流程。

 

 

 

 

基本流程分析如下:

1. Productpage发起对Details的调用:http://details:9080/details/0 

 

2. 请求被Podiptable规则拦截,转发到15001端口。

 

3. EnvoyVirtual Listener15001端口上监听,收到该请求。

 

4. 请求被Virtual Listener根据原目标IP(通配)和端口(9080)转发到0.0.0.0_900这个listener

 

5. 根据0.0.0.0_9080 listenerhttp_connection_manager filter配置,该请求采用"9080" route分发。

 

6. "9080"这个route的配置中,host namedetails:9080的请求对应的clusteroutbound|9080||details.default.svc.cluster.local

 

7. outbound|9080||details.default.svc.cluster.local cluster为动态资源,通过eds查询得到其endpoint192.168.206.21:9080

 

8. 请求被转发到192.168.206.21,即Details服务所在的Pod,被iptable规则拦截,转发到15001端口。

 

9. EnvoyVirtual Listener15001端口上监听,收到该请求。


10. 请求被Virtual Listener根据请求原目标地址IP192.168.206.21)和端口(9080)转发到192.168.206.21_9080这个listener


11. 根据92.168.206.21_9080 listenerhttp_connection_manager filter配置,该请求对应的cluster inbound|9080||details.default.svc.cluster.local 

 

12. inbound|9080||details.default.svc.cluster.local cluster配置的host127.0.0.19080

 

13. 请求被转发到127.0.0.19080,即Details服务进

 

 

参考链接

· https://zhaohuabing.com/post/2018-09-25-istio-traffic-management-impl-intro/

· https://istio.io/zh/docs/concepts/what-is-istio/

· https://www.cnblogs.com/xishuai/p/microservices-and-service-mesh.html

 

体验创新云技术带来核心业务效率显著提升
立即预约,加速企业数字化转型进程
Copyright ⓒ 2022 苏州博纳讯动软件有限公司 国徽 苏ICP备13004761号 法律声明及隐私政策