合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
Hello folks,我是 Luga,今天我们来聊一下云原生生态领域相关的技术 - Auto Scaling ,即 “弹性伸缩” 。
在当今的云原生生态系统中,基于波动的工作负载和动态的流量模式已经成为常态,传统的IT基础设施面临着巨大的挑战。这种不可预测的行为使得我们需要重新思考基础设施管理的方式。
与传统的静态基础设施不同,现代云原生解决方案提供了更加灵活和自动化的弹性伸缩能力。通过运用容器化技术和编排工具,如 Kubernetes,我们可以根据负载需求的变化自动进行伸缩,实现资源的弹性调配。
Kubernetes Autoscaling 是 Kubernetes 容器编排系统中的一项动态功能,可以根据工作负载需求自动调整计算资源。这一功能通过平衡和优化资源分配,既能维持应用程序的性能,又能避免财务浪费。通过增加资源来处理流量激增,确保最佳性能,并在空闲期间部署较少的资源以节省成本。
Kubernetes Autoscaling 的好处包括最大限度地提高资源利用率、提供成本效益以及保证应用程序的持续可用性。任何使用 Kubernetes 的组织都可以从 Autoscaling 中获益,尤其是当应用程序在繁忙和空闲时期之间切换时。
Autoscaling 的关键优势之一是提供了弹性和敏捷性,可以根据实际需求动态调整资源。当负载增加时,Autoscaling 能够快速响应并自动扩展应用程序的副本数量,以满足当前的需求。这种扩展能力可确保应用程序具备足够的资源来处理高负载情况,从而避免性能瓶颈和用户体验下降。相反,在负载减少时,Autoscaling 可以自动缩减应用程序的副本数量,以节省成本并提高资源利用率。
此外,Autoscaling 还带来了更好的成本效益。通过根据实际需求调整资源配置,可以避免不必要的资源浪费。在高峰期间,通过增加资源来满足需求,可以确保最佳性能,但在空闲期间,可以减少资源并节省资金。这种动态的资源管理策略能够实现资源的最佳利用,提高成本效益。
尽管 Kubernetes 的 HPA(Horizontal Pod Autoscaler)和 VPA(Vertical Pod Autoscaler)提供了 Autoscaling 能力,但它们也存在一些潜在的瓶颈和限制,具体如下所示:
HPA 和 VPA 的 Autoscaling 过程需要一定的时间来监测指标并作出调整,从而可能会导致在负载突然增加或减少时出现一定的延迟,无法立即响应变化。这种延迟可能会导致性能下降或资源浪费。
同时,HPA 和 VPA 的 Autoscaling 依赖于指标的选择和配置。选择不合适的指标或错误地配置指标阈值可能导致扩缩容的不准确性。因此,正确选择和配置指标是确保 Autoscaler 有效运行的重要因素。
HPA 和 VPA 依赖于底层基础设施的可扩展性和弹性。如果底层基础设施无法满足自动扩缩容的需求,例如,底层节点资源有限或网络带宽不足,那么自动弹性伸缩的效果将受到限制。
在实际的业务场景中,往往存在某些应用程序可能不适合自动扩缩容,特别是具有持久性状态或特定调度要求的应用程序。这些应用程序可能需要采取额外的措施来处理自动扩缩容引起的状态管理或数据持久性问题。
通常而言,为 H/VPA 创建自定义指标可能并非易事。这个过程需要对 Kubernetes 内部结构有一定的了解,并需要开发人员深入研究相关接口和进行复杂的代码修改。因此,对于没有相关经验的开发人员来说,这可能是一个具有挑战性的任务。从长远角度来看,这种额外的复杂性可能会导致维护困难。
前面我们提到了 Kubernetes 内置提供的解决方案在开销或实用性方面能力是非常有限的。如果我们想更优雅地扩展事件驱动的应用程序,此时,则需要另寻他路。或许,KEDA 是一种不可多得的选择。
那么,KEDA 到底是什么?
KEDA(基于 Kubernetes 的事件驱动自动缩放器)是一个由微软和红帽创建的开源项目,目前已从云原生计算基金会(CNCF)毕业,采用 Apache 2.0 许可证。KEDA 的主要目标是为在 Kubernetes 上运行的事件驱动应用程序提供更好的扩展选项。
在目前的 Kubernetes 环境中,水平 Pod 自动缩放器(HPA)仅对基于资源的指标作出反应,例如 CPU 或内存使用情况,或者自定义指标。然而,对于那些可能经历突发数据流的事件驱动应用程序来说,HPA 的扩展速度可能相当缓慢。此外,一旦数据流减缓,HPA必须缩小规模并删除多余的 Pod,导致不必要的资源继续产生费用。
KEDA 的出现填补了这一缺失,通过引入事件驱动的自动弹性伸缩机制,使得在 Kubernetes 上运行的事件驱动应用程序可以更加高效地扩展。KEDA 可以根据事件流的速率和规模动态地调整应用程序的副本数量,以满足负载需求。这意味着在应用程序需要处理大量事件时,KEDA 可以快速扩展并自动添加 Pod 实例,以确保高吞吐量和低延迟。
另一个 KEDA 的优势是它支持多种事件源,如 Azure 队列、Kafka、RabbitMQ 等,使得应用程序能够从不同来源接收事件。这为开发人员提供了更大的灵活性和选择性,可以根据应用程序的需求选择适当的事件源。
如下为基于 KEDA 使用 Prometheus 指标触发 Autoscaling 机制的示例,具体:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: prometheus-scaledobject
namespace: devops
spec:
scaleTargetRef:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
name: keda-devops-demo
triggers:
- type: prometheus
metadata:
serverAddress: http://<prometheus-host>:9090
metricName: http_request_total
query: envoy_cluster_upstream_rq{appId="300", cluster_name="300-0", container="envoy", namespace="demo3", response_code="200" }
threshold: "50"
idleReplicaCount: 0
minReplicaCount: 1
maxReplicaCount: 10
TOP