• 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实现流量管理的更多相关文章

  1. Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现

    前言 文章Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制结合Pilot的代码实现介绍了Istio的抽象服务模型和基于该模型的数据结构定义,了解到Istio上只是定义的服务发现的接 ...

  2. Istio技术与实践06:史上最全!Istio安装参数介绍

    一. CertManage Istio-1.0版本新加入的组件,利用ACME为Istio签发证书 Key Default Value Description certmanager.enabled T ...

  3. Istio技术与实践6:Istio如何为服务提供安全防护能力

    凡是产生连接关系,就必定带来安全问题,人类社会如此,服务网格世界,亦是如此. 今天,我们就来谈谈Istio第二主打功能---保护服务. 那么,便引出3个问题: l  Istio凭什么保护服务? l  ...

  4. Istio技术与实践04:最佳实践之教你写一个完整的Mixer Adapter

    Istio内置的部分适配器以及相应功能举例如下: circonus:微服务监控分析平台. cloudwatch:针对AWS云资源监控的工具. fluentd:开源的日志采集工具. prometheus ...

  5. Istio技术与实践03:最佳实践之sidecar自动注入

    Istio通过对serviceMesh中的每个pod注入sidecar,来实现无侵入式的服务治理能力.其中,sidecar的注入是其能力实现的重要一环(本文主要介绍在kubernetes集群中的注入方 ...

  6. Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制

    服务模型 首先,Istio作为一个(微)服务治理的平台,和其他的微服务模型一样也提供了Service,ServiceInstance这样抽象服务模型.如Service的定义中所表达的,一个服务有一个全 ...

  7. 灵雀云Istio技术实践专题整理

    Istio技术实践专题(1) Service Mesh Istio 基本概念和架构基础 Istio被称作Kubernetes的最佳云原生拍档.从今天起,我们推出"Istio技术实践" ...

  8. 【从小白到专家】收官!Istio技术实践之九:路由控制与灰度发布

    本期是Istio技术实践专题的最后一个模块,主题是Istio的路由控制与灰度发布.上一期我们讲到,虚拟服务(Virtual Service)以及目标规则(Destination Rule)是 Isti ...

  9. 【从小白到专家】Istio技术实践专题(四):应用接入Istio的正确姿势

    上一篇文章中,我们介绍了Istio针对单集群的三种主流部署安装方式:使用Istioctl安装.使用Helm自定义安装.独立Operator安装.本文将向大家介绍kubernetes中的应用接入Isti ...

随机推荐

  1. IOS上的 Audio Memos SE 如何分享和传输录音到电脑?

    Audio Memos SE 是 Audio Memos 的精简版 ,顾名思义就是少了很多实用功能.当初下载这个就是因为广告比较少一些,没有全屏幕的广告. 好了,录了音,想分享和传到电脑要怎么弄呢? ...

  2. ss user-rule自定义规则并硬连接到OneDrive进行自动同步

    最近又换回Edge没了Switchy Omega用,仅仅使用GFWList感觉不够用,一些境内没服务器的网站直连还是挺慢的,于是就研究了一下PAC自定义规则. 简单说,平时用的规则就只有三种: 对于没 ...

  3. linux 抓包工具tcpdump和tshark

    yum install tcpdump tcpdump -nn -c 100 抓一百条 tcpdump -nn -i eth0 指定网卡 tcpdump -nn port 22 指定端口 tcpdum ...

  4. Docker 安装 Apache

    查找Docker Hub上的httpd镜像 apache$ docker search httpd 拉取官方的镜像 docker pull httpd 使用apache镜像 创建目录apache,用于 ...

  5. CentOS7.0 测试环境准备过程

    1. 公司最近开始走向国产化和开源路线,因为绝大多数国产化都是采取的linux路线, 所以为了保证兼容性, 测试环境大部分从windows迁移到了linux环境. 测试采取逐步推进的模式, 先测试兼容 ...

  6. pymysql连接和操作Mysql数据库

    pymysql 一.概要 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库, 二.PyMySQL 安装 pip install pymysql 三.操作流程 创建c ...

  7. 20190716-Python网络数据采集/第 2 章 复杂HTML解析

    # P29/9# 解析,要考虑到可持续性问题,对方反爬修改后,仍继续有效,方为优秀代码# 解析一个目标网页前,需要做到以下几点:(1)明确目标内容:(2)寻找“打印此页”的链接,或查看网站有无HTML ...

  8. JAVA中线程到底起到什么作用!

    这是javaeye上非常经典的关于线程的帖子,写的非常通俗易懂的,适合任何读计算机的同学. 线程同步 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread ...

  9. 怎样创建一个独立于当前文档的新的Document对象

    使用: document.implementation. 如下所示, 新创建的Document对象可以正常使用相关属性和方法, 然后将它的根节点与当前文档的根节点做一个替换. var doc = do ...

  10. 【死磕Java并发】—–深入分析ThreadLocal

    ThreadLoacal是什么? ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关.ThreadLocal虽然 ...