云原生之路:Serverless 发展现状(2020)

引言

Numquam ponenda est pluralitas sine necessitate. 
如无必要,勿增实体。—— William of Ockham

之前,我们探讨了 Kubernetes 中最常见的几类典型应用场景和如何优雅地解决两地三中心部署的问题。一直关注我们这个系列文章的读者,想必此时心中或多或少有个这么个疑问:会写 K8s 的各种 Yaml,能把应用容器化部署在 K8s 上,我的应用就是云原生了么?怎么样才是“云原生”?

小编才疏学浅,对这些疑问暂时无法直接解答。不过,后面几期我们将从不同视角介绍一些“云原生”中的新潮概念。相信读完之后,你也许会对“云原生“有不一样的理解。

本期,我们先来聊一聊“云原生圈”里的顶流之一 —— Serverless。

在工业界,2012 年 Iron.io 公司率先提出了“无服务”,2014 年 AWS 发布了 Lambda 商业化产品。自 2014 年以来,Serverless 的热度急剧飙升,远超”云原生”、“Service Mesh”等概念。因此说Serverless 是云原生中的”当红明星“,一点不为过。

初识

Serverless 是云平台提供的一种计算服务,终端用户不需要部署、配置或管理服务器,代码运行所需要的服务器环境皆由云平台来提供。 – wiki

Serverless

什么是 Serverless ?

广义上,Serverless 可以是一种理念,可以是一种架构,也可以是一种产品。

狭义上,Serverless 是指”无服务器”计算,有时也简称“无服务”。但“无服务器“计算并不是说应用运行时候不再需要服务器了,我们的代码还是要实打实的跑在各种架构的服务器上的。它是强调,使用者无需在关心服务器等一系列基础设施的运维。

从概念上看,并没有那么复杂,本来无服务也是以“简单”为主要卖点,归纳总结各家厂商的产品,它基本只涉及两块内容:后端设施(Backend)和函数(Function)。

  • 后端设施是指数据库、消息队列、日志、存储,等等这一类用于支撑业务逻辑运行,但本身无业务含义的技术组件,这些后端设施都运行在云中。
  • 函数是指业务逻辑代码。用户最需要关注的部分。

且有如下三个核心特点:

  1. 极致弹性 - 应用实例数可以快速地从 0 横向扩展多个副本。同时,不需要时也可以及时缩容,减少成本。
  2. 按需收费 - 相比传统的以配额为中心的预留资源费用模式。Serverless 可以像使用手机电话一样,以实际运行时间和资源规格的方式付费。
  3. 简单易用 - 云厂商封装了监控、报警、日志的能力,并提供消息队列,数据库等其他丰富中间件服务,并提供简单易用的用户界面

这些特点,大大的降低了开发者使用云资源的门槛,实现真正的”以开发者为中心“,也是 Serverless ”备受瞩目“的原因。

FaaS

上文提到了一个词,”函数“。对,就是你理解的那个函数,就是你在 IDE 里敲打的那个 func代码。

在 Serverless 发展史上,2014 是个重要年份。这一年 AWS 发布了 Lambda 商业化 Serverless 产品。不过 AWS Lambda 准确地说应称为 FaaS(Function as a Service,函数即服务)。类似 PaaS、SaaS ,FaaS 实际上也是一个平台,它管理”函数“或”函数集合“,提供运行环境,运维监控,成本审计等一些列功能服务。

FaaS 管理对象是函数,那我们就从一个函数代码部署-执行-终结生命周期角度,看看 FaaS 有什么?

https://github.com/OpenFunction/OpenFunction/blob/main/docs/images/function-lifecycle.svg

  1. 转换(Transform): 将业务的函数代码,加上依赖包库,加上配置文件,打包转换成可运行的应用代码。
  2. 构建(Build): 将应用代码构建成可部署的二进制或者容器镜像
  3. 部署(Deploy): 将构建出的二进制或镜像部署运行在底层 runtime 平台上,如 k8s。同时自动化按需运维,根据指标进行扩缩容,或从 0 冷启动。
  4. 触发(Trigger): 提供将函数转成标准的触发方式,接入到事件驱动的触发环境,如 API 网关等。提供从外部调用入口。
  5. 其他功能(Addition): 提供额外的功能,包括不限于: 可交互的编辑器,在线调试,版本管理,监控告警,成本审计等

这里小编粗略对比一下在 FaaS 上开发一个应用的过程,和在单机操作系统上开发一个应用的过程:

开发过程 在 FaaS 上开发 在单机 OS 上开发
编辑 本地或在线编辑一个 func 本地编辑一个 func
打包 上传依赖描述文件、配置文件 将手动下载依赖包库,配置文件
构建 自动构建函数 手动编译:go build javac ,构建 war jar image 等包
部署 自动部署函数 命令行运行程序:go run main python func.py java hello
调用 调用平台暴露的函数 url 调用程序暴露端口:curl http://127.0.0.1:8080
观测 可视化 dashboard,日志 调用操作系统接口:ps aux``top,查看日志文件

