《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(2) https://developer.aliyun.com/article/1232001?groupCode=supportservice
3. 弹性伸缩
ACK 容器服务弹性包括如下两个层面:
•调度层弹性,主要是负责修改负载的调度容量变化。例如,HPA是典型的调度层弹性组件,通过HPA可以调整应用的副本数,调整的副本数会改变当前负载占用的调度容量,从而实现调度层的伸缩。
•资源层弹性,主要是集群的容量规划不能满足集群调度容量时,会通过弹出
ECS或ECI等资源的方式进行调度容量的补充。两层的弹性组件与能力可以分开使用,也可以结合在一起使用,并且两者之间是通过调度层面的容量状态进行解耦。
•调度层弹性组件
HPA是k8s的workload的副本数进行自动水平扩缩容(scale)机制,其通过监控业务繁忙情况,在业务忙时,就要对workload扩容副本数;业务空闲时,缩容减少副本数。而默认进行调整的指标只有集群资源的cpu和mem使用率。
容器垂直伸缩(VPA),VPA会基于Pod的资源使用情况自动为集群设置资源占用
的限制,从而让集群将Pod调度到有足够资源的最佳节点上。VPA也会保持最初容器定义中资源request和limit的占比。但是该机制的有些功能目前是处于试验阶段,需要考虑谨慎使用。
•资源层弹性组件
除了常规的ECS实例,容器服务还提供了虚拟节点(Virtual1Node)功能,实现了Kubernetes与阿里云弹性容器实例ECI(Elastic1Container1Instance)无缝连接,让Kubernetes集群轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。可以灵活动态地按需创建ECIPod,免去集群容量规划的麻烦。
•弹性伸缩
通过 Horizontal Pod Autoscaler 按指标弹性扩缩容
游戏服务随着玩家上线的多少,是存在波峰波谷的,如果设置固定的资源
Request注定在波谷时会造成资源浪费,针对这样的场景,需要通过HPA基于默认的指标(CPU,内存的利用率)来自动扩容deployment和statefulset中的Pods副本数量,实现资源使用波峰或者流量突增的时候可以自动增加业务负载的副本数量,波谷或者流量较少的时候可以自动减少业务负载的副本数量,将有效提升资源整体利用率。
通过 Vertical Pod Autoscaler 垂直扩缩容
Vertical Pod Autoscaler,以下简称 VPA,K8S Pod垂直自动扩缩,可以自动调整Pod的CPU和内存预留,用于提高集群资源利用率并释放CPU和内存供其它Pod使用。相较于水平自动伸缩功能HPA,其不需要调整pod副本数量,具有扩容速度更快,可以对有状态应用进行扩容(HPA不适合有状态的应用水平扩容)。自动伸缩特性使容器服务具有灵活的自适应能力。应对业务负载急剧飙升的情况,VPA能够在设定范围内快速扩大容器的Request。在业务负载变小的情况下,VPA可根据实际情况适当缩小Request节省计算资源。适用于需要快速扩容、有状态应用扩容等场景。
通过Cluster Autoscaler自动调整节点x数量
HPA和VPA,都是在业务负载层面的自动扩缩副本数量,以灵活应对流量的波峰波谷,提升资源利用率。但是其使用的范围是要求集群有空闲的资源,整个集群资源总数是固定的,HPA和VPA只有在集群有更足够的资源情况下才有效,当集群内整体资源不足,那么就需要Cluster1Autoscaler的组件能力来实现自动扩缩集群规模,在业务波峰自动扩容节点、业务波谷时减少集群的节点数 。
提升CA扩容节点的速率
•极速模式-Qboot镜像
•停机不收费
•提前占位
•提前占位
其中Qboot镜像基于Alibaba Cloud Kernel,并直接从内核引导虚拟机启动的定制化镜像。使用该镜像创建的ECS实例相比其它镜像创建的ECS实例,启动速度得到了极大的提升,并且默认运行时与标准镜像完全一致。
通过虚拟节点获得 Serverless 能力
虚拟节点并不是节点,而是一种调度能力,可以将Kubernetes集群中的应用
Pod调度到集群节点之外的资源中,而该资源不需要免客户维护的。阿里云容器服务基于虚拟节点和ECI提供了这种Serverless Container产品形态,ACK on ECI,可以在ACK集群中通过组件管理页面部署ack-virtual-node组件,Virtual Node Controller默认被托管,提供免运维、强隔离、快速启动的容器运行环境。使用ECI无需购买和管理底层ECS服务器,可以关注在容器应用而非底层基础设施的维护工作,有效提升计算弹性效率。
弹性负载-Elastic Workload
综上所述,在Kubernetes中,弹性包括调度层弹性(Pod)和资源层弹性(Node)两个层次,通常会通过HPA、VPA等模型进行Pod的弹性伸缩,再通过cluster-autoscaler或者virtual-kubelet进行资源层的弹性伸缩。两层之间通过Pod进行解耦,这样设计的好处是两层职责明确,坏处是解耦后相互结合的策略过于简单,无法实现更精细的调度策略,在Kubernetes中最小的生命周期管理单元是一个Pod,而传统的Kubernetes负载控制器(例如:Deployment、StatefulSet)管理的Pod是共享相同的调度策略的。因此,如果想要控制一个负载在不同资源上的细粒度分配时,可以通过elastic-workload来实现。
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(4) https://developer.aliyun.com/article/1231998?groupCode=supportservice