阿里云在应用扩缩容下遇到的挑战与选型思考

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
函数计算FC,每月15万CU 3个月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 在云原生技术栈逐渐普及之后,如何能够以效率更高、用户更容易接纳的方式落地 Kubernetes 技术体系,让云原生的发挥出真正的价值,正在迅速成为大家津津乐道的一个话题和全新的挑战。而伴随着大家对云原技术的关注点从“怎么用”逐渐上升到“怎么用的更好’上来,CNCF 应用交付领域小组(CNCF SIG App Delivery)联合阿里巴巴云原生应用平台团队推出了《从 0 到 1:打造现代云原生应用管理平台》系列文章,旨在帮助读者更好的落地和实践云原生核心技术,打造出属于自己的、“以应用为中心”的 Kubernetes 平台。

来源 | 阿里巴巴云原生公众号


头图.png

作者 |炎寻  阿里云 EDAS 核心开发工程师Andy Shi  阿里云技术布道师

导读:在云原生技术栈逐渐普及之后,如何能够以效率更高、用户更容易接纳的方式落地 Kubernetes 技术体系,让云原生的发挥出真正的价值,正在迅速成为大家津津乐道的一个话题和全新的挑战。而伴随着大家对云原技术的关注点从“怎么用”逐渐上升到“怎么用的更好’上来,CNCF 应用交付领域小组(CNCF SIG App Delivery)联合阿里巴巴云原生应用平台团队推出了《从 0 到 1:打造现代云原生应用管理平台》系列文章,旨在帮助读者更好的落地和实践云原生核心技术,打造出属于自己的、“以应用为中心”的 Kubernetes 平台。

背景与场景

阿里云企业级分布式应用服务 EDAS(Enterprise Distributed Application Service)是一个应用全生命周期管理和监控的一站式 PaaS 平台,同时也是 Open Application Model (OAM) 模型在公有云上的第一个互联网级商用平台层实现。今天,EDAS 的应用管理层内核已经完全基于 KubeVela 开源项目构建于原生的 Kubernetes 集群之上,以高效、稳定、智能、可扩展的方式服务了成千上万名云上应用开发者。在本文中,我们会以 EDAS 的底层技术实现作为具体案例,介绍阿里云在生产环境中设计与落地智能化的应用扩缩容策略中踩到的“坑”、解决方案以及构建以云原生应用平台过程中的最佳实践。

阿里云进行应用扩缩容遇到的挑战与选型思考

作为阿里云面向应用管理与交付领域的核心产品,EDAS 较早就已经完成了从自研虚拟机架构到 Kubernetes 容器集群的架构整体迁移。当然,同大多数基于 Kubernetes 的 PaaS 类似,在这个阶段,EDAS 在应用自动弹性伸缩功能上,是完全基于 Kubernetes 原生 HPA(Horizontal Pod Autoscaler)提供的 CPU 和 Memory 两个基础指标的。但是,随着用户量的增加和需求的日渐多样化,原生基于 HPA 的应用扩缩容策略逐渐暴露出了很多不足之处:

  • 第一,对基于细粒度的应用级负载指标(比如:RT 或者 QPS)进行自动扩缩支持不佳。

作为一个“ The Platform for Platform”项目,Kubernetes 提供的内置能力主要是围绕着容器级别的管理和编排来展开的,但是对于以应用和用户为核心关注点的产品来说,像 CPU 和 Memory 这样粒度的扩缩容指标就显得太粗粒度了。但是一个“尴尬”的局面是,尽管 HPA 提供了一定程度的自定义指标功能,但它的可扩展性整体上还是不够灵活,自定义指标的可插拔性也不是很好,尤其是当我们希望把指标细化到应用甚至源码层面的时候,经常会碰到需要修改 HPA 代码的情况(而 HPA 代码又是 Kubernetes 代码的一部分)。这就迫切的需要我们在思考如何通过一个扩展性更强的、外部框架来进行细粒度的应用扩缩容策略。

  • 第二,无法支持对应用 Scale To Zero的需求。

