微服务应用视角解读如何选择K8S的弹性策略

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 微服务架构的出现,拆分了庞大的单体应用,让业务之间的开发与协作变得更加灵活。当面临业务流量增加的场景时,往往需要对一些应用组件进行扩容。K8S在应用层面提供了HPA,围绕HPA开源社区延伸出了KEDA这样的弹性组件,为微服务应用以业务指标执行弹性策略提供了实现的可能性。但HPA正常工作的一个大前提是需要保证集群资源充足,为此用户必须提前对集群扩容或时常保持集群资源冗余。本文中就会详细的为你解读一下。

前言


微服务架构的出现,拆分了庞大的单体应用,让业务之间的开发与协作变得更加灵活。当面临业务流量增加的场景时,往往需要对一些应用组件进行扩容。K8S在应用层面提供了HPA,围绕HPA开源社区延伸出了KEDA这样的弹性组件,为微服务应用以业务指标执行弹性策略提供了实现的可能性。但HPA正常工作的一个大前提是需要保证集群资源充足,为此用户必须提前对集群扩容或时常保持集群资源冗余。


对于集群资源弹性这一命题,K8S社区给出了Cluster Autoscaler(CA)和Virtual Kubelet(VK)两种解决方案。本文围绕着微服务应用的形态与特点,剖析了CA与VK各自适用的场景,并总结了微服务架构下应用该如何选择集群资源弹性。


微服务应用形态与特点


在微服务应用架构,微服务架构将一个庞大的应用系统拆分成了一个个离散的应用组件,这些组件通过RPC串在一起,对外提供完整的服务。每个组件是离散的,大部分组件可以通过水平扩缩从而调整服务容量。非核心链路上的组件,是允许延迟扩容或者不扩容,甚至是缩容让出资源。


微服务架构下在弹性场景存在五大特征点:


  • 水平伸缩可以调整系统容量:在外部资源充足的情况下,微服务应用组件水平扩容可以提升业务系统的容量。
  • 应用间存在依赖关系:单个微服务应用并不能提供完整的服务,扩容单个微服务组件,对系统容量的提升非常有限,往往需要和依赖的服务一起扩容才能有效提升系统容量。
  • 应用本身是无状态的:若微服务应用本身有状态,对于水平扩容是不利的,例如对磁盘有强依赖,在扩容场景下需要注意调度亲和性以打散Pod,避免同类型应用在同一节点对磁盘IO抢占,同时缩容时还需要考虑对于状态数据的处理。因此需要尽量改造成无状态应用。
  • 启动速度快且服务上下线流量无损:服务上下线流量无损对于自动扩缩容场景至关重要,尤其是在大流量高并发场景下扩容,冷启动的新Pod很容易被大流量击溃,并且在健康探针的作用下,扩容出的新Pod不断被K8s重启,最终实现的是无效扩容。
  • 流量具有周期性:绝大多数微服务架构应用面向的是在线服务,因此可以用二八定律来描述它,即20%的时间处理了80%的流量。对于业务流量而言,最显著的特征是存在周期性的变化,且往往这个变化是快速的,所以微服务应用容量扩缩的响应速度对于业务系统的稳定起重要作用。


在微服务应用架构中配置应用弹性时,我们所需要考虑的是选择合适的指标来衡量系统容量。在配置集群资源弹性时,我们所需要考虑的是扩容出的计算资源是否能够满足应用所需。


K8S 集群资源弹性技术方案


如前言中所提及,K8S社区给出了两份“标准答案”的框架,具体的资源弹性实现还依赖云厂商的技术形态与产品能力。


虚拟节点:VK


Virtual Kubelet是根据Kubelet定义提出的一个“虚拟节点”的概念,允许云厂商将云服务包装成一个“虚拟节点”,加入到Kubernetes集群中。虚拟节点的背后往往是云厂商的大资源池,因此理论上我们可以认为虚拟节点的资源是无限的,当然实际情况还要以云厂商的规模和产品能力来做判断。

