Logo
云上水平自动扩缩容(HPA)

云上水平自动扩缩容(HPA) #

定义 #

在 Kubernetes 中,HorizontalPodAutoscaler(HPA) 自动更新工作负载资源,目的是自动扩缩工作负载以满足需求。

SphereEx-Operator 利用 Kubernetes 中 HPA 功能,结合 SphereEx-DBPlusEngine 的相关指标在 Kubernetes 集群中进行运行时自动扩缩容。

在开启自动扩缩容功能后,SphereEx-Operator 会在部署一个 SphereEx-DBPlusEngine 集群的同时在 Kubernetes 集群中应用一个 HPA 对象。

相关概念 #

HPA #

HPA(HorizontalPodAutoscaler) 是指 SphereEx-Operator 利用 Kubernetes 中 HPA 功能对 SphereEx-DBPlusEngine 集群进行自动弹性扩缩容。

对系统的影响 #

在开启自动扩缩容之后,手动设置 SphereEx-DBPlusEngine 在 Kubernetes 中的副本将不会生效,SphereEx-DBPlusEngine 集群的副本数由 HPA 控制器的最大和最小值进行控制,进行弹性扩缩容将会在这两个值之间进行处理。

SphereEx-DBPlusEngine 的最小启动副本数也会由 HPA 的最小副本数进行控制,开启自动扩缩容功能后,SphereEx-DBPlusEngine 将以 HPA 的最小副本数进行启动。

使用 HPA 进行的扩缩容是对 SphereEx-DBPlusEngine 进行水平扩缩容。水平扩缩意味着对增加的负载的响应是部署更多的 Pod。

这与 “垂直(Vertical)” 扩缩不同,对于 Kubernetes, 垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的 Pod。

使用限制 #

  • 现阶段受限于 SphereEx-DBPlusEngine 指标不够丰富,只能通过运行时 CPU 进行压力负载测试。未来会增加其余指标,丰富对于 SphereEx-DBPlusEngine 的运行时压力计算方式。

  • 如果想要使用 SphereEx-DBPlusEngine 在 Kubernetes 中的 HPA 功能,需要您的集群中安装 metrics-server 并能够正常使用 kubectl top 功能。

  • SphereEx-Operator 在创建 SphereEx-DBPlusEngine 集群的同时,会在 SphereEx-DBPlusEngine 集群前方建立负载均衡。您的应用和 SphereEx-DBPlusEngine 是通过负载均衡建立链接。

  • 因为 SphereEx-DBPlusEngine 和您的应用建立的是长链接,所以在扩容的过程中,对已有的长链接不会有明显的降低负载的效果。扩容的效果只会生效在扩容后新建立的链接上。

  • 缩容也会有相对应的问题,在缩容的过程中,您的应用会有闪断的现象,是因为缩容的 SphereEx-DBPlusEngine 副本处于缩容的过程中,会从负载均衡上摘除,您的应用和 SphereEx-DBPlusEngine 建立的长链接也会随之销毁。

原理介绍 #

使用 HPA 进行的扩缩容是对 SphereEx-DBPlusEngine 进行水平扩缩容。水平扩缩意味着对增加的负载的响应是部署更多的 Pod。

这与 “垂直(Vertical)” 扩缩不同,对于 Kubernetes, 垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的 Pod。

如果负载减少,并且 Pod 的数量高于配置的最小值, HorizontalPodAutoscaler 会指示工作负载资源( Deployment、StatefulSet 或其他类似资源)缩减。

在 Kubernetes 集群中,有一个控制器会按照一定的时间间隔对相关资源创建的 HPA 中的指标进行查询。在满足指标的阈值之后会按照计算公式对相对应的资源进行扩容或者缩容。

在 SphereEx-Operator 工作过程中,HPA 对象作用于 SphereEx-DBPlusEngine 的 Deployment 部署对象,并且持续的查询 SphereEx-DBPlusEngine 每一个副本的 CPU 利用率。

SphereEx-DBPlusEngine 的 CPU 利用率从该容器的 /sys/fs/cgroup/cpu/cpuacct.usage 中获取 CPU 的使用情况,并且以 shardingsphere.sphere-ex.com/v1alpha1.proxy 中 automaticScaling.target 字段设置的值为阈值的百分比,进行持续的计算。

当计算的数值达到阈值之后,HPA 控制器按照如下的公式进行副本数的计算:

期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]

值得注意的一点,CPU 利用率这一指标,是计算的每一个副本的 resources.requests 字段中 CPU 的数值。

在检查容差并决定最终值之前,控制平面还会考虑是否缺少任何指标, 以及有多少 Pod 已就绪。

当使用 CPU 指标来扩缩时,任何还未就绪(还在初始化,或者可能是不健康的)状态的 Pod 或 最近的指标度量值采集于就绪状态前的 Pod,该 Pod 也会被搁置。

原理图:

HPA

相关参考 #

云上水平自动扩缩容(HPA)的配置