概述
弹性伸缩是ACK特点功能之一,典型的场景包括:
-
在线业务弹性
-
大规模计算训练
-
定时周期性负载变化等
弹性伸缩分为两个维度:
-
弹性调度层:主要负责修改负载的调度容量变化,在已有资源条件下进行pod调度
-
资源弹性层:主要负责扩充资源的方式调度容量的补充,对资源本社进行调度
资源层阶段弹性提供
-
阿里云Kubernetes集群的一个重要特性,是集群的节点可以动态的增加或减少
-
有了这个特性,集群才能在计算资源不足的情况下扩充新的节点
-
同时,也可以在资源利用率降低的时候,释放节点以节省费用
-
资源层扩缩容可以分为:手动扩缩容、自动扩缩容
资源层弹性插件
-
Cluster-autoscaler: Kubernetes社区开源组件,节点水平伸缩软件,阿里云提供了独有的调度、弹性优化、成本优化的功能。
-
Virtual-node: ACK开源插件,提供无服务器运行时环境,开发者无需挂心节点资源,只需针对Pod按量付费即可。
-
Virtual-kubelet-autoscaler: ACK服务组件,提供无服务弹性伸缩能力
节点自动伸缩
节点自动伸缩机制
定期检测集群中应用pod的状态,如果处于pending状态且日志中出现调度原因不足时,会触发cluster-autoscaler的模拟调度,会在各node中查询哪台机可以负载新的pod,如果有就分配;如果没有就触发资源调度,实现资源级别的自动伸缩。
节点自动伸缩实现原理
-
阿里云容器服务ACK的自动伸缩能力,是通过节点自动伸缩组件(cluster-autoscaler)实现的。
-
可以按需弹出普通实例、GPU实例、竞价付费实例、支持多可用区、多实例规格、多种伸缩模式、满足不同的节点伸缩场景。
-
伸缩配置:通过控制台配置伸缩节点的规格属性
-
自动伸缩组件监听:自动伸缩组件cluster-autoscaler,它以Pod的形式运行在K8S集群中、监听Pod状态,在Pod因为节点资源不足而不能被调度的状态时,启动自动伸缩规则
-
伸缩规则启动:根据伸缩配置的内容,启动ESS弹性伸缩服务
-
ESS弹性伸缩服务创建实例:通过ESS他行设所服务按照配置创建实例后,继续进行集群监听
-
节点自动伸缩操作
可分为3个步骤:
- 执行自动伸缩
- 弹性伸缩服务ESS授权
- 配置自动伸缩
- 查看结果
调度层弹性伸缩
调度层弹性介绍
-
调度层弹性组件是指所有的弹性动作都是和pod相关的,并不关心具体的资源情况。
-
调度层弹性组件包括:容器水平伸缩(HPA),容器垂直伸缩(VPA),容器定时伸缩(CronHPA)
调度层弹性组件
-
HPA: Pod水平伸缩的组件
-
除了社区支持的Resource Metrics和CustomMetrics,阿里云容器服务Kuberenetes还提供了external-metrics-adapter
-
支持云服务的指标作为弹性伸缩的判断条件
-
目前已经支持例如Ingress的QPS、RT等监控指标
-
-
VPA:Pod的纵向伸缩的最贱,主要面向有状态服务的扩容和升级场景,用于大型单体应用
-
CronHPA:定时伸缩组件,主要面向的是周期性负载,通过资源画像可以预测有规律的负载周期,并通过周期性伸缩,实现资源成本的节约
调度层弹性组件使用场景及限制
通常使用HPA+AutoScaler进行两层扩容,HPA负载容量管理,AutoScaler负责资源池的所扩容
ACK开启HPA
小结
-
阿里云容器服务ACK弹性伸缩分为两个维度:
-
调度层弹性:主要负责修改负载的调度容量变化
-
资源层调度:主要是集群的容量规划不能满足集群调度容量时,会通过扩充资源的方式进行调度容量的补充
-
-
阿里云容器服务Kubernetes弹性调度资源:
通过调度与资源解耦的两层弹性模型来解决的,当集群的调度水位达到设置的阈值时会触发资源蹭的弹性扩容,当资源弹出后,无法调度的单元会自动调度到新弹出的节点上,从而降低整个应用的负载情况
-
阿里云容器服务ACK集群调度层弹性组件:
-
容器水平伸缩(HPA)
-
容器垂直伸缩(VPA)
-
容器定时伸缩(CronHPA)
-