我们知道,在 Serverless/FaaS 场景中 Scale To Zero 是一个比较典型的自动伸缩场景,可以有效的帮助用户节省闲置资源、降低平台的使用成本。实际上, 现代微服务应用中,很多用户托管在云上的微服务,也都具备 Serverless 应用的一些特征,比如无状态、主要根据流量进行响应等等,对于它们来说,Scale To Zero 也是一个非常重要的诉求。但是,Kubernetes 内置的 HPA 并不关注这个场景,是不会提供出这个能力的。而 EDAS 作为一个全功能通用 PaaS 产品,对 Scale To Zero 的诉求是独立的、无平台锁定的原子性能力,不可能通过引入 OpenFaaS 或者 Knative 这样的 Serverless 专属方案来解决所有用户场景下的问题。

  • 第三,无法支持定时扩缩容的需求。

除了 Scale To Zero 之外,定时扩缩容也是 EDAS 的企业级用户非常迫切需要的一个能力。同样的,对于这个应用运维能力的诉求,也必须是独立的原子性能力,而不能为了一个需求引入一整套其它的平台级方案进来。

基于上述问题,阿里云团队开始规划 EDAS 产品自动弹性伸缩能力的新版本。而与此同时,EDAS 产品底层架构自 2020 年初也开始了基于 Open Application Model (OAM)的一系列演进升级,旨在通过引入一个标准化、可插拔的应用定义模型替代 EDAS 原有的 Application  CRD,从而既为使用者提供一个以“应用为中心”的上层抽象而不是强制用户学习 Kubernetes 中的底层概念,又利用模型的可扩展性确保 EDAS 能够将云原生生态中的各种能力一键“插入”到产品当中。所以,这个新版自动弹性伸缩组件的设计与实现,也自然而然的同 EDAS 的 OAM 化架构结合在了一起。

在这个新的架构中,一个应用的“自动弹性伸缩”策略,是作为这个应用的“特征”(Trait)存在的。当然,这里提到的“应用”这个概念,是 EDAS 在 Kubernetes 之上借助 OAM 为用户暴露出来的一个上层抽象,并且完全通过用户侧的原语进行描述。所以,这里的问题就出现了,在 Kubernetes 具体的实现层,这种用户定义的、面向应用的弹性伸缩策略,又该如何实现或者选型呢?

1.png

结合前面提到的三个具体的挑战,以及新版 EDAS 基于 OAM 的 Kubernetes 原生化设计,阿里云团队决定直接从开源社区中来引入一个水平扩缩容组件来解决上述问题,并且针对 EDAS 的场景提炼出了三点主要的选型诉求:

  1. 这个水平扩缩容组件提供的应该是简单稳定的原子化能力,而不能跟某个具体的场景化方案(比如 Serverless)绑定。这同时也是 OAM 模型对“应用特征”的基本规范和要求;
  2. 这个水平扩缩容组件的扩容指标应该是插件式的,这样阿里云团队才能够方便得扩展出基于定时、消息队列堆积消息数、应用监控指标甚至 AI 预测结果的“以应用为中心”的弹性策略;
  3. 原生支持 Scale To Zero,并且满足第一条的要求。

而经过在社区中的评估和选型,最后阿里云团队选择了微软开源 KEDA 项目,它目前已经移交给 CNCF 托管。KEDA 项目可以原生支持 Scale To Zero,更重要的是,它针对应用级水平扩缩容,解耦了被伸缩对象和伸缩指标,并分别提出了对应的抽象接口( Scaler + Metrics Adapter 机制),从而即提供了强大的插件机制,又能够为所有扩缩策略提供一层统一的定义方式。此外,KEDA 的设计和架构比较简,没有很复杂的黑科技存在,内置的很多 Scaler 可以直接使用,非常符合 EDAS 产品的整体诉求。

EDAS 基于 OAM 和 KEDA 的云原生 PaaS 架构