image.png


节点伸缩:CA


Cluster Autoscaler是K8S社区给出的集群节点伸缩方案。CA监听集群中所有Pod事件,当有Pod因为资源不足而无法调度时,CA会根据伸缩组信息进行模拟扩容并调度计算,最后按照预设的节点扩张策略进行真实节点扩容。同时CA监听集群整体资源利用率,当利用率低于预设的缩容阈值时,CA进行模拟缩容调度计算,排除各种影响因素后,CA对可缩容节点执行打污点、排水、删除这一系列操作。


image.png


各方案特点比对


以CA技术形态为主的真实节点伸缩与以VK技术形态为主的虚拟节点,这两种主流技术手段有着各自特点,其中最主要的区别如下:


image.png


简而言之,CA伸缩真实节点以提供完整K8S能力,但响应速度较慢;VK由云厂商资源池驱动,提供了秒级、无限资源的弹性能力,但不存在真实节点,从而失去了部分K8S特性。


云厂商解决方案


在VK和CA这两种主要资源弹性技术方向上,各个云厂商也纷纷推出了对应产品以提供相应的解决方案。


image.png


Serverless方向主要是Serverless Instance与Serverless Cluster。Serverless Instance产品有ECI、Fargate、ACI这类,以快速、无限资源为显著特点。Serverless Cluster产品有阿里云的ASK、谷歌的GKE Autopilot,由云厂商维护所有集群资源,对用户而言开箱即用免运维。


节点伸缩方向AWS还推出了开源组件Karpenter,它绕过了CA中伸缩组的概念,从而让扩缩容时对于资源的选择更加灵活。


资源弹性策略选择与考量因素


对于资源弹性问题,我们首要考虑的是能力。即新的计算资源是否能够满足业务使用需求。以VK技术形态为主的弹性方案,受限于架构设计、安全、性能等因素,天然地缺失了节点特性、容器特权等能力。对于有这部分诉求的业务应用应尽可能地进行改造,以移除相关依赖。


其次我们考虑的是成本效率。对于企业应用而言,成本预算是不可避免的话题,定价规则以及计费模式不同,最终带来的资源成本不同,势必会影响我们对于某项技术的偏好。在当前的Serverless场景下,计算资源大体上采用的还是按量计费模式,对于一些长时运行的应用上,采用预付费模式的计算资源是否能达到更节省成本,还需要我们进一步去调研与尝试。成本这一层面不仅包含资源成本,还包含运维成本、团队技术学习成本以及依赖具体云厂商所隐含的迁移成本等等,这些成本在当下可能对企业的收益影响有限,但从企业长远发展角度来看,这一部分不可忽视。同时对于技术团队而言,选择相应技术方案在节约运维成本和降低团队学习成本的同时,需要理性看待这部分成本节省与团队成长所带来的收益之间的关系。


效率是影响业务收益成本的重要因素之一,从流量来袭,到HPA根据指标做出响应,再到资源弹性做出动作,最后到应用启动服务上线。这之中每一个环节都存在时间成本,通常情况下这个时间成本越小越好,但也存在一些业务对于时间成本不敏感。对于扩容的每个环节,都延伸出了相应的技术解决方案。如HPA被动式响应,阿里云推出了AHPA带指标预测的提前扩容能力。如JAVA应用启动慢,GraalVM、Alibaba Dragonwell都在冷启动上做出了一些努力。对于明确业务周期的应用,设置好定时弹性提前扩容,这些问题自然引刃而解。


最后还有一些场景问题需要考虑,对当前应用架构进行升级、迁移、重建时,我们需要把高弹性因素纳入考虑范围,进行合适的技术选型。


综上所述,我们总结了一张资源弹性选择策略图,列举了通用场景下对集群弹性选型时需要考虑的因素点。

image.png