可以发现,在 FaaS 上写函数和单机上写代码基本过程类似,只是手段和方法不同,而且使用 FaaS 会更加简单。

Serverless 与 FaaS 关系

FaaS 和上面提的 Serverless 是什么关系呢?

简单讲,FaaS 是 Serverless 的一种。Serverless 除了 FaaS,常见的 P2P 也算得上是其中的一种。但作为 Serverless 的子集,FaaS 也是其最具代表性的产品形态。


图片来源:Status of Serverless Computing and Function-as-a-Service(FaaS) in Industry and Research

再遇

“如果说微服务架构是分布式系统这条路的极致,那无服务架构,也许就是“不分布式”的云端系统这条路的起点。” —— 《凤凰架构》

愿景

大家研究分布式架构,最初是由于单台机器的性能无法满足系统的运行需要。而对开发而言,不去做分布式是否才是最简单的路子?虽然绝对意义上的无限性能必然是不存在的,但云计算带来的,相对意义的无限性能已经成为了现实。Serverless 愿景是让开发者只纯粹地关注业务,不需要考虑:

  1. 技术组件:后端技术组件是现成的,可以直接取用,没有采购、版权和选型的烦恼;不需要考虑如何部署,部署过程完全是托管到云端的,工作由云自动完成;
  2. 算力:有整个数据中心支撑,算力可以认为是无限的;
  3. 运维:维护系统持续平稳运行是云计算服务商的责任而不再是开发者的责任。

假如单台服务器的性能可以是无限的,那对于开发者而言,还何需关心分布式、容器化、SOA、微服务、负载均衡、资源调度、服务治理等各种繁琐复杂架构概念。可以像开发单机程序一样,只需专注于纯纯粹粹的业务逻辑本身,专专心心地写代码、赏代码、品代码。这就是 Serverless 最宏观的愿景。

困境

不过,Serverless 愿景过于美好,从中短期或者从业界的落地情况来看,目前 Serverless 仍有局限。它所擅长的是短链接、无状态、适合事件驱动的交互形式的场景,如:

  1. 不需要交互的离线大规模计算;
  2. 多数 Web 资讯类网站、小程序、公共 API 服务、移动应用服务端等;
  3. 开发运维自动化;
  4. 大规模批处理任务;

对这些适合的应用,确实能够降低开发和运维环节的成本。但另一方面,对于业务逻辑复杂,依赖服务端状态,响应速度要求较高,需要长链接等这些特征的应用,至少目前是相对并不适合的。如:

  1. 传统的信息管理系统;
  2. 网络游戏等应用;

另外,Serverless 的能力离不开云平台的能力。

首先,Serverless 服务的提供者是云平台。脱离了云平台,服务器的运管全部亲力亲为,研发运维一把抓,何谈 Serverless?

其次,Serverless 服务的灵活性和易用性,完全依赖于云平台能提供的其他服务丰富度和灵活性。云平台能提供的如文件存储、对象存储、消息队列、数据库等基础服务能力,以及如监控、告警、分析、通知、计费、流控等 BaaS 服务能力,直接影响 Serverless 用户使用体验和适用场景。

因此,在思考自己的业务场景是否适合使用 Serverless 时,首先就要看云平台提供的周边配套够不够、好不好。

结语

We can only see a short distance ahead, but we can see plenty there that needs to be done. —— Alan Turing,1950

在云计算概念提出的早期,2009 年,UC Berkeley 发表了一篇论文 ——《Above the Clouds: A Berkeley View of Cloud Computing》,文中预言了云计算的价值和演进,今天看了基本都一一应验了。

十年之后的 2019 年,他们又以同样的命名风格,发表了一篇新论文 ——《Cloud Programming Simplified: A Berkeley View on Serverless Computing》,文中把 Serverless 架构下,开发者不再关心技术层面的这些细节,类比成当年软件开发从汇编语言踏进高级语言的发展过程,开发者可以不去关注寄存器、信号、中断等与机器底层相关的细节,认为 Serverless 的发展将人们从机器细节的苦海中解脱出来,令生产力得到极大地解放,并预言“无服务将会发展成为未来云计算的主要形式”

那么,Serverless 会是解决软件开发复杂度和效率之间的那颗银弹吗?是否会发展为未来云计算的主要形式? 我们拭目以待。

参考资料

  1. OpenFaaS
  2. OpenFunction
  3. 阿里巴巴云原生白皮书
  4. 凤凰架构
  5. knative
  6. AWS Lambda