酷家乐私有化 Serverless Application 的探索与思考
创新业务、内部系统的函数占比依旧高达 70%+,真·核心业务接入较少且场景相对简单
FaaS 在整体网站架构里的中间层作用明显,但是以整块业务形态落地的 SFF 场景并不多
FaaS 用户大多都是前端开发工程师,对于多函数(聚合部署)使用频率非常高,单逻辑函数使用越来越少
从落地场景上,逻辑单一的函数业务场景很少,多做为数据聚合或简单后台的场景
从业务维护上,颗粒化的函数开发方式会带来额外的隐性逻辑串联成本,业务不易结块,导致整体项目使用或改造的倾向度低
从基建成本上,提供的 FaaS 开发语言 runtime 种类基本就圈定未来的用户群体,这也间隔限制了可能接入的业务场景
从架构现状上,中型公司的技术架构往往倾向于稳定,业务开发分配范围广但责任明确,FaaS 价值发挥相对有限,会很依靠于架构调整的机遇; 而小公司的高速上线模式、大公司的私有化 Bu FaaS 可能会更适合 FaaS 生长
每个服务都需要添加 ci yaml,用户操作多余
无法约束用户不去修改 ci yaml 行为,虽然是对内操作,但长期对用户暴露也是件危险的事情
流程上无法自定义执行阶段,如有 stage 或 脚本内容 需要变更,是需要用户自行修改或更新,无法做到统一更新,也不利于引入例如质量卡点等检测机制
无法把用户操作都收聚在 Serverless 管理平台,使用 GitLab CI 会使得部署和版本操作是分离的,而且用户需要在 GitLab 额外维护查看及部署权限,不利于整体维护
GitLab CI 机器资源为内部共用,高峰期经常会出现排队现象,无法实现 Serverless 资源池私有化
服务治理:微服务架构是否统一?Service Mesh or 传统 RPC 框架 ?cmdb 规范?
可观察性:调用链接入?日志是否落盘?监控数据采集方式?告警规则设定?
流量管理:增设多级流量网关?熔断限流黑名单等基础功能满足?定制化需求?
……
通过对 Pod 添加 Volume 信息实现日志挂载(from deployment)
所有被采集的服务都必须要有 cmdbtag(按服务按天分索引,优化查询速度)
Serverless Application:服务部署位置在各个服务组分配的 namespace 下,cmdbtag 操作也有明确的审批流程,所以我们采用内部标准方案,通过“挂载 Volume”方案实现日志收集,期间需要用户主动声明容器内日志文件路径。
Serverless FaaS:服务部署位置及服务命名都有一定的约束,注册函数时也会同步注册 cmdbtag;出于简化整体流程,我们额外采用“非挂载式日志收集”方式来达到“不需要关心日志如何被收集,直接就能在云平台上查看日志”的用户期望。
私有化 Serverless 可能不适用于研发体量小或云原生基建缺失较多的公司,前面也有提到,Serverless是个系统产品,需要融入很多内部基建能力。为了 Serverless 反而需要投入更多甚至几倍的研发资源到缺失的基建开发上,一定程度上来说是背道而驰的做法。企业内私有化 Serverless 的形成是一个自然而然的演进过程,得先有底子,才有可能落地开花。
在做私有化 Serverless 之前,第一步需要先分析 Serverless 能带来的业务价值并且明确受众、调研公有云是否无法达成、预估整体投入产出比,第二步是确定合作目标,推进方需要根据专业的领域寻找专业的团队,不可盲目自研,第三步就是确定 Serverless 产品边界,底层技术革新难免会出现所谓的“功能重复”,这时候我们需要守住初衷和产品定位,拉开与“看似重叠”产品的差异性,体现出价值;这样 Serverless 落地之路会好走很多。
国内外对于 Serverless 产品定义和价值还没有完全统一,各个平台间也有着自己的标准,在当前百家争鸣的阶段,我们可以多关注主流云商的产品走向以及开源社区动态,结合内部业务诉求,适式调整发展路线。
冰蛙、三土,来自酷家乐前端基础架构团队。
东悦、吕仙,来自酷家乐运维团队。
https://tech.kujiale.com/kujiale-serverless-faas-experience/
https://argoproj.github.io/
https://knative.dev/docs/serving/