企业级运维之云原生与Kubernetes实战课程
第四章第4讲 ACK集群弹性伸缩
视频地址:
https://developer.aliyun.com/learning/course/913/detail/14608
一、 弹性伸缩概述
1. 集群弹性伸缩
弹性伸缩是根据业务需求和策略,经济地自动调整弹性计算资源的管理服务。
弹性伸缩的本质是解决容量和成本之间的博弈。当出现资源不足、资源浪费或激增峰值容量的场景下,就需要运用弹性伸缩,如下图。
2. 弹性伸缩的优势
针对三类人群,弹性伸缩的优势分别是:
- 开发人员:应用获得高可用的保障;
- 运维人员:降低基础设施的管理成本;
- 架构师:架构灵活应对突发的激增峰值。
3. 弹性伸缩的分类
弹性伸缩分为两个维度:调度层弹性和资源层弹性。
a. 调度层弹性:
- 所有弹性都与Pod相关,而无需关心资源情况;
- 主要负责修改负载的调度容量变化;
- 组件包括:
- HPA:Pod水平伸缩组件,调整应用的副本数;
- VPA:Pod纵向伸缩组件,面向有状态服务的扩容和升级场景;
- CronHPA:定时伸缩组件,面向周期性负载场景
b. 资源层弹性:
- 所有弹性都与Pod和资源情况相关;
- 主要是集群的容量规划不能满足集群调度容量时,会通过弹出ECS或ECI等资源的方式进行调度容量的补充;
- 组件包括:
- cluster-autoscaler:当Pod资源不足时,主动进行节点伸缩;
- virtual-kubelet-autoscaler:当没有足够资源给Pod调度时,弹出虚拟节点,并将Pod调度到虚拟节点。
二、HPA
Pod水平伸缩(HPA)可以基于CPU/Memory等指标对Pod副本数进行扩缩。
1. HPA原理
a. HPA自动伸缩的三步骤:
- 获取被伸缩资源对象管理的所有Pod度量;
- 计算使度量数值到达或接近所指定目标数值所需的Pod数量;
- 更新被伸缩资源的replicas字段;
b. 适用对象
- Deployment
- StatefulSet
- ReplicaSet
- ReplicationController
c. 不适用对象
- DaemonSet
2. 计算所需的Pod数量
如上图所示,假设有3个Pod,CPU使用率分别是60%、90%、50%,QPS分别为15、30、12;
场景一:单个Pod指标的自动伸缩
如果目标CPU使用率为50%,计算需要多少副本数:(60+90+50)/50=4,因此,需要扩容1个Pod;
场景2:多个Pod指标的自动伸缩
除了目标CPU使用率指标,又增加了目标QPS指标,这时HPA会单独计算每个指标的副本数,然后取最大值;
当目标QPS为20,副本数=(15+30+12)/20=3,因此两个指标的副本数取最大值就是4;
计算公式:
公式解读:所有的Pod监控数值求和后除以HPA资源上配置的目标值。
3. HPA特性
a. 统计周期
- --horizontal-Pod -autoscaler-sync-period参数控制统计指标的周期,默认15s ;
b. 忽略Pod 度量
- Pod被标记为删除;
- Pod缺失度量值,它将会被搁置,只在最终确定扩缩数量时再考虑;
- 当使用CPU指标来扩缩时,任何还未就绪(例如还在初始化)状态的Pod,该Pod会被搁置;
c. 冷却、延迟支持
- 场景:指标动态变化较频繁,会造成副本数量频繁变化,称之为“抖动”;
- --horizontal-Pod -autoscaler-downscale-stabilization可以控制冷却时间,即自从上次缩容执行结束后,多久可以再次执行缩容,默认时间是5分钟;
d. 边界值计算
- 在计算边界条件时,会自动加入10%的缓冲负载缓解整体的负载情况;
e. 支持的指标
- 除了自带的CPU、Memory指标外,还支持用户自定义指标以及外部指标。
4. HPA示例
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name:test
spec:
maxReplicas:3
minReplicas:2
scaleTargetRef:
apiVersion:apps/v1
kind:Deployment
name: test1
targetCPUUtilizationPercentage: 80
参数说明:
- max/minReplicas:最大/最小副本数;
- scaleTargetRef:设置当前HPA绑定的对象,在本例中绑定名为test1的Deployment;
- targetCPUUntilizationPercentage:目标CPU使用率。
5. 创建HPA应用
HPA应用有两种创建方式,一种是通过容器服务器控制台创建,另一种是通过Kuberletctl命令创建。
a. 通过容器服务器控制台创建
示例:为已有应用开启HPA
- 在集群管理页左侧导航栏中,选择工作负载 > 无状态;
- 在无状态页面中,单击目标应用名称进入详情页;
- 单击容器伸缩页签,然后单击“创建”;
- 在创建对话框中设置伸缩配置,单击“确定”;
b. 通过Kubectl命令创建
通过编排模板来手动创建HPA,并将其绑定到要伸缩的Deployment对象上,通过kubectl命令实现容器自动伸缩配置。
注意:HPA需要给Pod设置request资源,如果没有request资源,HPA不会运行。
三、节点自动伸缩
1. 节点扩容
节点是否扩容是根据集群中是否有pending状态的Pod来决策的。
扩容原理:
cluster-autoscaler是通过对处在Pending的Pod进行监听而触发的。当Pod处在Pending的原因是调度资源不足的时候,会触发cluster-autoscaler的模拟调度,模拟调度器会计算在配置的伸缩组中,哪个伸缩组弹出节点后可以调度这些Pending的Pod。
2. 节点缩容
节点是否缩容是根据集群中是否有节点调度利用率低于阈值来决策的。
缩容原理:
- 首先只有弹性伸缩弹出的节点会被缩容,静态的节点是无法被cluster-autoscaler接管的。缩容的判断是通过每个节点单独判断的,当任意一个节点的调度利用率低于所设置的调度阈值时,会触发节点的缩容判断。
- 同时还要计算哪个伸缩组弹出节点后可以调度这些pending,此时cluster-autoscaler会尝试模拟驱逐节点上面的负载,判断当前节点是否可以排水彻底。有些特殊的Pod(kube-system命名空间的非DaemonSet Pod、PDB控制的Pod等),则会跳过该节点而选择其他的候选节点。
- 当节点发生驱逐时,会先进行排水,将节点上的Pod驱逐到其他的节点,然后再下线该节点。
3. 操作演示
步骤一:执行自动伸缩
在集群列表页面,在目标集群右侧的操作列下,选择更多> 自动伸缩,进入集群自动弹性伸缩配置页面。
步骤二:授权
授权RAM角色AliyunCSManagedAutoScalerRole
在云资源访问授权页面,单击同意授权;
步骤三:配置自动伸缩
a. 在集群自动弹性伸缩配置页面,填写以下信息并提交:
- 允许缩容;
- 缩容阈值:cluster-autoscaler管理的伸缩组中,每一个节点的资源申请值(Request)与每一个节点的资源容量的比值,当低于配置的阈值时,节点会进行缩容;
- GPU缩容阈值;
- 缩容触发时延:集群满足配置的缩容阈值时,在配置的缩容触发时延到达后,集群开始缩容。单位:分钟,默认情况下是10分钟;
- 静默时间:扩容出的节点,在静默时间过后,方可进入缩容判断;
- 弹性灵敏度;
- 节点池扩容顺序策略。
b. 创建节点池,设置伸缩组的配置项;
c. 单击确认配置,创建伸缩组。
本讲小结
1. ACK集群伸缩的几种类型,包括HPA、VPA、CronHPA、节点自动伸缩、虚拟节点自动伸缩;
2. HPA水平伸缩的机制节点自动伸缩的机制。
思考:
- HPA和节点自动伸缩,有什么区别?
- 如何延缓hpa来回扩缩造成的抖动?