简介: 随着 2013 年以 Docker 为代表的容器技术、CNCF 基金会以及 K8s 的发展等,云原生开始被广大开发者所熟知。云原生时代之前还有两个阶段:一是自建 IDC 机房,二是简单地把原有的应用搬迁到云上。自建 IDC 机房很难获得高可用、高可扩展以及运维提效等能力;而第二个阶段就是云计算时代,相比 IDC 有了一定的进步,但大部分还是在相对原始地用云,很难用好云,这个阶段的资源已经接近无限,但是基于虚拟机及各种自建服务的方式还有待改善。

一、天然云原生的 Serverless

1. 云原生时代

随着 2013 年以 Docker 为代表的容器技术、CNCF 基金会以及 K8s 的发展等,云原生开始被广大开发者所熟知。云原生时代之前还有两个阶段:一是自建 IDC 机房,二是简单地把原有的应用搬迁到云上。自建 IDC 机房很难获得高可用、高可扩展以及运维提效等能力;而第二个阶段就是云计算时代,相比 IDC 有了一定的进步,但大部分还是在相对原始地用云,很难用好云,这个阶段的资源已经接近无限,但是基于虚拟机及各种自建服务的方式还有待改善。

云原生时代指的是在设计应用的时候,就考虑到将来应用会运行在云的环境里,充分利用了云资源的优点,比如云服务的弹性、分布式的优势。如上图所示,云原生可以分为几部分:

一是云原生技术,包括容器、K8s、微服务、DevOps。而这些技术只是一个工具,要想真正地用好这些技术,还需要一些最佳的实践和组合,也就是云原生架构。

云原生架构是基于云原生技术的一种架构原则和设计模式的集合,是一些指导原则,比如要求做好可观测,只有在做好可观测的前提下才能做好后续的弹性,包括高可用相关的建设及基础设施的下沉,希望对非业务代码的部分进行最大化的剥离,在这样的技术和架构设计的指导下,就可以设计出云原生应用。

云原生应用具有轻量、敏捷、高度自动化等方面的特点,可以充分发挥云的优势,在现代数字化转型的时代,更好地适应业务的发展变化。

2. Serverless 天然云原生

为什么说 Serverless 是天然云原生的呢?虽然 Serverless 出现的时间比云原生更早一些,我们向前追溯,AWS 率先推出初代 Serverless 产品——Lambda,其按请求计费和极致伸缩的特点,非常符合云原生的定义,比如基础设施下沉。在 Lambda 里,不需要管理服务器,它会根据请求去伸缩服务器,实现了高度自动化;它还以函数的形式来组织代码,函数相对于应用来说要更轻量,交付速度也更快。但是这种模式的缺点就是改造成本高,因为很多应用原来是一个巨大的单体或者微服务应用,很难改造成函数模式。

3. 认识 SAE

Serverless 理念及相关产品的推出已经走过差不多 7 个年头,在这个过程中云原生的技术也在不断成熟,包括Docker、 K8s 等。阿里云在 2018 年的时候就开始思考另一种 Serverless 形态,即 Serverless application,也就是 SAE 这款产品,其于 18 年 9 月上线,19 年商业化,至今也走过了 3 个年头。

SAE 的特点:

  • 不可变基础设施、可观测、自动恢复

基于 K8s 底座,背后代表的是镜像之类的不可变基础设施以及可观测、自动恢复,如果检测到请求失败,会自动切流或重启实例。

  • 免运维、极致弹性、极致成本

托管服务器资源,不需要用户自己运维服务器,同时也相应地具备极致弹性和极致成本的能力。

  • 易上手、0 改造、一体化

如上图,最上层为客户感知层,是 aPaaS 产品形态,是一个应用 PaaS,经过三年多的实践,最终达到让用户真正易上手、0 改造的效果,而且做了很多一体化的集成。

SAE 这样一款以 K8s 为底座、具备 Serverless 的特点、以 aPaaS 为形态的产品,完全符合云原生的特点。在技术层面,底层使用容器、K8s,集成了微服务,包括各种 DevOps 工具。在架构层面,因为底层依赖于这些技术,所以可以非常方便地让用户遵照云原生架构的原则,去设计出自己的应用实践,最终让客户的应用可以最大化地享受到云原生的红利,实现应用的轻量、敏捷以及高度自动化,极大地降低迈入云原生时代的门槛。

SAE 产品架构图

