有状态集最佳实践的动态扩展
Posted
技术标签:
【中文标题】有状态集最佳实践的动态扩展【英文标题】:Dynamic scaling for statefulset best practices 【发布时间】:2020-11-14 02:57:48 【问题描述】:背景
我的应用程序使用分片 mongodb 和 elasticsearch statefulsets 在 kubernetes 集群中运行。我为我的应用程序中的部署组件设置了水平 pod 自动缩放器,一切正常。
问题
流量增加时会出现问题。我的服务器部署可以很好地扩展,但是 mongodb 分片和弹性搜索节点无法处理这么多的流量并限制整体响应时间。
简单的解决方案是为这些 statefulset 配置更多的分片、更多的副本。让我烦恼的是,每天 3-4 小时的流量高峰会发生,因此让所有这些男孩一整天都无所事事地坐着有点浪费。
我做了一些研究,看起来数据库一般不应该动态扩展/扩展,因为它会消耗大量的网络和磁盘 io 只是为了在它们之间进行复制。此外,在纵向扩展和缩减过程中还存在数据丢失和不一致的可能性。
问题
如果可能,在 mongodb、elasticsearch 和一般数据库中处理动态缩放的正确方法是什么? 如果没有,我可以做些什么来节省我的云费用,因为我们每天只需要数据库 pod 的最大功率。
【问题讨论】:
我想 MongoDB/Elasticsearch Operators 有扩展 Statefulsets 的机制。我没有这方面的经验,但我会查看这些运营商支持的自定义资源以确定它们提供的功能。 【参考方案1】:您应该阅读有关 Kubernetes 自动缩放的信息 - HPA。
Horizontal Pod Autoscaler 会根据观察到的 CPU 利用率(或者,通过自定义指标支持,根据其他一些应用程序提供的指标)自动扩展复制控制器、部署、副本集或有状态集中的 pod 数量。请注意,Pod 水平自动缩放不适用于无法缩放的对象,例如 DaemonSet。
Horizontal Pod Autoscaler 被实现为 Kubernetes API 资源和控制器。资源决定了控制器的行为。控制器会定期调整复制控制器或部署中的副本数量,以将观察到的平均 CPU 利用率与用户指定的目标相匹配。
使用 HPA,您还应该注意卷安装和数据延迟。
正如 @Serge 在 cmets 中提到的,我建议检查 MongoDB 和 Elasticsearch 本身提供的本机扩展集群选项。
看看
MongoDB 运算符documentation Elasticsearch 运算符documentation Elasticsearch 未来版本autoscaling我对 MongoDB 和 Kubernetes 的 Elasticsearch 不是很熟悉,但也许这些教程对你有帮助:
https://medium.com/faun/scaling-mongodb-on-kubernetes-32e446c16b82 https://www.youtube.com/watch?v=J7h0F34iBx0 https://kubernetes.io/blog/2017/01/running-mongodb-on-kubernetes-with-statefulsets/ https://sematext.com/blog/elasticsearch-operator-on-kubernetes/#toc-what-is-the-elasticsearch-operator-1如果您使用helm,请查看banzaicloud Horizontal Pod Autoscaler operator
您可能不想也不能仅仅为了添加自动缩放功能而编辑 Helm 图表。几乎所有图表都支持自定义注释,因此我们认为,只需在部署中添加一些简单的注释即可设置自动缩放。
我们开源了一个 Horizontal Pod Autoscaler 算子。如果您提供正确的自动缩放注释,此运算符会监视您的 Deployment 或 StatefulSet 并自动创建 HorizontalPodAutoscaler 资源。
希望你觉得这很有用。
【讨论】:
以上是关于有状态集最佳实践的动态扩展的主要内容,如果未能解决你的问题,请参考以下文章