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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6月前
|
存储 Kubernetes 监控
基于Kubernetes的电商平台部署:实现高可用、弹性伸缩与容器化管理
基于Kubernetes的电商平台部署:实现高可用、弹性伸缩与容器化管理
|
1月前
|
弹性计算 运维 Kubernetes
云原生K8S场景自动化响应ECS系统事件
客户云原生K8S场景下,通过社区开源NPD+Draino+Autoscaler零开发,对接响应ECS主动运维事件,通过自动响应事件减少非预期宕机。
|
7月前
|
存储 Kubernetes 调度
容器技术基础-Kubernetes 流程及场景
容器技术基础-Kubernetes 流程及场景
96 0
容器技术基础-Kubernetes 流程及场景
|
4月前
|
Kubernetes Cloud Native 网络协议
云原生|kubernetes部署和运行维护中的错误汇总(不定时更新)
云原生|kubernetes部署和运行维护中的错误汇总(不定时更新)
193 0
|
4月前
|
Kubernetes 应用服务中间件 网络安全
Kubernetes证书类型和适用场景
Kubernetes证书类型和适用场景
110 0
|
7月前
|
弹性计算 Kubernetes 应用服务中间件
通过HPA进行Pod水平弹性伸缩
本场景带您体验如何使用阿里云指标完成Pods的自动伸缩。
166 0
|
7月前
|
存储 缓存 Kubernetes
基于 ACK Fluid 的混合云优化数据访问(一):场景与架构
基于 ACK Fluid 的混合云优化数据访问(一):场景与架构
|
8月前
|
Kubernetes 网络协议 应用服务中间件
k8s场景测试之ingresss中geoip的使用
Geo是geographic的缩写,意思是地理的,GeoIP即为IP地理位置数据库,可以根据IP获得地理位置信息。GeoLite2是GeoIP2的免费版本,与GeoIP2数据库相比准确性较差。 GeoIP库可以根据IP地址(支持IPv4 和 IPv6), 定位该IP所在的 洲、经纬度、国家、省市、ASN 等信息。
181 0
|
9月前
|
弹性计算 Kubernetes 安全
基于 Armory 进行 Kubernetes 集群的弹性伸缩
想象一下,假设亚马逊每年只有一天不可用。按照这个数值估算,他们的业务将会约有 99.7% 的可用性,从表面上看这是相当合理的。然而,在过去的 2020 年,亚马逊的收入接近 4000 亿美元。基于 99.7% 而不是 100% 的可用性将花费亚马逊超过 10 亿美元。哪怕停机时间只是那么一点点,也会让公司的业务损失惨重。
77 0
|
9月前
|
运维 Kubernetes 安全
24个K8S常用场景使用命令(推荐收藏)!
24个K8S常用场景使用命令(推荐收藏)!

相关产品

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

    更多