SAE 是一款面向应用的 Serverless PaaS,0 改造 0 门槛 0 容器基础是它的特点,可以让用户非常方便地享受到 Serverless、 K8s 以及微服务带来的技术红利。同时也支持多种微服务框架、多种部署渠道(包括自己产品的 UI 部署 / 云效 / Jenkins / 插件部署等)、多种部署方式(包括 War / Jar / 镜像部署等)。

其底层是一个 IaaS 资源层,上面是 K8s 集群,对用户来说这些都是透明的,不需要自己购置服务器,也不需要理解 K8s,再上一层有两个核心能力:一是应用托管,二是微服务治理,应用托管就是应用生命周期等,微服务治理就是服务发现、优雅下线等,这些在 SAE 里都做了较好的集成。

SAE 的核心特点可以总结为三个:一个是 0 代码改造,二是 15s 弹性效率,三是 57% 的降本提效。

二、SAE 设计理念

1. Kubernetes 底座

  • 容器

在 K8s 容器编排生态中,最基础的是容器或镜像,依托于镜像,用户就相当于实现了不可变的基础设施,其好处是镜像可以到处分发、复制,相当于实现了可移植性,没有了厂商绑定。另外针对不太熟悉镜像或者不想感受复杂性的用户,我们也提供了 War / Jar 层面的部署,极大降低用户享受红利的门槛。

  • 面向终态

在传统的运维领域有很多问题比较难解决,比如服务器因为各种各样的原因,突然负载高或者 CPU 高等,这时在传统领域通常需要大量的手动运维操作,而在 K8s 领域结合可观测、健康检查,只需配置好 liveness 和 readiness,就可以实现自动化的运维,K8s 会自动进行切流以及自动化地重新调度,极大地降低了运维成本。

  • 资源托管

不仅 ECS 机是托管的,K8s 也是内部托管运维的,客户完全不需要购买服务器或者购买 K8s 或者运维 K8s,甚至都不需要懂 K8s,极大地降低了客户的入门门槛和薪资负担。

2. Serverless 特性

  • 极致弹性

我们已经实现了端到端的 15 秒,也就是 15 秒内可以创建出一个 pod,让用户的应用开始启动。在弹性能力上,我们具有基础指标弹性(如 CPU、Memory 等)、业务指标条件弹性(如 QPS、RT 等)和定时弹性。如果手动设置弹性指标,仍有一些门槛和负担,因为客户不知道指标应该设成多少,在这个背景下,我们也在考虑智能弹性,自动帮用户算出弹性指标推荐给用户,进一步降低门槛。

  • 精益成本

SAE 免去了资源托管和运维成本,在此之前客户需要运维大量的 ECS 服务器,当需要安全升级、漏洞修复,特别是高密部署时,成本会很高。另外 SAE 计费模式是以分钟计费,用户完全可以实现精益成本,比如在业务高峰的 1 小时扩容到 10 个实例,在高峰结束后变成 2 个实例。

  • 语言增强

在弹性领域,我们针对性地做了一些语言增强。比如 Java,结合阿里的大规模 Java 应用实践,阿里的 JDK——Dragonwell11 相比于其它开源的 JDK,可以让 Java 应用的启动速度提高 40%。未来我们还会在其它语言上探索更多的可能性。

3. (application)PaaS 产品形态

  • 应用托管

应用托管,相当于应用生命周期的管理,包括应用发布、重启、扩容、灰度发布等,其使用的心智和大家在使用应用或其他 PaaS 平台是一样的,上手门槛非常低。

  • 一体化集成

因为云产品有几百多款,如果要每一款都用好也是额外成本。所以我们对最常用的云服务进行了一体化集成,包括基础监控、业务监控 ARMS、NAS 存储、SLS 的日志收集等各方面,降低用户使用产品的门槛。

另外我们还额外地做了微服务增强,包括托管注册中心、优雅上下线和微服务治理等。因为使用微服务通常需要一个注册中心,SAE 内置托管注册中心,用户不需要再重新购置,完全可以把应用直接注册上来,进一步降低用户门槛和成本。

SAE 将这些能力组合起来,最终让用户在迁移传统单体应用或者微服务应用时,基本可以实现 0 改造迁移,0 门槛地享受到这款产品背后带来的技术红利。

三、SAE 技术架构

1. SAE 技术架构图

