Kubernetes弹性伸缩全场景解读(八) - 定时伸缩组件支持HPA兼容

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 在之前的文章中,我们介绍了kubernetes-cronhpa-controller是如何通过设置定时的方式触发容器的水平副本伸缩,但是在实际的场景下,虽然定时伸缩对于负载有规律的应用比较友好,但是应用为了防止突发的流量冲击,还是会配置HPA来做最后的保障的。

前言

在之前的文章中,我们介绍了kubernetes-cronhpa-controller是如何通过设置定时的方式触发容器的水平副本伸缩,但是在实际的场景下,虽然定时伸缩对于负载有规律的应用比较友好,但是应用为了防止突发的流量冲击,还是会配置HPA来做最后的保障的。那么CronHPA与HPA之间该怎么选择呢?

定时伸缩组件兼容HPA

在抉择什么时候需要CronHPA,什么时候使用HPA的时候,我们在思考是否可以将CronHPA与HPA一起使用,如果一起使用会有什么需要解决的问题呢?首先我们先看CronHPA的模板定义

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
spec:
   scaleTargetRef:
      apiVersion: apps/v1
      kind: Deployment
      name: nginx-deployment-basic
   jobs:
   - name: "scale-down"
     schedule: "30 */1 * * * *"
     targetSize: 1
   - name: "scale-up"
     schedule: "0 */1 * * * *"
     targetSize: 3

在CronHPA中是通过scaleTargetRef字段来获取伸缩对象的,并通过jobs的crontab规则定时伸缩实例的副本。

那么我们再来看下HPA的模板定义

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment-basic
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

HPA也是通过scaleTargetRef来定义伸缩的对象,并通过资源利用率来判断伸缩的情况。如果同时设置CronHPA与HPA,那么就会出现HPA与CronHPA同时操作一个scaleTargetRef的场景,而两者之间又相互独立无法感知,这样就会出现两个controller各自工作,后执行的会覆盖先执行的结果。

c01acfe2a616965e45a57714436e20aef08a3269.png
这个问题的本质是两个controller无法相互感知,从而造成了异常,当回过头来看这个问题的时候,其实我们可以发现HPA早期也有同样的问题,开发者如果希望通过用两个监控指标同时作用到HPA的时候,如果设置两个HPA对象,会出现类似的问题,在解决这个问题的时候,是通过在HPA对象中定义metrics字段,将多个metrics合并到一个HPA对象中来实现的,例如:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment-basic
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 50

当两个metrics触发弹性的个数不同的时候,会根据稳定性第一的原则,优先弹出更多的副本或者在缩容时保留更多的副本。那么是否CronHPA和HPA也可以通过这个方案进行整合,答案是Yes and No。因为的确可以通过alibaba-cloud-metrics-adapter将定时的数据通过External Metrics的方式进行转换,然后通过HPA中使用External Metrics的方式进行整合和匹配。但是这样会带来的结果就是,我们需要通过HPA的结构去表达CronHPA的规则,然后再通过Metrics Adapter的模型去转换时间信息与副本计算。从模型上来看,这个方式看似兼容了HPA,但是实际上对定时伸缩的可读性、学习成本、出错诊断、审计与离线都带来了新的挑战。

那么是否还有其他的方法可以实现CronHPA与HPA的兼容呢?我们将视角放回scaleTargetRef,还记得HPA是怎么伸缩Deployment的Pod吗,是HPA将Deployment配置在了scaleTargetRef的字段下,然后Deployment通过自身定义查找到了ReplicaSet,在通过ReplicaSet调整了真实的副本数目。
b4259cc83f9b203cf4c35cf96e48fddfdbc61b12.png
那么从这个角度出发,我们有了一个大胆的想法,是否可以将scaleTargetRef设置为HPA对象,然后通过HPA对象来寻找真实的scaleTargetRef
6dfb0eba5791cb43ef0d1cd4397f4eaab8553c22.png

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
spec:
   scaleTargetRef:
      apiVersion: autoscaling/v1
      kind: HorizontalPodAutoscaler
      name:  nginx-deployment-basic-hpa
   jobs:
   - name: "scale-down"
     schedule: "30 */1 * * * *"
     targetSize: 1
     runOnce: true
   - name: "scale-up"
     schedule: "0 */1 * * * *"
     targetSize: 3
     runOnce: true

这样设计的好处是,首先CronHPA可以感知HPA当前的状态,明确的知晓HPA的min、max、desired的数值,同时也知道HPA scaleTargetRef所对应的当前replicas。那么本着稳定性原则,我们要如何操控HPA呢?

hpa(min/max) cronhpa deployment result 场景
1/10 5 5 hpa(1/10) deployment 5 定时和当前一致,无需变更
1/10 4 5 hpa(1/10) deployment 5 当前高于定时,保留当前副本
1/10 6 5 hpa(6/10) deployment 6 定时高于当前,保留定时副本
定时高于HPA下限,修改HPA下限
5/10 4 5 hpa(4/10) deployment 5 定时低于当前,保留当前副本
定时低于HPA下限,修改HPA下限
5/10 11 5 hpa(11/11) deployment 11 定时高于当前,保留定时副本
定时高于HPA上限,修改HPA上限

如上图所以,CronHPA会通过调整HPA的方式进行感知,CronHPA要达到的副本和当前副本取大值,来判断是否要扩容以及修改HPA的上限。CronHPA要达到的副本和HPA的配置取小值,判断是否要修改HPA的下限。简单而言,CronHPA不会直接调整Deployment的副本数目,而是通过HPA来操作Deployment,这样就可以避免HPA和CronHPA的冲突问题了。

最后

定时伸缩CronHPA和HPA都是在线业务场景下非常重要的功能,不论使用何种的兼容与适配的方式,稳定性第一的原则是不能改变的,开发者如果对CronHPA感兴趣,欢迎提交PR

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
11月前
|
存储 弹性计算 调度
基于Knative的LLM推理场景弹性伸缩方案
Knative的基于请求弹性配置与大语言模型(LLM)的推理场景高度契合。此外,它的资源降配特性可以显著帮助用户降低成本。本文详细介绍基于 Knative 的 LLM 推理场景弹性伸缩方案。
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
Prometheus Kubernetes 监控
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
514 1
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
275 1
|
Kubernetes 监控 调度
k8s学习--kubernetes服务自动伸缩之垂直伸缩(资源伸缩)VPA详细解释与安装
k8s学习--kubernetes服务自动伸缩之垂直伸缩(资源伸缩)VPA详细解释与安装
549 2
|
Kubernetes 应用服务中间件 nginx
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
308 1
|
Kubernetes Cloud Native 应用服务中间件
Kubernetes 自动伸缩策略:优化资源利用率
【8月更文第29天】在现代云原生环境中,应用的流量往往具有不可预测性。为了应对这种变化,Kubernetes 提供了多种自动伸缩机制来动态调整应用实例的数量和每个实例分配的资源。本文将深入探讨两种主要的自动伸缩工具:水平 Pod 自动伸缩器 (HPA) 和垂直 Pod 伸缩器 (VPA),并提供实际的应用示例。
383 1
|
2月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
271 1
|
2月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
242 89

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多