开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程: ACK 集群弹性伸缩】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/913/detail/14608
ACK 集群弹性伸缩
一、 弹性伸缩概述
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 来回扩缩造成的抖动?