4 个场景揭秘,如何低成本让容器化应用 Serverless 化?
作者 | changshuai
FaaS 的门槛
Serverless 形态的云服务帮助开发者承担了大量复杂的扩缩容、运维、容量规划、云产品打通集成等责任,使得开发者可以专注业务逻辑、提高交付速度 (Time-to-market) ,持续优化成本。Function-as-a-Service (FaaS) 作为云上最早也是应用最广泛的 Serverless 计算形态,在几年的时间内吸引了大批开发者,逐渐建立了 Serverless 优先的选型逻辑。然而从传统应用迁移到 FaaS 在开发者体验上还面临诸多挑战:
环境不统一:各厂商定义的交付物格式,运行环境兼容性、丰富度都不尽相同,需要开发者适配,甚至重新编译;
学习成本:打包依赖库、构建成压缩代码包和熟悉的开发部署方式不同;
服务限制:如代码包限制在百 MB 级别,迫使交付物代码依赖分离,加大管理和发布难度;
交付物缺乏版本管理:格式不标准,最佳实践不统一,需要开发者自行负责;
生态不成熟:缺少流行开源工具(如 CI/CD 流水线)的支持和集成。
另一方面,容器在可移植性和交付敏捷性上实现了颠覆式创新。围绕容器的生态沉淀非常丰富且成熟,被广泛接受使用,应用容器化正在快速成为开发和部署的事实标准。然而容器本身并没有减轻运维、扩缩容、闲置成本、和云服务集成等难题。
函数计算支持容器镜像
阿里云 FaaS 函数计算支持容器镜像作为函数交付物,将容器优秀的开发、部署、生态(上线前)结合函数计算自身免运维、零闲置成本、云服务集成等特性(上线后),全面升级开发者体验:
简化应用 Serverless 化:无需修改代码或是重新编译二进制、共享对象(*.so),本地调试,保持开发和线上环境一致;
更大函数代码限制:解压前镜像最大支持 1 GB(相比代码包最大解压前 50MB),避免代码和依赖分离,简化分发和部署;
容器镜像分层缓存:增量代码上传和拉取,提高开发效率和降低冷启动延迟;
镜像分享、复用:逻辑可以移植、减少重复开发建设;
混合部署:同一应用 Serverfull (ECS, 容器 ACK)、Serverless (FC, ASK, SAE),不同应用混合部署或同一应用不同服务间切流,达到性能一致、资源刚性交付、快速扩容、运维最小化的平衡;
CI/CD:持续构建、集成测试、代码上传、存储和标准的版本管理,丰富的开源生态 CI/CD 工具可以复用。
典型客户场景
1. 事件驱动音视频处理
音视频处理有流量波动较大、对计算资源弹性要求高、监听视频上传事件以及依赖工作流和队列等服务的特性,使得 FaaS 成为自建音视频业务上云的首选。然而这类场景中最常用的软件 ffmpeg 往往需要定制编译满足不同的需求。编译的二进制依赖编译环境中的共享对象(*.so)和 glibc 等库,与 FaaS 运行环境不兼容无法运行。重新编译不仅带来了额外工作,不同的依赖和版本也给业务稳定性带来了挑战。
如下图示例,使用已有 Dockerfile 将转码逻辑以及相关依赖保持现有的安装方式和完全隔离的容器沙箱运行环境,极大降低迁移成本,稳定性风险和 FaaS 的开发部署学习成本。
2. Serverless AI/ML 模型预测、推理 serving
AI/ML 推理预测服务同样可以享受 FaaS 免运维、自动伸缩、低成本的好处。然而社区流行的框架如 TensorFlow 都默认以容器镜像的方式分享和复用。不仅官方提供了完整的版本覆盖,基于官方镜像的社区生态也非常活跃。
在离线模型训练阶段以容器镜像部署在 ECS 或 ACK/ASK GPU 集群。在服务推理/预测(serving inference/prediction)阶段,CPU 往往是性价比更高的选择。Serving 的特点是请求量驱动,既需要能快速响应突发(burst)流量,又要在波谷周期释放资源,甚至是缩容至0节省成本。而这些需求天然就是函数计算所擅长的。
在没有容器镜像支持之前,想要将一个 TensoflowFlow serving 的示例部署在函数计算上并不容易。TensorFlow 本身的库大小远超过代码包 50MB 的限制,将依赖打包进 NAS 可以绕过这个问题,然而却增大了上手和迁移的难度。不规范的依赖和版本管理也为变更引入稳定性风险。而使用容器镜像以及函数计算 HTTP server 的编程模型,简单的几行 Dockerfile 就可以在 FC 跑起来 Tensorflow Serving 的示例:
函数计算支持容器镜像帮助 AI/ML 场景平滑地混合部署容器和函数,统一 CICD 工具、流程和最佳实践。函数计算免运维、高并发、百毫秒级别的实例扩容和 100% 资源利用率进一步优化了服务质量和成本。
3. 传统 Web 单体 HTTP 应用 Serverless 演进
传统 Web 单体 (monolithic) 应用现代化有三个主要的诉求:责任拆分、减轻运维压力(资源规划、系统升级、安全补丁等运维负担)以及成本优化。虽然采用职责单一的函数是一种最佳实践,但是进行职责拆分往往需要更长时间的设计和重构。借助函数计算的镜像支持能力,单体应用可以很容易的迁移至 FaaS 服务以满足免运维,弹性水平扩展和100%成本效率的诉求。
传统 Web 应用由于历史原因或者业务复杂度,运行环境(容器镜像)和业务逻辑往往高度耦合且解耦代价较高。为了 Serverless 化改造有时不得不升级操作系统及依赖库版本,在 FaaS 厂商提供的环境中重新编译。迁移至 Serverless 架构有时间成本和稳定性风险。函数计算对容器镜像的支持帮助传统容器化 Web 应用无改造,更快地享受 Serverless 的价值,将时间和精力专注于业务逻辑创新和迭代而非重复枯燥的环境、依赖版本管理、升级维护和容量规划和伸缩。
4. 云上云下,跨云厂商混合部署
企业上云的节奏在不断加快,然而由于业务特性,私有云和公共云混合的运行方式将是未来相当长一段时间内作为常态。企业甚至需要多云厂商来保证迁移、容灾、资源刚性交付的需求。容器镜像是云上、云下的软件交付物统一的默认选择。
函数计算自定义 runtime 选择 HTTP server 标准的交互方式,函数代码编程方式不与厂商绑定,减轻企业对云厂商锁定(vendor-lockin)的顾虑,在云上可以运行的函数,在云下甚至其他云厂商同样可以作为独立的 HTTP Web 应用单独部署,服务请求。容器打包的函数可以运行在其他云服务的容器服务或 IaaS 自建服务,实现多云的容灾、弹性资源保障。
冷启动最佳实践
- 容器镜像地址推荐使用与函数计算同地域的 VPC 镜像地址,例如
registry-vpc.cn-hangzhou.aliyuncs.com/fc-demo/helloworld:v1beta1
, 以获得最优的镜像拉取延时和稳定性; - 镜像最小化,使用类似 docker-slim 工具仅保存必要的依赖和代码,避免不需要的文档、数据或其他文件造成的额外延迟;
- 在资源允许和线程安全的情况下,搭配单实例多并发一同使用,可避免不必要的冷启动,同时降低成本;
- 容器镜像配合预留实例一起使用,消除冷启动。
DevOps/GitOps 最佳实践
容器镜像的支持标准化了构建步骤和函数交付产物,让复用 CI/CD 工具成为可能。函数计算与阿里云云效 DevOps 服务集成,推出了 CI/CD 流水线。
如下图所示,当有新的代码被 push 进入代码仓库(Github/Gitlab) master 分支, 构建流水线任务被开启,按照代码中指定的 Dockerfile, 容器镜像会被构建并推送至阿里云容器镜像服务。流水线的最后一个步骤会部署发布新版本的函数,完成一次自动化的发布。
除了云效 DevOps 完整自动化的持续集成交付体验,阿里云容器镜像服务和自建开源 CICD 流水线也同样可以用下图展示的方式自动化函数发布。函数计算发布方式的标准化使得企业可以用统一的工具持续交付多个不同的服务,降低开发运维人员对部署工具的学习成本,自动化部署提高成功率和交付速度 (time-to-market)。
和 Custom Runtime 的异同
函数计算在 2019 年已经推出了自定义运行时 Custom runtime,那么这次发布的自定义容器(custom-container)和已有的运行时有和异同呢?
相同的编程模型和函数计算系统的交互方式:完全相同的 HTTP server 协议,已有的 custom runtime 函数可以直接移植到环境兼容的自定义容器环境中,不需要修改代码;
两个 runtime 有不同的适用场景和取舍:
对于非容器化的应用,您可以持续使用 custom runtime;
对于冷启动延迟容忍度较低的场景,推荐您使用 custom runtime 节省镜像拉取时间;
对于异步离线且已经容器化的任务(job 类型),推荐您使用 cutome-container runtime;
使用函数计算预留实例,且部署环境和业务逻辑耦合紧密的应用可以优先考虑使用 custom-container runtime。
未来规划
随着容器逐渐成为应用交付部署的标准方式,FaaS 会和容器生态做更紧密的融合,帮助容器化的应用以更低的成本 Serverless 化,包括周边配套生态例如声明式的部署方式的融合,同 K8s 相似的应用抽象,云原生可观测性软件集成。基于容器镜像拉取加速,让函数计算能兼顾可移植和快速启动的性能。
容器技术和 Serverless 的初心都是要帮助用户更快地交付(time-to-market)和持续优化成本,消除资源闲置产生的浪费,增加企业竞争力。
最终云原生的两大技术领域:Serverless 和容器技术的联系将会变得更加紧密,开发部署运维差异不断缩小,让开发者几乎不需要修改业务逻辑即能为不同的工作负载选择合适的技术方案,用开放、标准、统一的云原生技术持续创新,为客户创造更多价值。
课程推荐
为了更多开发者能够享受到 Serverless 带来的红利,这一次,我们集结了 10+ 位阿里巴巴 Serverless 领域技术专家,打造出最适合开发者入门的 Serverless 公开课,让你即学即用,轻松拥抱云计算的新范式——Serverless。
点击即可免费观看课程:https://developer.aliyun.com/learning/roadmap/serverless
4 个场景揭秘,如何低成本让容器化应用 Serverless 化?的更多相关文章
- Spring揭秘 读书笔记 五 容器的启动
Spring的IoC容器所起的作用,就是生产bean,并维持bean间的依赖关系.它会以某种方式加载Configuration Metadata(通常也就是XML格式的配置信息),然后根据这些信息绑定 ...
- 【sping揭秘】9、容器内部事件发布(二)
写在前面---------------------------------- 命运多舛,痴迷淡然 不知下一步该往哪里走,现在应该是我的迷茫期... 加油,快点走出去!!! 聪明的网友们,你们有没有迷茫 ...
- 【sping揭秘】8、容器内部事件发布(一)
容器内部事件发布 Spring的applicationContext容器提供的容器内事件发布功能,是通过java提供的自定义事件实现的 事件类型:eventObject 类继承 事件监听:eventL ...
- java接口入参模板化,适用于企业化服务远程调度模板化的场景,接口入参实现高度可配置化
需求:远程服务接口模板化配置提供接入服务 模板接口分为三个模块:功能路由.参数校验.模板入库 路由:这里的实现方式很简单,就是根据业务标识找到对应的处理方法 参数校验: 参数校验这步涉及模板和校验类两 ...
- Serverless Kubernetes全面升级2.0架构:支持多命名空间、RBAC、CRD、PV/PVC等功能
Serverless Kubernetes概述: 阿里云Serverless Kubernetes容器服务最新开放香港.新加坡.悉尼区域,同时全面开放2.0架构,帮助用户更加便捷.轻松地步入“以应用为 ...
- 从单体迈向 Serverless 的避坑指南
作者 | 不瞋 导读:用户需求和云的发展两条线推动了云原生技术的兴起.发展和大规模应用.本文将主要讨论什么是云原生应用,构成云原生应用的要素是什么,什么是 Serverless 计算,以及 Serve ...
- 如何通过 Serverless 技术降低微服务应用资源成本?
前言 在大型分布式 IT 架构领域,微服务是一项必不可少的技术.从本质上来讲,微服务是一种架构风格,将一个大型的系统拆分为多个拥有独立生命周期的应用,应用之间采用轻量级的通信机制进行通信.这些应用都是 ...
- 容器场景要选择什么 Linux 版本?
容器的底层实现深度依赖于内核的众多特性,如 overlay 文件系统,namespace, cgroup 等,因此内核的功能和稳定性,在很大程度上,决定了整个容器PaaS平台的功能和稳定性.从 TKE ...
- 首次揭秘:阿里巴巴中间件在 Serverless 技术领域的探索
Serverless 话题涉及范围极广,几乎包含了代码管理.测试.发布.运维和扩容等与应用生命周期关联的所有环节.AWS Lambda 是 Serverless 领域的标志性产品,但如果将其应用于核心 ...
随机推荐
- JAVA简单精确计算工具类
1 public class ArithUtil { 2 3 // 默认除法运算精度 4 private static final int DEF_DIV_SCALE = 10; 5 6 privat ...
- 理解Java中对象基础Object类
一.Object简述 源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面. 所以在Java中有一句常说的话,一切皆对象, ...
- JDK1.8源码(八)——java.lang.ThreadLocal类
https://www.cnblogs.com/xdd666/p/14734047.html ThreadLocal https://www.cnblogs.com/yanfei1819/p/1473 ...
- CSS导航菜单(一级菜单)
index.html <div class="nav"> <ul> <li><a href="#">Java&l ...
- 【数据库上】第五讲 E-R模型扩展知识
第五讲 E-R模型扩展知识 一.E-R模型设计主意问题 1.1 用实体还是实体集 案例:学院对象的表示 应将各个学院看做实体集,还是实体? 方法一:将各个学院看作一个实体集 如果各学院具有不同属性特征 ...
- Verilog RTL优化策略(一):推荐使用assign语法替代if-else和case语法
参考 <手把手教你设计CPU--RISC-V处理器篇> 先给出不用if-else和case的原因 Verilog中的if-else和case语法存在两大缺点: 不能传播不定态X: 会产生优 ...
- Fastjson 1.2.22-24 反序列化漏洞分析(1)
Fastjson 1.2.22-24 反序列化漏洞分析(1) 前言 FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转 ...
- split文件切片
文件上传下载过程中经常会遇到网络不稳定,或者传输软件限制传输的文件大小之类的问题.在当今换没有出现很好的软件的时候,一个available方法是将大文件切片,也就是 切成小文件,然后通过其他方法put ...
- Ts基本数据类型
TS的基本数据类型 string let str : string str = 1 //报错 会提示num是字符串 不是数字 str = 'test' //正确 //拼接字符串 let str2 : ...
- python刷题第四周
本周有所收获的题目: 第一题: 第4章-17 水仙花数(20 分) (20 分) 水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身. 例如:153=1×1×1+5×5×5 ...