idou老师教你学Istio 04:Istio性能及扩展性介绍
Istio的性能问题一直是国内外相关厂商关注的重点,Istio对于数据面应用请求时延的影响更是备受关注,而以现在Istio官方与相关厂商的性能测试结果来看,四位数的qps显然远远不能满足应用于生产的要求。从发布以来,Istio官方也在不断的对其性能进行优化增强。同时,Istio控制面的可靠性是Istio用于生产的另一项重要考量标准,自动伸缩扩容,自然是可靠性保证的重要手段。下面我们先从性能测试的角度入手,了解下Istio官方提供的性能测试方法与基准,主要分为以下四个方面展开。
一、函数级别测试
Istio提供了函数级别的性能测试用例,开发者可用更好的有针对性的进行性能优化,这里不做展开,感兴趣的朋友可用参考:
https://raw.githubusercontent.com/istio/istio/release-1.0/mixer/test/perf/singlecheck_test.go
二、端到端测试基准
为了更好的跟踪Istio的性能问题,Istio提供了一个专门用于Isito性能测试的测试工具——Fortio。你可以通过kubernetes集群,轻而易举的将Forito部署起来,测试工具的安装链接如下:
https://github.com/istio/istio/tree/release-1.0/tools#istio-load-testing-user-guide。
下图是测试工具的组织结构图,其中上半部分为Istio服务网格管理的两个服务S1与S2,其中S1服务关掉了mixer上报功能(mixer遥测功能实现方案一直备受争议,业界普遍认为sidecar向mixer上报遥测数据一定程度上损害了sidecar的请求转发能力),请求通过ingressgateway流入系统,再经由sidecar分发到各个服务,是典型的Istio服务访问方式。下半部分为经典的kubernetes集群中的服务访问方式,请求经由k8s的proxy的转发,负载均衡到各个pod。两者的对比也就展示了Istio访问模式与经典模式相比,性能方面的损耗,下面介绍一下Fortio的几个功能点:
a)Fortio是一个快速,小巧,可重复使用,可嵌入的go库以及命令行工具和服务器进程,该服务器包括一个简单的Web UI和结果的图形表示;
b)Fortio也是100%开源的,除了go和gRPC之外没有外部依赖,能够轻松地重现Istio官方性能测试场景也能适应自己想要探索的变体或场景;
c)Fortio以每秒指定的qps对服务进行压测,并记录影响时延的直方图并,计算百分比,平均值,tp99等统计数值。
Fortio在kubernetes中的安装步骤:
kubectl -n fortio run fortio --image=istio/fortio:latest_release --port=8080
kubectl -n fortio expose deployment fortio --target-port=8080 --type=LoadBalancer
三、真实场景下测试基准
Acmeair(又名BluePerf)是一个用Java实现的类似客户的微服务应用程序。此应用程序在WebSphere Liberty上运行,并模拟虚拟航空公司的运营。
Acmeair由以下微服务组成:
a) Flight Service检索航班路线数据。预订服务会调用它来检查奖励操作的里程(Acmeair客户忠诚度计划)。
b) 客户服务存储,更新和检索客户数据。它由Auth服务用于登录和预订服务用于奖励操作。
c) 预订服务存储,更新和检索预订数据。
d) 如果用户/密码有效,Auth服务会生成JWT。
e) 主服务主要包括与其他服务交互的表示层(网页)。这允许用户通过浏览器直接与应用程序交互,但在负载测试期间不会执行此操作。
这个模拟航空公司的运营系统demo,能够更好的模拟在实际生产环境中的Istio应用,感兴趣的朋友可用到如下链接了解一下:https://github.com/blueperf
四、每日构建自动化测试结果
Istio与IBM会对Istio的每日构建版本进行性能测试,并将测试结果公布出来,供大家参考。自动化测试包括端对端用例fortio以及应用级别bluePerf的性能测试结果。对Isito性能感兴趣,但没有时间精力进行性能测试的朋友,可以关注一下官方的每日性能测试结果,跟踪Istio性能优化的最新进展。
● https://fortio-daily.istio.io/
● https://ibmcloud-perf.istio.io/regpatrol/
这里,我们一起来看下IBM的性能测试结果,并进行一下分析。
IBM的性能测试对比主要包括三部分,第一部分是各个Release版本之间的性能比较,其中列出了0.6.0,0.7.1,0.8.0版本的性能测试情况,这里的指标数据是qps,可以看到,前三个版本之间的数据十分相近,没有比较大的提升,且Istio与IngressOnly之间的对比可以看出,Istio造成了相当大的性能损耗,大约只能达到无Istio时百分之三十多的qps,可见,性能方面Istio还需要进一步优化。
Row | Release |
(A)Istio Full |
(B) No Mixer | (C) Ingress Only | (A)/(C) % | (B)/(C) % |
1 | 0.6.0 | 1307 | 1987 | 3804 | 34.4 | 52.2 |
2 | 0.7.1 | 1294 | 2050 | 3671 | 35.2 | 55.8 |
3 | 0.8.0 | 1335 | 2222 | 3708 | 36.0 | 59.9 |
第二部分是当前release每日构建版本的性能情况,可以对比出每天的修改对性能方面的影响,这里我们列出一部分,更详细的信息大家可以到相应链接中查看,可以看到近期每日构建版本相较于1.0基线版本,有了一定的提升。
最后一部分是master分支的每日构建性能测试结果。可以看到,最新的master分支的性能测试结果,相较基线版本已经有了较大的提升,但是QPS损耗严重的问题依然存在,同时,千级别的QPS也不能真正满足生产需求,我们期待Istio的发展与进步。
五、Isito的可靠性与可扩展性
对控制面各组件的作用作用及故障影响进行了汇总,结果如下:
组件 | 作用及故障影响 |
istio-ingressgateway | 对外流量入口,该组件挂掉将导致整个应用服务无法从外部访问,建议设置多实例,增强可靠性 |
istio-telemetry | Mixer相关组件,用于采集envoy上报的遥测数据,该组件挂掉将导致各监控运维插件无法采集到数据,同时,该组件在高并发情境下,会承受较大负荷,建议设置为多实例,增强可靠性 |
istio-policy | Mixer相关组件,用于与envoy交互,check需要上报的数据,确定缓存内容,挂掉会影响check相关功能 |
istio-pilot | 控制sidecar中envoy的启动与参数配置,即流量规则实际下发者,挂掉将会导致新策略配置失效 |
istio-sidecar-injector | 用于实现sidecar自动注入功能,挂掉将会导致sidecar无法自动注入,同时,若注入策略设置为必须注入(policy为Fail),则会导致新creating的pod无法启动 |
istio-citadel | 用于安全相关功能,挂掉则会导致认证,安全相关功能失效 |
a) 考量到Istio控制面的可靠性,以及对资源的有效利用,建议将重要组件设置为多实例,包括:
● ingressgateway:作为外部流量入口,服务网格管理的所有服务的对外流量,都要经过gateway才能进入到服务网格内部,与业务逻辑强相关,建议配置为多实例;
● mixer:遥测数据的搜集端,用于汇总服务网格内所有服务上报的日志、监控数据,处理数据量巨大,建议设置为多实例,并给予更多资源配置;
● 其他控制面组件运行压力并不大,可根据需要自行调整实例数。
b) 容器自动扩缩容,Istio为主要组件gateway,pilot与mixer设置了自动扩缩容策略,且策略可以在安装时配置,我们以pilot为例看一下其自动扩缩容配置,以CPU占用率55%作为阈值,进行pod实例数的扩缩容侧率:
c) 高可用(HA),可根据需要,为Istio控制面组件设置亲和性策略,使相同控制面组件的多个不同pod运行不同node上,确保Istio控制面的高可用状态,下面以pilot为例,Istio为其增加了节点反亲和策略,使pod尽可能不运行在相同架构操作系统的节点上,大家可根据需要,自行增加亲和与反亲和策略。
d) 健康检查,Istio也为控制面组件配置了健康检查策略,以保证控制面组件异常时,k8s能够将其重新拉起,同样以sidecarinjector为例,设置了启动健康检查readinessProbe与运行时健康检查livenessProbe,以确保容器正常运行:
六、总结
再次说明一下,性能与可靠性是Istio生产可用至关重要的一环,功能方面Istio已经做的十分强大,并在不断的完善发展中,但在性能与可靠性方面,Istio还有很长的路要走。其中微服务sidecar的路由转发与mixer遥测功能对请求时延的影响,是摆在Istio性能提升前面的两道障碍,我们共同努力,共同关注,望Istio早日成熟,发展壮大,扬帆起航。
idou老师教你学Istio 04:Istio性能及扩展性介绍的更多相关文章
- idou老师教你学Istio11 : 如何用Istio实现流量熔断
在之前的最佳实践中,已经带大家通过一系列的实践任务领略了Istio的无穷魅力.今天,将向大家介绍如何用Istio实现流量熔断. 熔断机制是创建弹性微服务应用程序的重要模式.熔断可以帮助您自由控制故障影 ...
- idou老师教你学Istio 07: 如何用istio实现请求超时管理
在前面的文章中,大家都已经熟悉了Istio的故障注入和流量迁移.这两个方面的功能都是Istio流量治理的一部分.今天将继续带大家了解Istio的另一项功能,关于请求超时的管理. 首先我们可以通过一个简 ...
- idou老师教你学Istio :如何用istio实现监控和日志采集
大家都知道istio可以帮助我们实现灰度发布.流量监控.流量治理等功能.每一个功能都帮助我们在不同场景中实现不同的业务.那Istio是如何帮助我们实现监控和日志采集的呢? 这里我们依然以Bookinf ...
- idou老师教你学istio :基于角色的访问控制
istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...
- idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输
众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输 ...
- idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理
本文主要介绍在使用Istio时如何访问集群外服务,即对出口流量的管理. 默认安装的Istio是不能直接对集群外部服务进行访问的,如果需要将外部服务暴露给 Istio 集群中的客户端,目前有两种方案: ...
- idou老师教你学Istio:如何用 Istio 实现速率限制
使用 Istio 可以很方便地实现速率限制.本文介绍了速率限制的使用场景,使用 memquota\redisquota adapter 实现速率限制的方法,通过配置 rule 实现有条件的速率限制,以 ...
- idou老师教你学Istio 28:istio-proxy check 的缓存
功能概述 istio-proxy主要的功能是连接istio的控制面组件和envoy之间的交互,其中check的功能是将envoy收集的attributes信息上报给mixer,在istio中有几十种a ...
- idou老师教你学Istio :5分钟简析Istio异常检测
异常检测 异常检测和踢出异常主机是一个动态检查上游主机是否正常工作,对不健康主机进行移除的过程.异常检测是一种被动健康检查,根据返回状态码来判断是否满足移除条件,最后将主机移除,首先我们来了解下驱逐算 ...
随机推荐
- Flutter中通过循环渲染组件
class ContactsState extends State<Contacts>{ List formList; initState() { super.initState(); f ...
- PHPNamespace命名空间
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 例:项目中有两个 ...
- [Tensorflow] 使用 tf.train.Checkpoint() 保存 / 加载 keras subclassed model
在 subclassed_model.py 中,通过对 tf.keras.Model 进行子类化,设计了两个自定义模型. import tensorflow as tf tf.enable_eager ...
- IDEA debug漏洞第二弹(fastjson,version<1.2.47)
首先这个漏洞调试不需要非要使用docker,本身是一个jar包的问题.所以我们可以自己写一个小java代码来直接调试. POC如下 {"name":{"@type&quo ...
- .Net WebApi接口之Swagger UI 隐藏指定接口类或方法
swagger的一个最大的优点是能实时同步api与文档,但有些时候我们不想全部公开接口,而要隐藏或屏蔽一些接口类或方法,swagger也是支持的,只需要设置一下DocumentFilter方法. 第一 ...
- nssm设置solr开机启动服务
首先,下载nssm http://www.nssm.cc/download 命令 nssm install solr 然后到服务里启动solr,并设置为自动 Ctrl+Shift+Esc(说明:Esc ...
- Mysql错误--Table 'mysql.servers' doesn't exist.
问题: 今天在初始化数据库的时候,在配置文件里加了"--skip grant tables",登陆进去之后,发现无法修改root密码,报这个错误. Table 'mysql.s ...
- [百家号]铁流:华为Hi1620发布 自研内核还是ARM改?
华为Hi1620发布 自研内核还是ARM改? https://baijiahao.baidu.com/s?id=1618735211251270521&wfr=spider&for=p ...
- mysql-事务总结
目录 事务基本概念 事务的定义 使用事务 自动提交 特殊操作 ACID特性及其原理 原子性(A) 持久性 (D) 隔离性 脏读.不可重复读和幻读 事务隔离级别 mysql事务日志 redo log 定 ...
- StorageClass-动态PVC
StorageClass 之前我们部署了PV 和 PVC 的使用方法,但是前面的 PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上 ...