参考论文:
[1]杨茂. 基于Kubernetes的容器自动伸缩技术的研究[D].西安邮电大学,2018.
Kubernetes的弹性伸缩技术
k8s提供了Service虚拟服务概念,对应于实际的服务提供者Pod集群,可以使用ReplicationController来实现Service对应一个Pod集群,服务入口对应于Service端口,通过Service负载到Pod集群,同时利用HPA策略来实现对于Pod集群数量的动态调整,扩容或者缩容。
k8s的HPA策略分析:
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
利用cpu利用率与预定的cpu利用率来进行伸缩
扩容阶段问题:
Kubernetes 自动伸缩策略属于一种响应式缩,其实质是根据 Pod 副本当前负载情况计算伸缩量。对于扩容阶段,当 Pod 副本负载过高触发 HPA 进行扩容时,HPA 计算出期望副本数并通知副本控制器,副本控制器根据期望值计算出需要创建 Pod 的数量,并交给相应组件执行具体的创建工作。因此从 Pod 副本负载过高触发扩容到新副本分担服务请求存在一定响应延迟。
在扩容时需要将 Pod 初始化的时间考虑进去,在负载高峰到来之前做好扩容准备,减少用户的请求响应时间,从而保障服务质量的稳性。
缩容阶段问题:
自动缩容的目的在于当应用 Pod 副本集负载较低时,通过删除冗余副本提高副本集的整体资源利用率,降低应用的部署成本。
缩容策略不仅要计算删除的副本量,还要考虑如何在副本集中选择合适的副本作为待删副本。
首先根据副本集中各副本所处状态的不同赋予不同的优先级,根据优先级对副本进行排序,最后选择优先级最小的副本作为待删副本。
一方面可能导致集群节点资源分配不平衡,造成部分节点 Pod 聚集,节点上的 Pod 相互之间竞争资源导致执行效率下降。部分节点
Pod 分布很少,节点上的资源处于闲置状态,造成资源浪费。另一方面删除 Pod 可能会造成节点上各维度资源使用不平衡,产生资源碎片问题。不同类型 Pod 对节点上不同维度资源需求存在很大的差异性。如果节点在删除某一 Pod 副本后剩余的各维度资源很难满足其他类型的 Pod 需求,而被删除类型的 Pod又长时间得不到扩容,或者该类型的 Pod 以后都不会再出现,那么该节点剩余的资源将长时间不能再被再次利用,产生资源碎片。对于长期运行的集群而言,资源碎片的累积会导致集群的整体资源利用率的降低。
基于负载预测的扩容策略:
预测式伸缩通过预测副本集未来的负载状况,在负载高峰到来之前完成扩容,从而避免因 Pod 初始化过程带来的响应延迟,保障了副本集的负载始终处于目标状态。
负载预测是通过总结已有的历史负载数据来对未来数据进行预测。历史负载数据是一段按照其发生时间排列成的数列,属于一种典型的时间序列数据。可以利用时间序列预测算法进行预测。此外负载的变化在不同时间会有不同的表现,因此对于负载数据的预测既要考虑其稳定性也要考虑其突发性。
指数平滑法进行负载预测:
一种短期时间序列的预测方法,具有计算量少、预测精度高的优点,同时该方法能充分利用全部历史数据,并且按照“重近轻远”的原则进
行加权平均和修匀数据,能够较好地将时间序列所包含的历史规律挖掘出来。
{yt}原始时间序列,对原始时间序列进行一次指数平滑:
进行二次指数平滑:
预测方程:
灰色预测模型:
灰色系统理论以“部分样本信息已知,部分样本信息未知”的“小样本”来进行预测的算法模型,该模型主要通过对部分未知信息的生成来开发和提取有价值的信息,从而实现对系统运行规律的正确认识和确切描述。基于灰色系统理论 GM(1,1)模型的预测方法称为灰色预测方法。灰色预测方法对于样本量小、变化规律不明显的样本有很好的适应性,同时灰色预测法的计算量小而且其定量分析结果和定性分析结果保持一致。
样本数据:
一次累加序列:
紧邻均值序列:
白花方程:
设 最小二乘法参数求解:
计算X1预测值:
对于X0进行还原:
精度检验:
基于灰色-指数平滑组合模型的负载预测:
利用指数平滑预测负载变化情况,总结之前的负载突变情况序列进行灰色建模,用突变情况的突变预测值取代相应平滑预测值作为最终结果返回,根据指数平滑法预测值与真实负载值相对误差来判断负载数据是否属于异常负载
扩容实现:
监控模块heapster+cadvisor来实现:
预测模块实现:
基于集群负载均衡的缩容策略:
在缩容时预先计算删除副本后所在节点的资源利用率,并将其作为该副本的资源权值。
基于节点多维度资源平衡的缩容策略
如果节点在删除某一 Pod 副本后造成某一维度上的资源剩余量难以满足其他类型的 Pod 需求,那么即使其他维度资源有很大剩余量,该节点都难以部署新 Pod。如果被删除类型的 Pod 长时间不扩容甚至该类型的 Pod 以后都不会再部署到集群中,那么节点的这部分剩余资源将很难再被重新利用。这些难以满足部署需求的资源碎片如果大量积累,将会造成集群资源的极大浪费。因此在删除 Pod时需要考虑到节点内各维度资源的平衡,节点各维度资源越平衡,其产生资源碎片的可能性往往越小。
总结:
弹性伸缩:
基于负载预测提前进行集群扩容,进而降低集群响应时间
基于负载均衡以及节点多维度资源平衡进行缩容,保证服务质量,减少集群数量,降低资源消耗。