Istio实战——istio1.5 使用 wasm 扩展介绍

2020-04-08 19:43:55 浏览数 (1)

0. istio 1.5 秀肌肉

  它来了,它来了,它带着“优化”走来了。 Istio 1.5 千呼万唤始出来, 只见它左手一只鸡,右手一只鸭,怀里抱着一个 istiod。这些礼物包括:

  1. 将控制平面组件合并为一个二进制文件istiod,简化了 Istio 的安装和运行;
  2. 引入新的扩展模型wasm;
  3. 更易用,更安全,更好观测性;

  了解 istio 发展历史的人应该知道,此版本之前,istio一直重架构,轻效率——结构清晰,但是QPS着实很低。中间也经过一些优化,但是没有质的飞跃,但是这次版本发布,标志着性能的大幅提升,得益于上面三件礼物。

官方测试报告 的摘要如下:

代码语言:txt复制
Performance summary for Istio 1.5
The Istio load tests mesh consists of 1000 services and 2000 sidecars with 70,000 mesh-wide requests per second. After running the tests using Istio 1.5, we get the following results:

The Envoy proxy uses 0.5 vCPU and 50 MB memory per 1000 requests per second going through the proxy.
The istio-telemetry service uses 0.6 vCPU per 1000 mesh-wide requests per second.
Pilot uses 1 vCPU and 1.5 GB of memory.
The Envoy proxy adds 2.8 ms to the 90th percentile latency.

  此外,在1.5特性官宣中“敲黑板”:

The new telemetry system cuts latency in half - 90th percentile latency has been reduced from 7ms to 3.3 ms. Not only that, but the elimination of Mixer has reduced total CPU consumption by 50% to 0.55 vCPUs per 1,000 requests per second.

  是的,你没看错,它把 Mixer 干掉了!干掉了!干掉了!——然后性能提升了。istio把原配休了,你的不服呢?你的架构倔强呢?——渣SM(sevice-mesh),哈哈。

  关于 更多性能测试数据这里不多做介绍了,istiod 的特性也不是本文的重点。重点是数据平面的 Mixer 被拍死在沙滩上了,不,还没死,屠刀交给用户了。反正我给你找到了新欢,Mixer这位原配请进了冷宫;“一个年轻有活力,一个老态龙钟,自己看着办吧。”——istio1.5 说道。

  开篇秀肌肉(性能),就是为了勾引你看下面这个新进宫的主子——wasm。

1. Mixer 再见

  跟Mixer说拜拜,直接要面对的一个问题,为啥要替换掉它?让别人滚,得滚得有理有据不是。这需要从其架构上来找找原因。这是1.4及以前版本的架构图

1.4.x1.4.x

  从构图上看,它四平八稳,布局轻重均匀,优美而和谐,完美的对称结构,给人一种宁静的平衡感,漂亮。那问题出在哪里呢?

  出在那个类似丰满沟的曲线箭头上。这里标示着每次服务请求时

  1. 先进入服务的Proxy,此时Proxy就要向Mixer发一次请求,做一些比如前置检查的工作。
  2. Mixer 通过后,回包Proxy, Proxy再向服务请求
  3. 服务返回的时候,Proxy再次向Mixer做一次汇报请求。

  本来1次就能直达的业务请求,这样一绕变成了3次;为啥要这么做呢?结构清晰啊,用Mixer做日志,遥测,鉴权以及各种扩展。能力如何这不是重点,眉目清秀惹人爱,当花瓶放桌上也好看呀(我是说功能清晰,模块解耦,当然也喜欢漂亮小姐姐)。其次,Mixer成了中心节点。条条大路通罗马,但是都过去,路就有点堵!

  当然一直没有真本事,总是靠秀姿色也不行。于是乎,大佬们分分开始打补丁,说好听些叫优化。思路很简单,如何把这三个请求干掉,如果干不掉,能不能减少呢?答案是可以。请求(2)肯定干不掉的。干掉了,你还干个锤子!!!那只剩请求(1)和(3)

  1. 把某些请求(1)移植到Proxy中处理,不再向Mixer发送,比如限频和鉴权等等。其余还是发送到Mixer;
  2. 汇报工作不要大事小事都骚扰老板,零散的汇报也是很耗费精力的。你要汇总一定量一次性汇报就好了。是了,数据先在Proxy上缓存一段时间,由一次改为批量上报。

  实际上官方采用的第2种膏药。贴上去了,好像有点药效,但是治标不治本。性能问题,本质问题,伟哥也救不了。

  于是乎,istio痛定思腚,腚定思痛(前后各取半词),在一个风黑月高的晚上(好像哪里不对),一把利刃缓缓出鞘,刀起器落,对自己动刀了。啊,一声叫声之后,它缓慢走出来了。不过不是变性了,是整容了。看

istio1.5istio1.5

  粗下巴是不是瘦了好多?唯一遗憾的就是把我喜欢的曲线拉了折线,不知道用啥词来形容。开玩笑了,这样做的原因官方也给出了充分的说明,我觉得这一段说的很好,抄过来