SAE 帮用户托管 K8s 背后的技术架构如上图所示,在 1 个宿主机上,最上层是 SAE 的 PaaS 界面,第二层是 K8s 的 Master(包括 API server 等),最下面一层是 K8s 真正运行资源的宿主机,这些都是完全由 SAE 托管的,用户只需要在自己的 VPC 或网络段内创建 Pod 资源并做一个连通,即可实现应用的正常运行。

这里有两个核心问题:

一是防穿透,比如我们的 Pod 或容器使用的是像 Docker 这样的传统容器技术,把公有云的 a 和 b 两个用户跑到一个物理机上,其实有非常高的安全风险,b 用户很有可能会侵入到 a 用户的容器里获取用户信息,所以这里面的核心就是要限制用户能力,防止其逃逸。

二是网络的连通或者云体系的打通,我们要跟用户的网络体系打通,这样用户才可以方便地和他的安全组、安全的规则、RDS 等连通,这也是一个核心的问题。

2. 安全容器

在这里具体展开一下防逃逸问题。上图表格是现在大家讨论的比较广泛的安全容器技术,安全容器简单理解就是虚拟机思想。如果使用传统的像 Docker 这样的容器化技术,很难做好安全的防护或隔离,而安全容器可以理解为一个轻量级的虚拟机,既有容器的启动速度,又有虚拟机的安全。

目前安全容器已经超脱出了安全,不仅仅有安全的隔离,也有性能的隔离以及故障的隔离,以故障隔离为例,如果采用 Docker 这种容器技术,遇到一些内核问题,就有可能因为一个 Docker 容器的失败而影响到其他用户,整个宿主机都可能会受到影响,而如果采用安全容器技术就不会有这样的问题。

SAE 采用了 Kata 安全容器技术,从时间和开源界的事实来说,Kata 是 runV 和 Clear Container 两个项目的结合,相比于 Firecracker 以及 gVisor 方案更加成熟。

四、SAE 最佳实践

最佳实践 1:低门槛微服务架构转型

熟悉微服务的客户都知道,如果要自己运维一套微服务技术架构,需要考虑很多因素,不仅是开源、框架层面,还有资源层面及后续的问题排查,包括注册中心、链路追踪、监控、服务治理等等,如上图左侧所示,在传统开发模式下,这些能力都需要用户自己托管和运维。

而在 SAE 中,用户就可以把一些与业务无关的特性交给 SAE,用户只需要关注自己的业务,包括微服务的用户中心、群组中心等,以及和 SAE 的 CI/CD 工具做一个集成,就可以快速实现微服务架构。

最佳实践 2:一键启停开发测试环境降本增效

有些中大型企业会有多套的测试环境,这些测试环境一般晚上都不使用,在 ECS 模式下,是需要长期保有这些应用实例的,闲置浪费的成本比较高。

而如果在 SAE 里就可以结合命名空间,比如一键启停或定时启停的能力,可以将测试环境的应用全部建在测试环境的命名空间下,再配置早上如 8:00 启动测试环境命名空间所有实例,在晚上 8:00 全部停止,停止后的时间段就完全不计费,可以让用户最大化地降低成本。

根据计算,在比较极致的情况下,基本上可以节省用户 2/3 的硬件成本,而且也不需要额外付出其他运维成本,只需配置好定时启停的规则即可。

最佳实践 3:精准容量+极致弹性的解决方案

在今年疫情情况下,大量学生在家进行在线教育,很多在线教育行业的客户面临业务流量暴涨七八倍的情况,如果基于原来自己运维的 ECS 架构,用户就需要在非常短的时间内做架构升级,不仅是运维架构升级,还有应用架构升级,这对用户的成本及精力都是非常大的挑战。

而如果依托于 SAE 中各种各样的一体化集成以及底层 K8s 这样高度自动化的平台,就可以简单很多。比如可以结合 PTS 压缩工具评估容量水位;比如压测有问题,可以结合基础监控和应用监控,包括调用链、诊断报告等,可以分析瓶颈在哪里,有没有可能尽短的时间内解决;如果发现是比较难解决的瓶颈,可以使用应用高可用服务,实现限流降级,确保业务不会因为突发洪峰而垮掉。

最后 SAE 可以根据压测模型配置相应的弹性策略,比如根据 CPU memory、RT 或者 QPS 等,在有容量模型的情况下设置行业策略,达到非常贴合实际使用量的效果,实现低成本及架构的最大化升级。

五、总结

