Kubernetes弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源
前言
容器技术的发展让软件交付和运维变得更加标准化、轻量化、自动化。这使得动态调整负载的容量变成一件非常简单的事情。在kubernetes中,通常只需要修改对应的replicas数目即可完成。当负载的容量调整变得如此简单后,我们再回过头来看下应用的资源画像。对于大部分互联网的在线应用而言,负载的峰谷分布是存在一定规律的。例如下图是一个典型web应用的负载曲线。从每天早上8点开始,负载开始飙高,在中午12点到14点之间,负载会回落;14点到18点会迎来第二个高峰;在18点之后负载会逐渐回落到最低点。
资源的波峰和波谷之间相差3~4倍左右的容量,低负载的时间会维持8个小时左右。如果使用纯静态的容量规划方式进行应用管理与部署,我们可以计算得出资源浪费比为25% (计算方式:1 - (1x8+4x16)/4x24 = 0.25 )。而当波峰和波谷之间的差别到达10倍的时候,资源浪费比就会飙升至57%(计算方式:1 - (1x8+10x16)/10x24 = 0.57 )。
那么当我们面对这么多的资源浪费时,是否可以通过弹性的方式来解决呢?标准的HPA是基于指标阈值进行伸缩的,常见的指标主要是CPU、内存,当然也可以通过自定义指标例如QPS、连接数等进行伸缩。但是这里存在一个问题,因为基于资源的伸缩存在一定的时延,这个时延主要包含:采集时延(分钟级) + 判断时延(分钟级) + 伸缩时延(分钟级)。而对于上图中,我们可以发现负载的峰值毛刺还是非常尖锐的,这有可能会由于HPA分钟级别的伸缩时延造成负载数目无法及时变化,短时间内应用的整体负载飙高,响应时间变慢。特别是对于一些游戏业务而言,由于负载过高带来的业务抖动会造成玩家非常差的体验。
为了解决这个场景,阿里云容器服务提供了kube-cronhpa-controller
,专门应对资源画像存在周期性的场景。开发者可以根据资源画像的周期性规律,定义time schedule,提前扩容好资源,而在波谷到来后定时回收资源。底层再结合cluster-autoscaler
的节点伸缩能力,提供资源成本的节约。
使用方式
cronhpa
是基于CRD的方式开发的controller,使用cronhpa
的方式非常简单,整体的使用习惯也尽可能的和HPA保持一致。代码仓库地址
1. 安装CRD
kubectl apply -f config/crds/autoscaling_v1beta1_cronhorizontalpodautoscaler.yaml
复制代码
2. 安装RBAC授权
# create ClusterRole
kubectl apply -f config/rbac/rbac_role.yaml# create ClusterRolebinding and ServiceAccount
kubectl apply -f config/rbac/rbac_role_binding.yaml
复制代码
3. 部署kubernetes-cronhpa-controller
kubectl apply -f config/deploy/deploy.yaml
复制代码
4. 验证kubernetes-cronhpa-controller
安装状态
kubectl get deploy kubernetes-cronhpa-controller -n kube-system -o wide kubernetes-cronhpa-controller git:(master) kubectl get deploy kubernetes-cronhpa-controller -n kube-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-cronhpa-controller 1 1 1 1 49s
复制代码
运行一个cronhpa的demo
安装了kubernetes-cronhpa-controller
后,我们可以通过一个简单的demo进行功能的验证。在部署前,我们先看下一个标准的cronhpa的定义。
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:labels:controller-tools.k8s.io: "1.0"name: cronhpa-samplenamespace: default
spec:scaleTargetRef:apiVersion: apps/v1beta2kind: Deploymentname: nginx-deployment-basicjobs:- name: "scale-down"schedule: "30 */1 * * * *"targetSize: 1- name: "scale-up"schedule: "0 */1 * * * *"targetSize: 3
复制代码
其中scaleTargetRef
字段负责描述伸缩的对象,jobs
中定义了扩展的crontab
定时任务。在这个例子中,设定的是每分钟的第0秒扩容到3个Pod,每分钟的第30s缩容到1个Pod。如果执行正常,我们可以在30s内看到负载数目的两次变化。
1. 部署demo应用与cronhpa的配置
kubectl apply -f examples/deployment_cronhpa.yaml
复制代码
2. 检查demo应用副本数目
kubectl get deploy nginx-deployment-basic kubernetes-cronhpa-controller git:(master) kubectl get deploy nginx-deployment-basic
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment-basic 2 2 2 2 9s
复制代码
3. 查看cronhpa的状态 ,确认cronhpa的job已提交
kubectl describe cronhpa cronhpa-sample Name: cronhpa-sample
Namespace: default
Labels: controller-tools.k8s.io=1.0
Annotations: kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"autoscaling.alibabacloud.com/v1beta1","kind":"CronHorizontalPodAutoscaler","metadata":{"annotations":{},"labels":{"controll...
API Version: autoscaling.alibabacloud.com/v1beta1
Kind: CronHorizontalPodAutoscaler
Metadata:Creation Timestamp: 2019-04-14T10:42:38ZGeneration: 1Resource Version: 4017247Self Link: /apis/autoscaling.alibabacloud.com/v1beta1/namespaces/default/cronhorizontalpodautoscalers/cronhpa-sampleUID: 05e41c95-5ea2-11e9-8ce6-00163e12e274
Spec:Jobs:Name: scale-downSchedule: 30 */1 * * * *Target Size: 1Name: scale-upSchedule: 0 */1 * * * *Target Size: 3Scale Target Ref:API Version: apps/v1beta2Kind: DeploymentName: nginx-deployment-basic
Status:Conditions:Job Id: 38e79271-9a42-4131-9acd-1f5bfab38802Last Probe Time: 2019-04-14T10:43:02ZMessage:Name: scale-downSchedule: 30 */1 * * * *State: SubmittedJob Id: a7db95b6-396a-4753-91d5-23c2e73819acLast Probe Time: 2019-04-14T10:43:02ZMessage:Name: scale-upSchedule: 0 */1 * * * *State: Submitted
Events: <none>
复制代码
4. 等待一段时间,查看cronhpa的运行状态。
kubernetes-cronhpa-controller git:(master) kubectl describe cronhpa cronhpa-sample
Name: cronhpa-sample
Namespace: default
Labels: controller-tools.k8s.io=1.0
Annotations: kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"autoscaling.alibabacloud.com/v1beta1","kind":"CronHorizontalPodAutoscaler","metadata":{"annotations":{},"labels":{"controll...
API Version: autoscaling.alibabacloud.com/v1beta1
Kind: CronHorizontalPodAutoscaler
Metadata:Creation Timestamp: 2019-04-15T06:41:44ZGeneration: 1Resource Version: 15673230Self Link: /apis/autoscaling.alibabacloud.com/v1beta1/namespaces/default/cronhorizontalpodautoscalers/cronhpa-sampleUID: 88ea51e0-5f49-11e9-bd0b-00163e30eb10
Spec:Jobs:Name: scale-downSchedule: 30 */1 * * * *Target Size: 1Name: scale-upSchedule: 0 */1 * * * *Target Size: 3Scale Target Ref:API Version: apps/v1beta2Kind: DeploymentName: nginx-deployment-basic
Status:Conditions:Job Id: 84818af0-3293-43e8-8ba6-6fd3ad2c35a4Last Probe Time: 2019-04-15T06:42:30ZMessage: cron hpa job scale-down executed successfullyName: scale-downSchedule: 30 */1 * * * *State: SucceedJob Id: f8579f11-b129-4e72-b35f-c0bdd32583b3Last Probe Time: 2019-04-15T06:42:20ZMessage:Name: scale-upSchedule: 0 */1 * * * *State: Submitted
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Succeed 5s cron-horizontal-pod-autoscaler cron hpa job scale-down executed successfully
复制代码
此时可以在event中发现负载的定时伸缩已经生效。
最后
kubernetes-cronhpa-controller
可以很好的解决拥有周期性资源画像的负载弹性,结合底层的cluster-autoscaler
可以降低大量的资源成本。目前kubernetes-cronhpa-controller
已经正式开源,更详细的用法与文档请查阅代码仓库的文档,欢迎开发者提交issue与pr。
本文作者:莫源
原文链接
本文为云栖社区原创内容,未经允许不得转载。
转载于:https://juejin.im/post/5cc2c1ac6fb9a031fd6344eb
Kubernetes弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源相关推荐
- Kubernetes 弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源
作者| 阿里云容器技术专家刘中巍(莫源) 导读:Kubernetes弹性伸缩系列文章为读者一一解析了各个弹性伸缩组件的相关原理和用法.本篇文章中,阿里云容器技术专家莫源将为你带来定时伸缩组件 kub ...
- Kubernetes 弹性伸缩全场景解读(二)- HPA 的原理与演进
前言 在上一篇文章 Kubernetes 弹性伸缩全场景解析 (一):概念延伸与组件布局中,我们介绍了在 Kubernetes 在处理弹性伸缩时的设计理念以及相关组件的布局,在今天这篇文章中,会为大家 ...
- Kubernetes 弹性伸缩全场景解析 (四)- 让核心组件充满弹性
前言 在本系列的前三篇文章中,我们介绍了弹性伸缩的整体布局以及 HPA 的一些原理,HPA 的部分还遗留了一些内容需要进行详细解析.在准备这部分内容的期间,会穿插几篇弹性伸缩组件的最佳实践.今天我们要 ...
- 华为手表新款watch gt3_【新品】华为全场景新品发布会正式举行:发布多款产品...
今晚华为全场景新品发布会正式举行,会上发布了多款智能周边产品. 首先,第一款带来的新品是大家较为关注的华为 FreeBuds Pro 真无线降噪耳机. 华为 FreeBuds Pro 无线耳机首创舒适 ...
- Kubernetes 弹性伸缩全场景解析 (一):概念延伸与组件布局
传统弹性伸缩的困境 弹性伸缩是 Kubernetes 中被大家关注的一大亮点,在讨论相关的组件和实现方案之前.首先想先给大家扩充下弹性伸缩的边界与定义,传统意义上来讲,弹性伸缩主要解决的问题是容量规划 ...
- Kubernetes 弹性伸缩全场景解析(三) - HPA 实践手册
在上一篇文章中,给大家介绍和剖析了 HPA 的实现原理以及演进的思路与历程.本文我们将会为大家讲解如何使用 HPA 以及一些需要注意的细节. autoscaling/v1 实践 v1 的模板可能是大家 ...
- 容器服务kubernetes弹性伸缩高级用法
前言 近期,阿里云容器服务kubernetes发布了cluster-autoscaler的支持,开发者可以通过页面简单快捷的配置节点的弹性伸缩,支持普通实例.GPU实例以及竞价实例帮助开发者实现架构弹 ...
- 要把AI建在赤道上的华为,为何用全栈全场景方案打响第一枪
李根 发自 ShanghAI 量子位 报道 | 公众号 QbitAI 靴子终于落地! 华为AI战略已完整发布,之前传闻中的全栈全场景的方案,也已发布. 不知你会如何评价?我们先拣要点"回顾 ...
- 刚刚,华为全场景 AI 计算框架MindSpore正式开源!国产深度学习框架的春天来了!...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 此前,我们刚刚报道了旷视科技在3月25日开源深度学习框架 MegEngine ,3 ...
最新文章
- 数据挖掘流程(六):写报告
- 深度学习和目标检测系列教程 6-300:目标检测Fast-RCNN架构
- php 动态显示数字,php – 如何动态创建具有指定数字的图像?
- js中的generator
- warning: expression result unuesd 可能原因是函数忘了加括号,
- flowable节点的自定义属性扩展_03
- tmc4361 闭环_TMC4361A-LA
- 程序固化到优盘中_城建工程师谈疏浚泥浆深度脱水固化处理施工技术
- html里面注释浮动框,“浮动”注释与HTML / CSS / JavaScript /任何
- pip 安装 rdkit
- 一个java内存泄漏的排查案例
- ReactiveCocoa 5.0 初窥:可能是最痛的一次升级
- Mybatis复杂结果集映射(详细)
- 如何监控网页卡顿和崩溃?
- html制作朋友圈素材,微信朋友圈图文素材
- Sling CMS 学习:环境搭建(一)
- 牵手华为云,云时通SRM助力企业采购数字化升级!
- 眼球追踪技术是VR下一个突破口?
- 带鱼屏这种极致体验的电脑显示器也“飞入寻常百姓家”
- OpenGL制作简易地图(二)