在技术架构上,阿里云 EDAS 产品内核是基于 OAM 社区的 KubeVela 开源项目构建的。正是借助了 OAM 提供的 Kubernetes 原生的扩展机制,在上线像 KEDA 这样来自云原生开源社区的能力时,EDAS 产品研发团队并不需要像传统 PaaS 团队那样进行大量的二次开发甚至修改用户侧 API,而只需要将 KEDA 的 CRD 按照 OAM 规范“注册”成为 EDAS 的一个 Autoscale Trait,完成监控数据对接,用户即可使用到这个新增的水平扩容能力。整体架构可以用如下所示的示意图表示清楚:

2.png

在具体实现中,EDAS 主要借助阿里云的 ARMS 服务提供的细粒度的应用级监控数据,来驱动 KEDA 对工作负载进行快速的水平扩容。而除了在 KEDA 中增加了 ARMS Scaler 外,EDAS 对 KEDA v1 Release 中存在的问题也进行了很多修复或者增强,包括:

  • 多个同类型的 Trigger 的指标值会被相加而不是独立计算导致容量值计算有误;
  • KEDA 在创建 HPA 时,名字如果超长则会被简单地 Trim 到 63 字符,没有检查是否符合 DNS 规则,导致有时报错;
  • Trigger 不能被禁用,这在生产环境下会有稳定性风险;

上述修复,EDAS 团队已经提交或者正在提交至 KEDA 上游中,其中有一部分已经在 KEDA v2 Release 中得到了修复。

此外,Kubernetes 中还有一个困扰了大家很久的问题就是自动扩容和灰度发布在很多时候会发生冲突。针对这个问题, EDAS 借助 OAM 的模型层语义对这两个能力进行了互斥处理。

当前工作与未来计划

在目前工作的基础上,EDAS 正在与开源社区合作,为基于 KEDA 的 Autoscaler Trait 增加很多新的能力,这包括:

  • Trigger 支持禁用功能;
  • 提供 Decider 抽象,能够以扩展的方式,在扩容的过程中加入更多的决策逻辑;
  • 支持 Dry Run 功能;
  • 支持容量变更的灰度,回滚,观测功能;
  • 支持 Webhook 通知;

而在未来,EDAS 的主要工作重点会专注于如何在当前的架构上同 EDAS 的 AIOps 能力结合,从而为整个平台引入更加智能的弹性体验,这包括:

1. 更智能的决策机制

  • 结合上下游应用状态综合决策
  • 结合自适应限流综合决策
  • 结合专家系统,根据封网期,大促态的规则综合决策
  • 结合历史数据分析综合决策
  • 提供容量诊断并自动推荐扩缩策略

2. 更可控的扩缩容过程

  • 提供 webhook 在扩缩变更时发送通知
  • 提供交互在人工确认后才进行扩缩变更操作
  • 提供扩缩变更过程的灰度,回滚,观测功能
  • 提供 Dry Run 功能

3. 更丰富的触发器体系

  • 应用 QoS 触发器
  • 数据库指标触发器
  • 消息队列指标触发

在接下来的发布中,这些基于 KEDA 的创新与增强,很快就能够为 EDAS 的用户带来更加强大、智能、稳定的应用自动弹性能力与更加友好的使用体验。

总结

本文主要以 EDAS 的智能弹性伸缩能力为切入点,介绍了阿里云企业级应用平台在经典 PaaS 场景下依托 OAM 和 KubeVela 项目为底座,支持 KEDA 水平扩缩容组件的过程中遇到的挑战和解决办法。后续,这套基于 KEDA 的应用特征会集成更广泛的扩缩容指标和更智能的决策机制。