数字化转型已经渗透到各行各业,不管是因为时间发展原因还是疫情原因,在数字化转型里,企业要有应用好云的能力,来应对业务上的快速变化及高洪峰高流量场景下的挑战,这一过程包含几个阶段:Rehost(新托管)、Re-platform(新平台)、Refactor(新架构),随着架构改造的深入,企业能够获得的云的价值越高,同时迁移改造成本也会随之上涨,如果只是把应用简单托管到云上,很难获得云的弹性能力,遇到问题时还是很难及时处理。

通过 SAE,我们希望能够让用户 0 改造、0 门槛、0 容器基础即可享受到 Serverless + K8s + 微服务的价值红利,最终帮助用户更好面对业务上的挑战。

作者: 陈涛(毕衫)

原文链接

本文为阿里云原创内容,未经允许不得转载

如何 0 改造,让单体/微服务应用成为 Serverless Application的更多相关文章

  1. 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南

    [SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...

  2. 【版本号公布】Jeecg-P3 1.0 公布,J2EE微服务框架(插件开发)

    JEECG-P3 1.0 公布了! JEECG-P3 1.0是一个J2EE微服务框架(插件开发). 特点:业务组件以JAR方式提供,插件模式.松耦合.可插拔.支持独立部署,也能够无缝集成Jeecg平台 ...

  3. 「 从0到1学习微服务SpringCloud 」10 服务网关Zuul

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...

  4. 「 从0到1学习微服务SpringCloud 」09 补充篇-maven父子模块项目

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...

  5. 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  6. 「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  7. 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  8. 「 从0到1学习微服务SpringCloud 」05服务消费者Fegin

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  9. 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  10. 「 从0到1学习微服务SpringCloud 」03 Eureka的自我保护机制

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 Eureka的高可用需要 ...

随机推荐

  1. java list转set用法

    参考:https://blog.csdn.net/kye055947/article/details/80561633 之前一直被这两list转set,set转list所烦恼,今天整理了下两者之间怎么 ...

  2. [置顶] apache+tomcat集群出现的两次请求问题解决方案

    自从做了架构师,经常需要解决奇葩问题......... 现象:点击一次按钮,相应servlet收到两次请求,servlet执行了两次,导致数据错乱. 解决方案: 之所以出现两次请求,并不是浏览器问题, ...

  3. Java加密技术(四)——非对称加密算法RSA

    Java非对称加密算法rsa     接下来我们介绍典型的非对称加密算法--RSA RSA     这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很 ...

  4. FPGA中的面积优化

    FPGA中的面积优化 一.优化的意义 面积优化,就是在实现预定功能的情况下,使用更小的面积.通过优化,可以使设计能够运行在资源较少的平台上,节约成本,也可以为其他设计提供面积资源. 二.操作符平衡 对 ...

  5. archlinux xfce 出现[FAILED] Failed to mount /boot, systemctl status boot.mount出现 mount: /boot: unknown filesystem type 'vfat' 滚挂了

    开机显示:[FAILED] Failed to mount /boot 使用命令systemctl status boot.mount后出现 mount: /boot: unknown filesys ...

  6. 实现一个简单的echarts柱状图PythonFlask

    bar.html 1 <!DOCTYPE html> 2 <html style="height: 100%"> 3 <head> 4 < ...

  7. 汇编语言-int指令

    int 指令 int 指令的格式为:int n,n为中断类型码,它的功能是引发终端过程. CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下. 取中断类型码n: 标志寄存器入栈, ...

  8. S锁,X锁,乐观锁和悲观锁

    S锁:S锁也叫共享锁,读锁,数据只能被读取不能被修改. X锁:X锁也叫排他锁,写锁,一个事务对表加锁后,其他事务就不能对其进行加锁与增删查改操作. 乐观锁:总是假设是最好的情况,每次去操作的时候都不会 ...

  9. #树上带修莫队,树链剖分#洛谷 4074 [WC2013]糖果公园

    题目 分析 考虑将树转换成序列求解,那就用欧拉序,入栈一次出栈一次正好抵消掉 注意当起点不是LCA的时候要将起点加入,剩下就是带修莫队板子题了 代码 #include <cstdio> # ...

  10. 内存分析利器之UMDH

    近两周投入分析产品的内存泄漏问题. 测试团队反馈产品在安卓平台运行时,随用户操作,应用占用的内存出现上涨的趋势,停止操作并等待一段时间之后,应用占用的内存没有下降,怀疑存在内存泄漏问题. 结合复现的情 ...