总结


在微服务架构中,我们需要从业务视角梳理与划分应用组件。对于核心链路组件,要尽可能的保证这些组件的健壮性,并调整成一个高可用、高弹性的架构,从而让核心业务长久运行。对于外围链路组件,需要权衡成本与高可用、高弹性带来的效益。

在K8S资源弹性问题上,现有技术手段中,我们需要考量兼容性、效率与成本,从而选择合适于自身业务的集群弹性策略。


阿里云的微服务应用托管平台 EDAS 在资源弹性场景下,不仅针对性的对于独享资源型业务虚拟机 ECS 集群,池化资源型业务 K8S 集群,以及全托管免运维的阿里云 Serverless 集群均做了很好的支持;同时基于结合阿里云容器服务和 ECI ,同时提供了针对池化资源 + Serverless Instance 的形态场景支撑,让我们微服务的业务在可以充分利用云技术所带来的技术红利。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8天前
|
Kubernetes 监控 Cloud Native
云原生入门:从传统应用到容器化部署的旅程
【9月更文挑战第19天】在数字化浪潮中,企业正迅速将目光投向云原生技术,以实现更快的应用开发和更灵活的资源管理。本文将通过一个简单示例引导读者理解如何将传统应用转变为云原生应用,并部署至云端。我们将探索容器化技术的基础,以及它如何帮助企业解锁现代软件交付的速度和效率。准备好让你的应用乘上云原生的快车了吗?让我们开始这段令人兴奋的旅程吧!
|
10天前
|
Kubernetes Cloud Native Linux
云原生入门:Kubernetes的简易部署与应用
【8月更文挑战第49天】在云原生的世界里,Kubernetes(K8s)是一颗璀璨的星。本文将带你走进K8s的世界,从安装到简单应用,轻松驾驭这个强大的容器编排工具。让我们一起探索云原生的奥秘,解锁新技能!
|
15天前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
21 5
|
15天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
24 3
|
20天前
|
Cloud Native 持续交付 云计算
云原生之旅:从传统应用到容器化微服务
随着数字化转型的浪潮不断推进,企业对IT系统的要求日益提高。本文将引导你了解如何将传统应用转变为云原生架构,重点介绍容器化和微服务的概念、优势以及实施步骤,旨在帮助读者掌握将应用迁移到云平台的关键技巧,确保在云计算时代保持竞争力。
19 5
|
9天前
|
Kubernetes Cloud Native Java
探索未来编程新纪元:Quarkus带你秒建高性能Kubernetes原生Java应用,云原生时代的技术狂欢!
Quarkus 是专为 Kubernetes 设计的全栈云原生 Java 框架,凭借其轻量级、快速启动及高效执行特性,在 Java 社区脱颖而出。通过编译时优化与原生镜像支持,Quarkus 提升了应用性能,同时保持了 Java 的熟悉度与灵活性。本文将指导你从创建项目、编写 REST 控制器到构建与部署 Kubernetes 原生镜像的全过程,让你快速上手 Quarkus,体验高效开发与部署的乐趣。
13 0
|
11天前
|
缓存 负载均衡 数据管理
深入探索微服务架构的核心要素与实践策略在当今软件开发领域,微服务架构以其独特的优势和灵活性,已成为众多企业和开发者的首选。本文将深入探讨微服务架构的核心要素,包括服务拆分、通信机制、数据管理等,并结合实际案例分析其在不同场景下的应用策略,旨在为读者提供一套全面、深入的微服务架构实践指南。**
**微服务架构作为软件开发领域的热门话题,正引领着一场技术革新。本文从微服务架构的核心要素出发,详细阐述了服务拆分的原则与方法、通信机制的选择与优化、数据管理的策略与挑战等内容。同时,结合具体案例,分析了微服务架构在不同场景下的应用策略,为读者提供了实用的指导和建议。
|
3天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
3天前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
30天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。