Serverless平台介绍

写在前面

2022年8月底入职这家公司到现在(2024年1月)一直在从事Serverless/FaaS平台的开发,对Serverless还是有一点心得,后续将转到其他小组从事公司内部K8s集群开发管理,因此在这里记录一下Serverless。

公司内部的Serverless介绍

在公司内部的Serverless系统被称为函数平台,函数平台也是一个发布平台,只不过在上面发布的服务具备天然的弹性。理想状态下,用户只需发布服务,不必关心这些服务需要多少实例及其规格。那它具体有哪些优势呢:

  • 飞快的发布速度:从构建到部署耗时 10-60 秒
  • 极致的伸缩能力:根据流量在 0-N 个实例间伸缩,高峰扩容,低谷缩容,无请求无实例
  • 领先的观测体验:为每个函数打造标准看板,在一个地方即可完成日志、指标数据分析,并内置标准告警
  • 丰富的语言支持:Go、Python、NodeJS、Java

场景

我们不认为所有场景都应该使用函数平台,适合的才是最好的,近来国外(比如亚马逊或者微软)甚至开始将他们的某些服务下云。什么样的场景应该考虑使用函数平台?来看看 CNCF Serverless Whitepaper 的描述:

  • 异步、易并发化:调用方不需要同步等待请求结果,执行过程可以拆解成多个可并发执行的单元
  • 有潮汐效应:服务存在明显的高峰和低谷,且高峰和低谷的程度存在易变性
  • 无状态、暂时性:服务本身没有状态,进程不需要常驻
  • 无需保证绝对的低时延:对偶尔的冷启动 (百毫秒级别) 不敏感
  • 业务变动快:业务处于快速变动,代码逻辑调整频度高,且常常需要写一些试验性或适配逻辑

业界

基本概念

函数

函数是函数平台的部署、运行和弹性单元,它可以是一段 Python 脚本,也可以是一个普通的 HTTP 服务。
与公有云的产品 Lambda、CFC 等不同,我们公司的函数并非是严格意义上的 Function,而可以是任意的 HTTP 服务,这个服务甚至可以暴露任意数量的接口。我们在实践和推广中发现,将微服务近一步拆分成单个函数过于理想化,实操门槛高,且与既有的开发方式相违背,因此有了上述修正。

运行时环境

开发者可以用不同的编程语言来编写函数,这些函数需要在不同的运行时环境上运行。在一些特殊场景中,还需要额外定制运行时环境,如挂载特别的存储目录、增加非预置的动态链接库等等。

部署环境

函数平台支持用户将函数发布到不同的部署环境中,如开发、测试、预演部署环境:

  • 上海(dev)
  • 上海(test)
  • 上海(ontest)
以及线上环境:
  • 上海(prod)
  • 北京(prod)
  • 曼谷(prod)
    开发、测试、预演和线上环境可以适配不同用户的开发流程;而多线上环境之间提供区域内就近路由的能力,方便用户将函数整合进异地多活架构中。

触发器

根据场景需要,用户可以通过不同触发器启动函数的执行:

  • 消息:将指定消息队列中的新消息交给函数处理,如数据的 ETL。(目前支持 Kafka、RocketMQ)
  • 定时:要每隔一段时间执行一次函数,如数据的备份
  • HTTP:直接通过访问 HTTP 接口调用函数,如利用 webhooks 优化 GitLab 开发流程
  • API 网关:暴露到外网,供 App 和 Web 访问的接口,默认接入 WAF,安全无忧

架构

在这里插入图片描述

整个函数平台由 6 部分构成:交互、API、触发器、引擎、存储和可观测性。

  • 交互:函数平台为用户提供了 3 种交互方式:Web、CLI 和 Chat(公司内部的飞书机器人)
  • API:函数平台对上层应用提供的 HTTP 接口,目前主要提供给交互层使用,也支持外部接入
  • 触发器:见文档基本概念的相关章节
  • 引擎:
    • 伸缩引擎:支持用户自定义函数的伸缩逻辑
    • 计算引擎:负责分配、调度、回收函数资源
    • 构建引擎:将用户编写的源代码构建成制品
  • 存储:
    • 源码与制品:在对象存储中
    • 函数元数据:作为 K8s 自定义资源存储
    • 平台元数据:在关系型数据库MySQL中
  • 可观测性:Loki(日志)、Thanos(指标)、Tempo(调用链追踪)、Grafana(可视化/告警)

过程

调用

根据请求当时计算引擎中是否存在已经初始化好的函数实例,可以分成热启动和冷启动两种情况:

热启动
  1. 触发器发送 HTTP 请求到路由模块
  2. 路由模块从缓存中取出可用的函数实例地址,并将第 1 步收到的请求转发到实例地址
冷启动
  1. 触发器发送 HTTP 请求到路由模块
  2. 路由模块请求向实例池请求可用的函数实例
  3. 实例池选择一个实例并完成初始化,后将它的服务地址返回给路由模块
  4. 路由模块将第 1 步收到的请求转发给第 3 步获得的服务地址
    池中的实例被初始化以后将不再回收,K8s 的 kube-controller-manager 发现池中实例总数减少时,会继续往里补充新的待用实例。

生命周期

一般而言,每个函数实例从启动到被回收都会经历以下阶段:

  1. 调度:资源调度器下发实例调度的指令
  2. 拉取镜像:收到调度请求的节点拉取函数的运行时镜像
  3. 容器初始化:用拉取的镜像初始化容器
  4. 运行时初始化:启动函数平台的运行时服务
  5. 函数代码初始化:加载并运行用户函数
  6. 执行请求:根据调用方发来的请求执行逻辑并返回结果
  7. 空闲:处理完所有请求后,函数会闲置一段时间,以备新的请求到来
  8. 函数销毁:函数实例处于空闲状态超过一定时间后,会被平台销毁

扩缩容

目前平台的扩缩容策略完全依赖于函数的「实例并发数」配置。函数平台会存储每个函数当前正在处理的请求数量,当并发请求数量超过设置的阈值后,平台会继续通过冷启动扩充新的实例;经过流量高峰后,函数实例陆续进入空闲状态,逐步被系统回收。

实现

当前,函数平台所用的计算引擎是来自于 CNCF 社区的 Fission,欲了解具体实现原理可以移步 Fission 文档。后续有计划迁移到knative

痛点与存在的问题

我们公司不同于阿里或者亚马逊,可以通过出租或者售卖服务赚钱,我们面向的客户都是企业内部用户。我们都知道Serverless的优势:
降低运营成本,Serverless将用户的服务器,数据库,中间件委托于BaaS/FaaS,用户将不再参与基础设施及软件的维护,尤其在大规模的集群运营上成本大幅度降低。开发成本,对比IaaS或者PaaS平台的服务器或者操作系统,Serverless的架构中,用户操作的是服务化的组件比如存储服务,授权服务等,可以缩短开发周期,降低开发难度。
但是由于我们公司还在草莽生长的快速发展期,公司内部各部门对降本增效的要求不高,因此推广Serverless/FaaS效果不是特别明显,随着公司开始在意成本问题,Serverless/FaaS肯定会被大力推广。

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值