Istio技术与实践05:如何用istio实现流量管理
Istio是Google继Kubernetes之后的又一开源力作,主要参与的公司包括Google,IBM,Lyft等,它提供了完整的非侵入式的微服务治理解决方案,解决微服务的管理、网络连接以及安全管理等应用网络治理问题
它无需修改任何代码就能够实现微服务的负载均衡,服务与服务之间的认证授权以及流量监控和治理。从整个基础设施角度上看,可以将它理解为PaaS平台上的一个面向微服务管理平台的补充。

Istio与Kubernetes
Kubernetes提供了部署、升级和有限的运行流量管理能力,利用service的机制来做服务注册和发现,转发,通过kubeproxy有一定的转发和负载均衡能力。但并不具备上层如熔断、限流降级、调用链治理等能力。
Istio则很好的补齐了k8s在微服务治理上的这部分能力,同时是基于k8s构建的,但不是像SpringCloud Netflix等完全重新做一套。Istio是谷歌微服务治理上的非常关键的一环。
Istio流量管理能力介绍
Istio,用于连接、保护、控制和观测服务。今天,我们就来谈谈Istio第一主打功能——连接服务。那么,便引出3个问题:
Istio如何实现服务之间的连接?
连接后具备哪些流量管理能力?
如何告诉Istio发挥这些能力?
1、 Istio如何实现服务的连接?

如上图所示的Istio架构图,让我们关注控制面的Pilot,它是Istio实现流量管理的核心组件。
而在数据面,每个Service,都会被注入1个Proxy。Istio通过Pilot下发配置信息给数据面每1个Service的Proxy,从而通过这些Proxy,间接地控制每1个Service之间以及和外部的连接。Proxy通常采用另一个知名的开源项目Envoy来实现。
1个Pilot和(N+N)个(Service+Proxy)组合,便形成了Service Mesh,即服务网格。有了这一套服务网格系统,对服务之间的流量进行管理,便不在话下。
2、连接后具备哪些流量管理能力?
从服务间的流量管理角度而言,Istio可以实现这4项功能:请求路由、服务发现和负载均衡、故障处理和故障注入。
A.请求路由

如上图所示,Istio引入了服务版本的概念,可以通过(Current Version,Canary Version)2个版本对服务进行进一步的细分。基于这种划分,通过Pilot,可以下发配置到Service A的Proxy,使得其95%的流量路由至Service B的Current版本,5%的流量路由至Service B的Canary版本。当然也可以选择雨露均沾,各分50%流量,或者霸道总裁,让Canary版本占有100%的流量。

如上图所示,除了按照百分比在不同版本之间分发流量,你还可以按照请求内容,将请求路由至不同的版本。例如,你可以发布一个Canary版本,只让用着Macbook笔记本,且安装了windows操作系统,还使用着360浏览器的用户能够访问到。
这一切改变,都只需要你改动一个叫VirtualService的配置文件(详见下章),眨个眼的功夫,Istio就已经通过Pilot帮你把新的配置下发下去了。
B.服务发现和负载均衡