而在同云原生生态共同演进的同时,阿里云 EDAS 服务在云原生应用管理领域的大规模实践,也为 OAM 社区带来了应用版本化、依赖管理、运维特征交互与批量下发机制等大量生产级增强,以及丰富的最佳实践和经验教训。也正是得益于标准与开放的产品架构,阿里云 EDAS 服务才能够迅速的同 KEDA 等云原生社区“新势力”打成一片,以标准化、可扩展的方式,快速的为用户上线强大的、源自开源社区的各种应用管理能力,真正做到了“以用户为中心”来做技术创新与演进,正式迈向云原生应用 PaaS 的下一个时代。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
存储 弹性计算 SDN
企业级 ECS 集群的构建需要综合考虑多个因素,通过不断的比较和对比不同的方案,选择最适合企业自身需求和发展的架构。
【9月更文挑战第5天】在数字化商业环境中,构建企业级ECS(弹性计算服务)集群对提升业务稳定性、扩展性和性能至关重要。本文将比较传统物理服务器与ECS架构,分析云服务商选择(如AWS和阿里云)、实例配置(CPU/内存)、网络架构(SDN vs 传统)及存储方案(本地存储 vs 云存储),帮助企业根据自身需求选出最优方案,实现高效稳定的ECS集群部署。
75 18
|
4月前
|
关系型数据库 Serverless 分布式数据库
揭秘PolarDB Serverless:大促洪峰秒级应对,无感伸缩见证科技魔法!一探云数据库管理的颠覆性革新,强一致性的守护神来了!
【8月更文挑战第13天】在云计算背景下,阿里巴巴的云原生数据库PolarDB Serverless针对弹性伸缩与高性能一致性提供了出色解决方案。本文通过一个电商平台大促活动的真实案例全面测评PolarDB Serverless的表现。面对激增流量,PolarDB Serverless能秒级自动扩展资源,如通过调用`pd_add_reader`快速增加读节点分摊压力;其无感伸缩确保服务平滑运行,不因扩展中断;强一致性模型则保障了数据准确性,即便在高并发写操作下也确保库存等数据的同步一致性。PolarDB Serverless简化了数据库管理,提升了系统效能,是追求高效云数据库管理企业的理想选择。
102 7
|
7月前
|
消息中间件 程序员 Kafka
为什么公共云的弹性能力很难被发挥出来?
本文探讨了云计算的弹性能力与实际应用的差距,指出云厂商的包年包月策略与弹性需求相冲突。作者建议改进Spot实例回收机制和资源创建API的SLA,以促进更广泛的弹性使用。同时,文章强调程序员在资源回收上的挑战,类比于编程语言中内存管理的问题,提出需要更好的资源回收解决方案。此外,基础软件和应用层尚未充分准备好支持弹性,尤其是有状态应用。企业应利用Cloud Run等托管服务实现计算资源弹性,并选择支持弹性的基础软件。文章还介绍了AutoMQ如何利用弹性能力降低成本,并预告了一场相关 Meetup 活动。
55 0
为什么公共云的弹性能力很难被发挥出来?
|
7月前
|
存储 Prometheus 监控
成本更低、更可控,云原生可观测新计费模式正式上线
成本更低、更可控,云原生可观测新计费模式正式上线
311 11
|
7月前
|
缓存 测试技术 调度
双十一弹性能力支撑--ECI稳定性建设
本文我们将为大家介绍,ECI这些年在稳定性方面做了哪些工作,以及是如何来为集团双十一保驾护航的。
130681 49
|
7月前
|
弹性计算 运维 关系型数据库
如何利用弹性伸缩降低成本
利用弹性伸缩降低成本
62 3
|
7月前
|
弹性计算 运维 Cloud Native
阿里云云原生弹性方案,用弹性解决集群资源利用率难题
本文主要介绍了通过弹性,实现成本优化,解决集群资源利用率难题。
92780 8
|
7月前
|
弹性计算 Kubernetes 测试技术
一文掌握弹性与成本的完美平衡 选择正确上云“姿势”,正确实例选型,平滑应对流量高峰
2023云栖大会,阿里云弹性计算弹性计算产品专家王曦、阿里云弹性计算高级技术专家王渊平、阿里云弹性计算高级技术专家田政雄3位嘉宾出席分享,云上付费方式、各规格实例比较应用、ECS如何保障客户满足流量峰值弹性需求等话题。
|
运维 双11
带你读《CloudOps云上自动化运维 白皮书2.0》之15:3. 如何衡量弹性能力成熟度?
带你读《CloudOps云上自动化运维 白皮书2.0》之15:3. 如何衡量弹性能力成熟度?
177 0
|
运维
带你读《CloudOps云上自动化运维 白皮书2.0》之14:2. 弹性能力的业务价值
带你读《CloudOps云上自动化运维 白皮书2.0》之14:2. 弹性能力的业务价值
151 0