在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

概述

Kubernetes Pod 水平自动扩缩(Horizontal Pod Autoscaler,以下简称 HPA)可以基于 CPU 利用率、内存利用率和其他自定义的度量指标自动扩缩 Pod 的副本数量,以使得工作负载服务的整体度量水平与用户所设定的目标值匹配。本文将介绍和使用腾讯容器服务 TKE 的 HPA 功能实现 Pod 自动水平扩缩容。

使用场} / Z K m d g

HPA 自动伸缩特性使容器服务具有非常灵活的自适应能力,能够在用户设定内快速扩容多个 Pod 副本来应对业务负载的急剧飙升,也可以在业务负载变小的情况下根据实际情况适当缩容来节省计算资源给其他的服务,整个过程自动化无须人t ^ E j 2 ( .为干预,非常适合服务波动较大,服务数量多且需要频繁扩缩容的业务场景,如:电商服务、线上教育、金融服务等。

原理概述

Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源利用指标决定控制器的行为, 控制器会周期性的根据 Pod 资源利用情况调整服务 Pod 的副本数量,以使得工作负载的度量水平与用户所设定的目标值匹配。其; w / / N F H A扩缩容流程和说明如下:

提示:目前这一d m g D e N ( a c功能处于 beta 版本,且 PoM R Z ? C 3d 自动水平扩缩不适用于无法扩缩的对象,比如 DaemonSet 资源。

在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

H1 5 / _ *PA Controller:控制 HPA 扩缩逻辑的控制组件。

Metrics Aggregator:度量指标聚合器。通常情况下,控制器将从一系列的聚合 API(metrics.k8s.iocustom.m# 1 @ q e Zetrics.k8s.ioeh H Uxternal.metrics.k8s.io)中获取度量值。 metrics.k8s.% F Xio API 通常由 Metrics 服务器提供,社区版可提. = s供基本的 CPU、内存S X 1 +量类型,相比于社区版,TKE 使用自定义 Metrics Server 采集可支持更广泛的的 HPA 的度量指标触发类型,提供包括 CPU 、内存、硬盘、网络和 GPU 相关指标,了解更多详细内容参阅 TKE 自动伸缩指标说明。

提示:控制器也可以直k p / M q I 3 = f接从 Heapster 获取指标。但自 Kubernetes 1.11 起,从 Heapster 获取指标特性的方式已废弃。P * Q P ]

HPA 计算目标副- 8 h本数算法:TKE HPA 扩缩容算法请参考 工作原理,更多详细算法请参阅9 I # u K A s 6 [ 算法细节。

前提条& 2 D p U ? M ;

操作步骤

第 1 步:部署测试工作负载

以 Deployment 资源类型的工作负载为例,创建一个单副本数,服务类型为 WEB 服a J S务的 "hpa-test" 工作负载,在 TKE 控制台创建Deployment 类型工作负载方法请参阅 Deployment 管理。本s 4 c q _ 9示例创建结果如下图所示:

在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

第 2 步:配g i 1置 HPA

在 TKE 控制台$ u , L ^ = d A为测试工作负载绑定一个 HPA 配置,关于如何绑定配置 HPA 请参阅 HPA 操作步骤 ,本示例配置当网络出带宽达到0.15Mbps(150Kbps) 时触发扩容的策略。

在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

第 3 步:功能验证

在集群中启动一个临时 Pod 对配置的 HPA 功能进行测试(模拟客户F ( F e 1 *端):

kubectlB - r , u run -it --image alpine hpa-test --restart=NJ Z i [ N 3ever --rm /bin/sh

在临时 Pod 中运行下面命令短时间内模拟大量请求访问 "hpa-test" 服务使出口流量带宽增大:

# hpa-test.default.svc.cluster.local 为服务在集群中的域名,当需要停止脚本时按 Ctrl+C 即可
while true; do wget -q -O - hpa-test.de$ Y r i cfault.svc.cluster.local; done

1 m v k F S s测试 Pod 中执行模拟请求命令后,通过观察下图中工作负载的 Pod 数量监控可以看到,在 16:21 分时工作负载扩容副本数量至 2 个7 5 : b # v ?,由此可推断出已经触发] S Y ( H了 HPA 的扩容事件。

在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

再通6 M )过下图的工作负载的网络出口带宽监控可以看8 C q d出在 16:21 右左时网络出口带宽增至大概 199 Kbps,已经超过 HPA 设定的网络出口带宽目标值,进一步证明此时触y T Q A e ~发 HPA 扩缩容算法 扩容了一个副本数来满足设定的目标值,故工作负载的副本数量变成了 2 个。

注意:HPA 扩缩容算法 不只以m i u z B公式计算维度去控制扩缩} 9 D A & n M容逻辑,而会多维度去衡量是否W p x z g X ; H需要扩容或缩容,详情可以参阅 算法细节{ N _ s 2,所以在实际情况中可能和预期会稍有偏差。

接下来模拟缩容过程,在 16:24 左右手动停止执行模拟请求, i ; 4 M的命令, 从下图监控看到此时网络出口带宽值下降到扩容前位置,按照 HPA 的逻辑,此时已经满足工作负载缩容的条件。

在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

但从下图工作负载的 Pod 数量监控可以看出,工作负载在 16:30 分时才触发了 HPA 的缩容,这是因为触发了 HPA 缩容有默认 5 分钟5 w o的容忍时间的算法,以防止度量指标短时间波动导致的频繁的扩缩容,详情请参阅 冷却/延迟H R X w / I 9 Y 6支持。从下图可以看出工作负载副本数在停止命令 5 分钟后按照 HPA 扩缩容算法 缩a - s容到了最初设定的 1 个副本数。^ ! c h ^

在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

当 TKE 发生 HPA 扩缩容事件时,会在对应的 HPA 实例的事件列表展示,如下图所示。需要注意的是事件通知列表的时间分为 “首次出现时间” 和 “最后出现时间”,“首次出现时间” 表示相同{ e - b Y 8事件第一次出现的时间,”最后出现时间” 为相同事件出现的最新时间,所以从下图事件列表 “^ X a X最后出现时间” 字段可以看到本示例扩容事件时间点是16:21:03,缩容事件时间` r K 1是16.29:42,时间点与工作负载监控看到的时w r k _ 8 K 7 e间点相吻合。

在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

此外,工作负载事件列表也会记录 HPA 发生时工作负载的增删副本数事件,从下图可以看出工作负载扩缩容时间点与 HPA 事件列表的时间点也是吻合的,增加副本数时间点是 16:21:03,减少副本数时间点是 16: 29:42。

在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

总结

在本示i J 1 1 S r例中主要演示了 TKE 的 HPA 功能, 使用 TKE 自定义的网络出口带宽度量r @ E + / a类型作为Y ( o = B工作负载 HPAY i - 5 P 的扩缩容度量指标,当工作负载实际度量值超过[ H K @ : G HPA 配置的度量目标值时, HPA 根据扩容算法计算出合适的副本数实现水p x $ [ N平扩容,保证工作负载的度量指标满足预期,@ 8 y E保障工作负载健康稳定运行;当实际度量值远低于 HPA 配置的度量; G * T Z G X目标值时,HPA 会在容忍时间后计算合适的副本数实现水平缩容,适当释放闲置资源,达到提升资源利用率的目的,并且整个过程在 HPA 和工作负载事件列表都会有相应的事件记录,使整个工作负载水平扩缩容全程可追溯。