如上图所示,服务网格存在3个生命周期的动态循环:服务注册、服务发现、负载均衡。
通常kubernetes,mesos等容器管理平台已经提供了服务注册表,以跟踪服务的负载实例,所以Pilot能轻而易举地获知服务网格内的所有服务注册信息,并将这些信息告知所有服务里的Proxy,Proxy根据这些信息执行服务发现,并相应地动态更新其负载均衡池。一个服务通常有多个负载实例,Service A请求ServiceB时,可以配置不同的负载均衡模式:轮询、随机和带权重的最少请求。假设此时Service B的某个负载实例出现故障,因为Service A中的Proxy会定期地执行服务发现,从而能及时将故障实例从其负载均衡池里排出。
C.故障处理
Envoy 提供了一套开箱即用,可选的故障处理功能,对应用中的服务大有裨益。这些功能包括:
超时
具备超时预算,并进行有限重试,重试之间的时长可抖动
并发连接数和上游服务请求数限制
对负载均衡池中的每个成员进行主动(定期)运行健康检查
细粒度熔断器(被动健康检查)- 适用于负载均衡池中的每个实例
以Service A请求调用Service B为例。
对于功能1。若Service B明确地知道10s以后的超时,必定会带来失败,那将超时时长缩短,使得Service A可以更快得知结果并作出应对,不失为一个明智之举。
对于功能2。对超载的Service B来说,重试之间的抖动极大的降低了重试造成的影响,而超时预算确保Service A在可预测的时间范围内获得响应(成功/失败)。
对于功能3。限制Service A或其他服务对Service B的连接数和请求数,可以使得Service B免于遭遇DDOS攻击,或承受过重的流量负担而崩溃。
对于功能4和5。主动和被动健康检查的组合最大限度地减少了在负载平衡池中访问不健康实例的机会。当与平台级健康检查(例如由 Kubernetes 或 Mesos 支持的检查)相结合时,应用程序可以确保将不健康的负载实例快速地从服务网格中去除,从而最小化请求失败和延迟产生影响。
总之,这些功能使得服务网格能够耐受故障节点,并防止本地故障导致的其他节点的稳定性下降。
D.故障注入
虽然Proxy为在Istio上运行的服务提供了上节所言的大量故障处理机制,但测试整个服务网格所组成应用的端到端的故障恢复能力依然是必须的。错误配置的故障恢复策略(例如,跨服务调用的不兼容/限制性超时)可能导致应用程序中的关键服务持续不可用,从而破坏用户体验。
Istio 能在不杀死负载实例的情况下,将协议特定的故障注入到网络中,在 TCP 层制造数据包的延迟或损坏。我们的理由是,无论网络级别的故障如何,应用层观察到的故障都是一样的,并且可以在应用层注入更有意义的故障(例如,HTTP经典的4xx和5xx错误代码),以检验和改善应用的韧性。
运维人员可以为符合特定条件的请求配置故障,还可以进一步限制遭受故障的请求的百分比。可以注入两种类型的故障:延迟和中断。延迟是计时故障,模拟网络延迟上升或上游服务超载的情况。中断是模拟上游服务的崩溃故障。中断通常以 HTTP 错误代码或 TCP 连接失败的形式表现。
依旧以Service A请求调用Service B为例。
若给Service B设定了10s的延时或503中断,则Service A将至少10s后才能得到请求的响应或请求的响应为503错误,通过多种场景覆盖测试,可以得到Service A面对这些场景时的综合表现情况,从而做出针对性的改良,增加其韧性。
3、如何告诉Istio发挥这些能力?
Istio有4个配置文件,帮我们全方位地定制以上所有流量管理需求: VirtualService, DestinationRule, ServiceEntry和 Gateway:
通过配置VirtualService,可以实现请求路由的功能;
通过配置DestinationRule,可以实现服务发现和负载均衡、故障处理和故障注入的功能;
通过配置ServiceEntry,让服务网格内的服务,可以看到外面的世界;
通过配置Gateway,让服务网格的服务,可以被全世界看到;
有了以上4大法宝,我们对服务网格进行流量管理的所有需求,都可以被满足了。
限于篇幅,让我们举3个简单的栗子:
假设我们的服务网格存在1个服务explorer,只有1个v1版本;存在另1个服务helloworld,有v1,v2两个版本。
①若要使得explorer发起的所有请求,以75%的概率走向helloworld的v1版本,以25%走向v2版本,只要配置如下两个文件VirtualService和DestinationRule,便可实现:
apiVersion:networking.Istio.io/v1alpha3
kind:VirtualService
metadata:
name:helloworld
spec:
hosts:
- helloworld
http:
- route:
- destination:
host:helloworld
subset:v1
weight:75
- destination:
host: helloworld
subset: v2
weight: 25
apiVersion:networking.Istio.io/v1alpha3
kind:DestinationRule
metadata:
name: helloworld
spec:
host: helloworld
subsets:
- name:v1
labels:
version: v1
- name: v2
labels:
version: v2
②如果helloworld内部需要通过访问www.google.com来获取一些信息,才能告诉explorer这个世界是怎么样的,需要配置如下2个文件ServiceEntry和DestinationRule:
apiVersion:networking.Istio.io/v1alpha3
kind:ServiceEntry
metadata:
name: googleapis
spec:
hosts:
- "*.google.com"
ports:
- number:443
name:https
protocol:http
apiVersion:networking.Istio.io/v1alpha3
kind:DestinationRule
metadata:
name: googleapis
spec:
host: "*.google.com"
③如果helloworld需要被服务网格外,而不仅仅是explorer服务访问到,则需要配置如下2个文件Gateway和VirtualService:
apiVersion:networking.Istio.io/v1alpha3
kind:Gateway
metadata:
name: helloworld-gateway
spec:
selector:
Istio:ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- 'helloworld.com'
apiVersion:networking.Istio.io/v1alpha3
kind:VirtualService
metadata:
name: bookinfo
spec:
hosts:
- 'helloworld.com'
gateways:
- helloworld-gateway
http:
- route:
- destination:
host: helloworld
port:
number: 9080
至此,我们做一个简单的总结:Istio提供的Pilot和Proxy,将成百上千个服务组成了一个服务网格。基于此,我们可以实现请求路由、服务发现和负载均衡、故障处理以及故障注入等流量管理能力,这一切,我们只需要通过对VirtualService, DestinationRule, ServiceEntry和Gateway这4个资源做简单的配置,即可实现。
Istio技术与实践05:如何用istio实现流量管理的更多相关文章
- Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现
前言 文章Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制结合Pilot的代码实现介绍了Istio的抽象服务模型和基于该模型的数据结构定义,了解到Istio上只是定义的服务发现的接 ...
- Istio技术与实践06:史上最全!Istio安装参数介绍
一. CertManage Istio-1.0版本新加入的组件,利用ACME为Istio签发证书 Key Default Value Description certmanager.enabled T ...
- Istio技术与实践6:Istio如何为服务提供安全防护能力
凡是产生连接关系,就必定带来安全问题,人类社会如此,服务网格世界,亦是如此. 今天,我们就来谈谈Istio第二主打功能---保护服务. 那么,便引出3个问题: l Istio凭什么保护服务? l ...
- Istio技术与实践04:最佳实践之教你写一个完整的Mixer Adapter
Istio内置的部分适配器以及相应功能举例如下: circonus:微服务监控分析平台. cloudwatch:针对AWS云资源监控的工具. fluentd:开源的日志采集工具. prometheus ...
- Istio技术与实践03:最佳实践之sidecar自动注入
Istio通过对serviceMesh中的每个pod注入sidecar,来实现无侵入式的服务治理能力.其中,sidecar的注入是其能力实现的重要一环(本文主要介绍在kubernetes集群中的注入方 ...
- Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制
服务模型 首先,Istio作为一个(微)服务治理的平台,和其他的微服务模型一样也提供了Service,ServiceInstance这样抽象服务模型.如Service的定义中所表达的,一个服务有一个全 ...
- 灵雀云Istio技术实践专题整理
Istio技术实践专题(1) Service Mesh Istio 基本概念和架构基础 Istio被称作Kubernetes的最佳云原生拍档.从今天起,我们推出"Istio技术实践" ...
- 【从小白到专家】收官!Istio技术实践之九:路由控制与灰度发布
本期是Istio技术实践专题的最后一个模块,主题是Istio的路由控制与灰度发布.上一期我们讲到,虚拟服务(Virtual Service)以及目标规则(Destination Rule)是 Isti ...
- 【从小白到专家】Istio技术实践专题(四):应用接入Istio的正确姿势
上一篇文章中,我们介绍了Istio针对单集群的三种主流部署安装方式:使用Istioctl安装.使用Helm自定义安装.独立Operator安装.本文将向大家介绍kubernetes中的应用接入Isti ...
随机推荐
- prometheus部署安装
1. 下载&部署 # 下载 [root@prometheus src]# cd /usr/local/src/ [root@prometheus src]# wget https://gith ...
- 利用matlab自带函数graycoprops 实现基于共生矩阵的遥感图像纹理特征分析
close all;clear all;clc;I = imread('yaogan2.jpg');HSV = rgb2hsv(I);Hgray = rgb2gray(HSV);% 计算64位灰度共生 ...
- js 数组遍历 对象遍历
一.数组遍历 1,普通for循环,经常用的数组遍历 var arr = [1,2,0,3,9]; for ( var i = 0; i <arr.length; i++){ console.lo ...
- 第一个go程序
进入到工作空间中(我的是$HOME/go, 所以使用cd $HOME/go命令直接进入) 然后创建一个目录 src/hello( mkdir src/hello), 然后进入到该目录中(cd src/ ...
- 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱
题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...
- MyBatis使用小结
- shell实践--简单抓取网页内容
#!/bin/bash base_path="https://testerhome.com/"user_path="ycwdaaaa/topics?page=" ...
- urllib基础
import urllib.request # urlretrieve(网址,本地路径) 直接下载网页到本地 urllib.request.urlretrieve("http://www.b ...
- golang之工厂模式
说明: golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题 如果包里面的结构体变量首字母小写,引入后,不能直接使用,可以工厂模式解决: ch1.go package ch1 type ...
- ajax 跨域要点
1.async: false 2.dataType: jsonp 3.返回数据格式.正常格式为{ param1: p1, param2: p2 },而jsonp跨域请求时,多了一个参数 callbac ...