Maximize Transparency: To adopt Istio, an operator or developer is required to do the minimum amount of work possible to get real value from the system. To this end, Istio can automatically inject itself into all the network paths between services. Istio uses sidecar proxies to capture traffic and, where possible, automatically program the networking layer to route traffic through those proxies without any changes to the deployed application code. In Kubernetes, the proxies are injected into pods and traffic is captured by programming iptables rules. Once the sidecar proxies are injected and traffic routing is programmed, Istio can mediate all traffic. This principle also applies to performance. When applying Istio to a deployment, operators see a minimal increase in resource costs for the functionality being provided. Components and APIs must all be designed with performance and scale in mind.

  意思我改成这个样子,为了让你不改业务服务,让你最少的投入(开发,部署成本)得到最大的价值回报,都是为了你们这些API-Boy好,真是操碎了心。另外还有三点 Extensibility , Portability , Policy Uniformity:(有兴趣的戳这里)。

  再见,Mixer!你好,wasm!

2. WASM

  wasm 名曰 WebAssembly,于公元 2015 年生于星条国,父母不详,视 asm.js 为先祖 。自小勤学好问,立志改变web界低效武林之痛。而后发愤图强,凿壁偷“网”,两年之后(2017年),终得一身武艺,大告天下。以速服人,得长者加持,一统 Mozilla、微软、谷歌、苹果江湖四派,自此坐上web江山第一快把交椅,与 HTML、 CSS 和 JavaScript 三位原生语言并称——web四杰。

  wasm,它身高八尺有余,双耳垂肩,双手过膝,虽原始01,却跑起来犹如白驹过隙,胜于闪电。。。嘿哈,编不下去了。就此打住吧,2020年于此卒。

  死于当下是不可能的。它是一个开放标准,为可执行程序定义了一种可移植的二进制代码格式, 以及相应的文本汇编语言,还有一些接口 。诞生记已经讲了,还很年轻,关键是有“活力”,跑起来比较快,当然这也是设计它的目标。要不然怎么会入Envoy的法眼,以至于再进istio的宫。

wasm 的目标和特性

目标也意味着特性!官宣:

WebAssembly goals Be fast, efficient, and portable — WebAssembly code can be executed at near-native speed across different platforms by taking advantage of common hardware capabilities. Be readable and debuggable — WebAssembly is a low-level assembly language, but it does have a human-readable text format (the specification for which is still being finalized) that allows code to be written, viewed, and debugged by hand. Keep secure — WebAssembly is specified to be run in a safe, sandboxed execution environment. Like other web code, it will enforce the browser's same-origin and permissions policies. Don't break the web — WebAssembly is designed so that it plays nicely with other web technologies and maintains backwards compatibility.

2.1 快速,高效,便携

  这目标说是它要达到接近于原生的硬件平台执行速度,它是如何做到的呢?体现在

  1. 基于堆栈的虚拟机执行二进制命令
  2. wasm 编码为二进制指令格式
  3. 高级编程语言C/C /Rust 的可移植目标
2.2 可读性和可调试性

  Webassembly 被设计成漂亮的文本格式,可以用于手工调试、测试、实验、优化、学习、教学和编写程序。

2.3 保持安全

  Webassembly 描述了一个内存安全的沙箱执行环境,甚至可以在现有的 JavaScript 虚拟机中实现。 当嵌入到 web 中时,WebAssembly 将执行浏览器的同源和权限安全策略。

2.4 不破坏Web

  Webassembly 旨在维护 web 的无版本性、特性测试性和向后兼容性。 模块将能够调入和调出 JavaScript 上下文,并通过 JavaScript 访问相同的 Web api 来访问浏览器功能。 Webassembly 还支持非 web 嵌入。

  关于它的特性介绍,JS的对比和官方文档都比较全,就不用列传风再啰嗦一遍了,主要是古文编起来的太累。列几个如下:

  1. 《 [阮一峰]asm.js 和 Emscripten 入门教程》
  2. 《Why WebAssembly is Faster Than asm.js》
  3. 《Emscripten Doc》
  4. 千言万语不如来一发(Developer’s Guide)

  另外,安装时候,友情提示使用python3, python3, python3;否则,会浪费时间,还被折腾的很惨。python2.x的错误长这样。

代码语言:javascript复制
Installing tool 'node-12.9.1-64bit'..
Error: Downloading URL 'https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/node-v12.9.1-darwin-x64.tar.gz': <urlopen error unknown url type: https>
Warning: Possibly SSL/TLS issue. Update or install Python SSL root certificates (2048-bit or greater) supplied in Python folder or https://pypi.org/project/certifi/ and try again.
Installation failed!

  降魔法术:

代码语言:javascript复制
# python3 emsdk.sh install latest

  后面的安装以此类推。不想在本机安装的,有几个选择,

  1. 懒人网站 WebAssembly Explorer ,单个文件玩玩还可以,大工程就靠边站了。
  2. docker镜像,envoy提供
  3. wasme - solo.io提供

  这不是重点,可以不用关心它怎么来的,对于工程师而言,需要关心它是干什么的,如何使用它。因此我们留在下一节重点讲述一下wasme的使用。

参考文献

  1. 《 [阮一峰]asm.js 和 Emscripten 入门教程》
  2. 《Why WebAssembly is Faster Than asm.js》
  3. 《Emscripten Doc》

0 人点赞