23

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

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=Mzg5NjA1MjkxNw%3D%3D&%3Bmid=2247489835&%3Bidx=1&%3Bsn=c6aca17928fe05b0e232c0113b439880
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

jokey,腾讯云容器产品工程师,热衷于云原生领域。目前主要负责腾讯云TKE 的售中、售后的技术支持,根据客户需求输出合理技术方案与最佳实践。

概述

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

使用场景

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

原理概述

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

提示:目前这一功能处于 beta 版本,且 Pod 自动水平扩缩不适用于无法扩缩的对象,比如 DaemonSet 资源。

YRRNfy6.jpg!mobile

HPA Controller:控制 HPA 扩缩逻辑的控制组件。

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

提示:控制器也可以直接从 Heapster 获取指标。但自 Kubernetes 1.11 起,从 Heapster 获取指标特性的方式已废弃。

HPA 计算目标副本数算法:TKE HPA 扩缩容算法请参考 工作原理 [2] ,更多详细算法请参阅 算法细节 [3] 。

前提条件

  • 注册腾讯云账户 [4] 。

  • 已登录 腾讯云容器服务控制台 [5] 。

  • 已创建 TKE 集群。关于创建集群,详情请参见 创建集群 [6] 。

操作步骤

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

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

NRBjUvM.png!mobile

第 2 步:配置 HPA

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

M7bUfi6.png!mobile

第 3 步:功能验证

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

kubectl run -it --image alpine hpa-test --restart=Never --rm /bin/sh

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

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

在测试 Pod 中执行模拟请求命令后,通过观察下图中工作负载的 Pod 数量监控可以看到,在 16:21 分时工作负载扩容副本数量至 2 个,由此可推断出已经触发了 HPA 的扩容事件。

IvANje6.png!mobile

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

注意:HPA 扩缩容算法 [10] 不只以公式计算维度去控制扩缩容逻辑,而会多维度去衡量是否需要扩容或缩容,详情可以参阅 算法细节 [11] ,所以在实际情况中可能和预期会稍有偏差。

y6jEVr.png!mobile

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

jU3Yzuv.png!mobile

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

Fbqeea.png!mobile

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

eE3eA3N.png!mobile

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

EV3YBrz.png!mobile

总结

在本示例中主要演示了 TKE 的 HPA 功能, 使用 TKE 自定义的网络出口带宽度量类型作为工作负载 HPA 的扩缩容度量指标,当工作负载实际度量值超过 HPA 配置的度量目标值时, HPA 根据扩容算法计算出合适的副本数实现水平扩容,保证工作负载的度量指标满足预期,保障工作负载健康稳定运行;当实际度量值远低于 HPA 配置的度量目标值时,HPA 会在容忍时间后计算合适的副本数实现水平缩容,适当释放闲置资源,达到提升资源利用率的目的,并且整个过程在 HPA 和工作负载事件列表都会有相应的事件记录,使整个工作负载水平扩缩容全程可追溯。

参考资料

[1]

TKE 自动伸缩指标说明: https://cloud.tencent.com/document/product/457/38929

[2]

工作原理: https://cloud.tencent.com/document/product/457/37384#.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86

[3]

算法细节: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details

[4]

注册腾讯云账户: https://cloud.tencent.com/register

[5]

腾讯云容器服务控制台: https://console.cloud.tencent.com/tke2

[6]

创建集群: https://cloud.tencent.com/document/product/457/32189

[7]

Deployment 管理: https://cloud.tencent.com/document/product/457/31705

[8]

HPA 操作步骤: https://cloud.tencent.com/document/product/457/37384#.E6.93.8D.E4.BD.9C.E6.AD.A5.E9.AA.A4

[9]

扩缩容算法: https://cloud.tencent.com/document/product/457/37384#.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86

[10]

扩缩容算法: https://cloud.tencent.com/document/product/457/37384#.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86

[11]

算法细节: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details

[12]

冷却/延迟支持: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/#冷却-延迟支持

[13]

扩缩容算法: https://cloud.tencent.com/document/product/457/37384#.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86

VbUfIfy.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK