作者:Daniel Yavorovych (Dysnix)、Yuriy Khoma (Dysnix)、Zbynek Roubalik (KEDA)、Tom Kerkhove (KEDA)
Dysnix[1]开发高流量后端系统已经有很长一段时间了,他们的团队每天都会遇到高效的扩展需求。工程师们已经明白,手动处理流量波动和准备基础设施是低效的,因为你需要在流量增加之前部署更多的资源,而不是在事件发生的时候。这个策略有两个问题:首先,当通信流量已经到达时,通常来不及扩展;其次,在通信流量不存在的时候,资源会被过度创建和闲置。
当谈到如何设计这个解决方案时,Dysnix 决定依赖 KEDA,因为它是 Kubernetes 中最通用和最适用的应用程序自动伸缩组件。
KEDA 被用作 PredictKube 客户端的一个组件,它负责传输请求和扩展副本。
Dysnix 构建了PredictKube[2],这是一个解决方案,可以用作负责资源平衡的 KEDA 伸缩器,以及一个学会主动对流量活动模式做出反应的人工智能模型,以帮助及时扩大规模和解决供应过剩的问题。

由于人工智能模型可以观察项目期间一段时间内的每秒请求数(RPS,requests-per-second)或 CPU 值,然后显示长达 6 小时的趋势,因此预测自动伸缩过程成为可能。PredictKube 使用客户和开放数据源(我们使用像HTTP NASA 日志[3]这样的数据集)来训练模型,并明确关于云数据和流量趋势。
有了这个工具,Dysnix 希望能够降低项目成本,更有效地分析流量数据,更负责任地使用云资源,并构建比其他公司更“绿色”和更有性能(更少的停机和延迟)的基础设施。
PredictKube 的工作分为两部分:
一开始提供的数据越多,预测就越精确。2 周以上的数据已经足够了。

剩下的就看你了!你可以将预测的趋势形象化,例如,Grafana[5]。
API_KEY="<change-me>"
$ kubectl create secret generic predictkube-secrets --from-literal=apiKey=${API_KEY}
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: keda-trigger-auth-predictkube-secret
spec:
secretTargetRef:
- parameter: apiKey
name: predictkube-secrets
key: apiKey
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: example
spec:
scaleTargetRef:
name: example-app
pollingInterval: 60
cooldownPeriod: 300
minReplicaCount: 3
maxReplicaCount: 50
triggers:
- type: predictkube
metadata:
predictHorizon: "2h"
historyTimeWindow: "7d" # We recommend using a minimum of a 7-14 day time window as historical data
prometheusAddress: http://kube-prometheus-stack-prometheus.monitoring:9090
query: sum(irate(http_requests_total{pod=~"example-app-.*"}[2m]))
queryStep: "2m" # Note: query step duration for range prometheus queries
threshold: '2000' # Value to start scaling for
authenticationRef:
name: keda-trigger-auth-predictkube-secret
使用以下命令查看上一步创建的伸缩的配置和状态:
$ kubectl get scaledobject example
要获取用于伸缩的统计数据,使用以下命令:
kubectl get hpa example
现在你可以在可视化工具中查看伸缩的工作原理。这是 Dysnix 在他们的一个项目中使用 PredictKube 后得到的一个图表的例子:

在这张图中,你可以看到 2 小时冷却时间环境的统计数据。绿色趋势表示预测的副本数量,黄色趋势表示某一时刻的一个现成副本,而蓝色趋势是理想趋势表示支持 RPS 趋势的最接近副本数量。如果你需要一个这样的仪表板模板来制作自己的,请随时联系Daniel[9]。
在连接和部署一切之后,你将能够更改你正在观察的时间框架,或者只是在数据到来时监视数据。
随着这个版本的发布,Dysnix 为 Kubernetes 工作负载创建了预测自动伸缩的第一个里程碑。该团队希望你会发现它很有趣,并帮助测试它并改进它。如果你对 PredictKube 的核心功能有任何问题要问,你可以联系开发团队[10]。对于所有与 KEDA 相关的问题,请通过 GitHub 分享你的反馈[11]。
在未来,PredictKube 计划添加更多与其他数据源的集成,以根据项目的其他配置自动伸缩。此外,还有一种实现基于事件的预测扩展的想法,使其不仅能够对趋势做出反应,而且能够对事件的出现做出反应。
如果你有任何关于 PredictKube 机制的问题,你可以联系 Dysnix 团队,或者在其隐私政策[12]中了解更多关于数据使用的信息。下面的人会很乐意帮忙:
感谢你阅读到这里。
Daniel Yavorovych 和 Yuriy Khoma 代表 PredictKube 开发团队。
[1]Dysnix: https://dysnix.com/
[2]PredictKube: https://predictkube.com/
[3]HTTP NASA 日志: ftp://ita.ee.lbl.gov/html/contrib/NASA-HTTP.html
[4]Prometheus: https://prometheus.io/
[5]Grafana: https://grafana.com/
[6]安装 KEDA: https://keda.sh/docs/latest/deploy/
[7]PredictKube 网站: https://predictkube.com/
[8]创建 PredictKube 凭据秘密: https://docs.predictkube.com/quickstart-with-keda#create-predictkube-credentials-secret
[9]Daniel: https://github.com/daniel-yavorovich
[10]联系开发团队: https://predictkube.com/contact
[11]通过 GitHub 分享你的反馈: https://github.com/kedacore/keda/discussions/2605
[12]隐私政策: https://predictkube.com/privacy-policy
[13]Daniel Yavorovych: https://github.com/daniel-yavorovich
[14]Yurij Khoma: https://www.linkedin.com/in/yuriy-khoma-5657a461/