Serverless X OpenKruise 部署效率优化之道
作者 | 许成铭(竞霄)
Serverless 作为云计算的最佳实践、云原生发展的方向和未来演进趋势,其核心价值在于快速交付、智能弹性、更低成本。SAE(Serverless 应用引擎)作为首款面向应用的 Serverless PaaS 平台,实现了 Serverless 架构与微服务架构的完美结合,使存量应用也可以零代码改造享受 Serverless 赋予的技术红利,目前正在增强多语言特性,向多负载类型多元化场景方向演进。作为 Serverless 平台,高效的应用部署效率无疑是产品的核心竞争力,也是弹性伸缩、智能托管的基础。更快的部署效率,意味着更好的用户体验,更低的用户成本,更极致的弹性能力。SAE 极致弹性项目,力求提升应用端到端启动速度,保证用户在突发场景下的快速扩容效率和系统稳定性 SLA 。
Serverless 应用引擎:https://www.aliyun.com/product/aliware/product/sae
项目背景
SAE 底层使用 Kubernetes 架构,使用神龙裸金属安全容器、 ECI 两种资源池,用户在 SAE 中运行的应用会映射到 Kubernetes 中相应的资源。
通过采集线上全量 K8s 事件,整个 Pod 的创建生命周期进行分节点、分阶段的耗时统计分析,以神龙节点为例,各阶段比例如图:

从图中可以看出,整个 pod 的创建生命周期包括调度,拉取并创建 init 容器,拉取用户业务镜像,创建和启动容器等。其耗时主要集中在调度和拉取用户镜像上。究其原因在于 SAE 神龙节点调度链路整体耗时较长,而镜像耗时主要在于拉取镜像与解压镜像的时长,特别是在大容量镜像部署的情况下尤为突出。
实施方案
SAE 团队从长期架构规划,使用场景通用性等多个方面进行方案调研分析, 考虑采用原地升级的部署策略代替重建升级策略,避免部署过程中重调度,减少整体耗时。
所谓原地升级,即只更新 Pod 中某一个或多个容器版本、而不影响整个 Pod 对象、其余容器的升级,而且在升级过程中保证 ip、node 不发生改变。在阿里巴巴内部,绝大部分电商应用在云原生环境都统一使用原地升级的方式做发布,这种原地升级的模式极大地提升了应用发布的效率,节省了调度,分配网络,挂载磁盘以及拉取镜像的耗时。通过分析线上 SAE 用户历史部署记录,发现只更新镜像/程序包部署应用的占大多数,也就是说原地升级能力非常适合在 SAE 产品中落地。

原地升级给 SAE 带来的优势在于:
- 避免重调度,避免 sidecar 容器重建,整个部署耗时只需要拉取和创建业务容器;
- 无需调度,可以预先在 Node 上缓存新镜像,提高弹性效率;
- 可以保持 ip 不变,避免因 ip 变化导致依赖组件如注册中心感知的延时;
- 减少重建 pod 对调度器,注册中心,业务上下游的压力。
与此同时,OpenKruise 项目已经将原地升级能力通过 CloneSet / AdvanceStatefulSet 贡献于开源。CloneSet 是 OpenKruise 中提供的核心 workload 之一,它主要面向无状态应用,提供了更加高效、确定可控的应用管理和部署能力,支持优雅原地升级、指定删除、发布顺序可配置、并行/灰度发布等丰富的策略,可以满足更多样化的应用场景。CloneSet 与原生 Kubernetes workload 功能对比如图:

OpenKruise 项目:https://openkruise.io/
SAE 决定采用 CloneSet 作为新的应用负载,一方面借助其原地升级的能力提升应用整体部署效率,另一方面也结合 OpenKruise 开源的力量,共同打造通用标准的无状态应用负载的大规模使用实践。针对于增量应用, SAE 会默认采用 CloneSet 进行用户应用的部署,并结合最大不可用实例数和优雅升级时长来保证发布的流量无损,而对于存量应用, SAE 将采用基于有限状态机的滚动升级进行在线迁移操作。
方案上线后效果显著,在一个月的时间内,已经有近千个应用使用 CloneSet 进行部署,且原地升级次数为重建升级的两倍,部署效率比原生 K8s 提升 42% ,结合镜像缓存,用户部署应用到容器启动在秒级内完成。SAE 后续会对更多 OpenKruise 的高级能力产品化,同时结合用户场景,不断打磨稳定性与最佳实践回馈于开源。
云原生 K8s 部署应用重建升级策略 VS SAE 部署应用原生升级策略:

未来展望
在追求部署效率的道路中,SAE 正在探索更多维度,更细粒度的解决方案。相信在不久的将来,SAE 的极致弹性,无论在弹性效率,弹性规模,还是智能精准等方面都会大放异彩。
Serverless 技术公开课
Serverless 具体产品形态如何?如何在生产中使用?在落地过程中有哪些深坑?10 位阿里巴巴 Serverless 领域技术专家共同打造最适合开发者入门的 Serverless 公开课,3 个阶段 ,10 个课时,让你轻松上手,即学即用。
点击即可观看免费课程:https://developer.aliyun.com/learning/roadmap/serverless
Serverless X OpenKruise 部署效率优化之道的更多相关文章
- 从零入门 Serverless | SAE 的极致应用部署效率
作者 | 文俊 阿里巴巴云原生团队 本文整理自<Serverless 技术公开课>,"Serverless"公众号后台回复"入门",即可获取系列文章 ...
- QRowTable表格控件(三)-效率优化之-合理使用QStandardItem
目录 一.开心一刻 二.概述 三.效果展示 四.QStandardItem 1.QStandardItem是什么鬼 2.性能分析 3.QStandardItem使用上的坑 五.相关文章 原文链接:QR ...
- Tomcat服务部署及优化
Tomcat 服务部署及优化 1.Tomcat简介 2.Tomcat 服务安装及部署 3.Tomcat虚拟主机配置 4.Tomcat 优化 1.Tomcat简介: 概述: Tomcat是Java语言开 ...
- 18.Tomcat部署及优化
Tomcat部署及优化 目录 Tomcat部署及优化 Tomcat简介 Tomcat核心组件 Web容器 什么是 servlet? 什么是 JSP? Container 结构分析 Tomcat 请求过 ...
- php程序效率优化的一些策略小结
php程序效率优化的一些策略小结 1.在可以用file_get_contents替代file.fopen.feof.fgets等系列方法的情况下,尽量用 file_get_contents,因为他 ...
- jquery选择器效率优化问题
jquery选择器效率优化问题 jquery选择器固然强大,但是使用不当回导致效率问题: 1.要养成将jQuery对象缓存进变量的习惯 //不好的写法 $('#btn').bind("c ...
- php性能效率优化
[size=5][color=Red]php性能效率优化[/color][/size] 最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很 ...
- Jenkins Kubernetes Slave 调度效率优化小记
Jenkins K8S Slave 调度效率优化 by yue994488@126.com 使用kubernetes为测试工具Gatling进行大规模压测,压测期间发现Jenkins调度压测实例较慢, ...
- 见招拆招-PostgreSQL中文全文索引效率优化
* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...
随机推荐
- Linkerd 2.10(Step by Step)—配置超时
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- 备忘录——C#获取微信小程序的云数据库中数据
目录 0. 背景说明 0.2 获取AccessToken 0.3 数据库查询 0.4 文件下载 2. 简单的封装 3. 简单测试 4. 参考文档 shanzm-2021年8月17日 17:14:24 ...
- MySQL-SQL基础
mysql> use test; Database changed mysql> create table emp(ename varchar(10),hirdate date,sal d ...
- introduction-to-64-bit-assembly
introduction-to-64-bit-assembly NASM - The Netwide Assembler x86-64 下函数调用及栈帧原理 汇编语言基本概念简介 mycode
- 一文读懂Base64编码
Base64编码 字符对应表 上表就是用来表示Base64,一共64个字符,A-Z,a-z,0-9,+,-,还有=(作为补位) 无论将文件,字符串,还是什么转为Base64,一定是用上表的字符表示. ...
- 性能测试工具JMeter 基础(六)—— 测试元件: 线程组
线程组的定义: 线程组是测试计划执行的入口,所有的逻辑控制器和取样器都必须在线程组下,其他的元件根据位置的不同作用域是不同的. 线程组是每个线程都是独立运行测试脚本,一个线程组就等于一个用户,通过多个 ...
- 第04课:使用 VS 管理开源项目
本节课将介绍 Redis 项目在 Linux 系统中使用 gdb 去调试,这里的调试环境是 CentOS 7.0,但是通常情况下对于 C/C++ 项目我一般习惯使用 Visual Studio 去做项 ...
- C#中的文本到语音
本演示说明了如何使用c#.net Windows Forms应用程序中的system.speech库将文本转换为语音.Microsoft .NET框架提供System.Speech.Synthesis ...
- AOP快速入门
一.概念 AOP面向切面编程,是函数式编程的延申,是对OOP的补充: 代理模式:拦截增强作用,增强功能: 1.java继承,纵向共性抽取, 2.横向切面AOP织入增强代码方式 二.原理是通过代理机制, ...
- Scanner类、匿名对象、Random类、ArrayList集合、String类、static静态类、math类和Arrays工具类
一.Scanner类 1.除了八种基本数据类型,其他都是引用类型: 引用类型使用三步骤: 2.Scanner类 引用jdk提供的类,Scanner在java.util包下,不在java.lang包(S ...