部署后 Mendix 应用程序迁移到 Kubernetes 时,接收的流量可能会以不可预测的方式发生变化。如何让您的应用始终保持响应?
这就是扩展发挥作用的地方。您希望您的集群能够从容地处理负载,无论是流量高峰还是常规使用。 Mendix 私有云通过动态调整 Pod 数量来满足需求,从而实现这一点。在我们的 Connected 产品中,您可以从开发人员门户手动执行此操作,也可以直接在 Kubernetes 集群中启用 Horizontal Pod Autoscaler。很酷,对吧?
在本博客中,您将学习如何实现自动缩放 Mendix 基于特定于应用程序的自定义指标来监控应用程序。我们将使用 Horizontal Pod Autoscaler 和 Cluster Autoscaler 的组合。但等等,还有更多?是的,一个漂亮的 Grafana 仪表板 客制化 Mendix 让私有云能够实时可视化所有发生的一切!
Kubernetes 中的自动扩展——包括什么?
首先,让我们仔细看看 Kubernetes 中“自动缩放”一词的使用。在 Kubernetes 中,有几件事被称为“自动缩放”,包括:
- 水平 Pod 自动扩缩器 (HPA) – 调整应用程序的副本数量。
- 垂直 Pod 自动扩缩器 (VPA)——调整容器的资源请求和限制。请注意,在以下情况下,VPA 不是推荐的自动扩展策略: Mendix 并强烈劝阻。
- 集群自动扩缩器 (CA) – 调整集群的节点数量。
Mendix 私有云支持上述所有内容,但它们都针对非常不同的用例并使用不同的概念和机制。
让我们探索有效扩展的策略。
扩展策略
如何针对给定需求获得最佳副本数量?如果能有一个数字指标来衡量您的应用当前的需求,那岂不是很棒?
对于扩展来说,合适的指标是表示应用程序当前负载的测量值。
以下是一些合适的扩展指标的示例:
- 每个副本每秒接收的请求数。
- 应用程序进程的 CPU 和/或内存使用情况。
(注:由于 Mendix 运行时基于 Java,它预先分配内存并且通常从不释放它,基于内存的指标不应用于自动缩放。)
这里的关键是找到一个最佳指标值(我们称之为 目标价值),其中应用程序既没有过度使用,也没有利用不足。不幸的是,这说起来容易做起来难,因为每个应用程序的行为都不同。
例如,如果您指定 CPU 的最大使用率为 80%,则 HPA 控制器将在此副本集内所有 Pod 的平均使用率达到 80% 或更高时立即添加一个 Pod。这里的一个重要因素是您是否拥有 正确配置 pod 的资源请求和限制。我们的扩展策略应如下所示:
- 如果观察值低于目标值(即应用程序利用率不足),则应减少副本数量,以便每个副本获得更高的利用率。这将导致指标值增加并更接近目标值。
- 如果观察值高于目标值(即应用程序过度利用),则应增加副本数量,以便每个副本接收较小份额的总负载,从而导致度量值下降并更接近目标值。
资源请求和限制基础知识
Kubernetes 允许您指定单个 Pod 需要多少 CPU/RAM,以及如何限制给定 Pod 对这些资源的使用。在 Mendix 对于私有云,这可以通过我们的 开发者门户 或者,对于使用我们独立产品的客户,通过 编辑 MendixCR 目的。

内存单元
- 内存单元通常以字节表示,但为了简单起见,Kubernetes 允许您使用更易于人类阅读的格式,例如兆字节 (MB) 或千兆字节 (GB)。
- 您可以使用以下后缀来表示内存单元:
- “Mi” 代表兆字节(2^20 字节)
- “Gi” 代表吉比字节(2^30 字节)
- “M” 代表兆字节
- “G” 代表千兆字节
CPU单元
- Kubernetes 中的 CPU 单元以“毫核”为单位,毫核是 CPU 核心的一小部分。
- 1 个 CPU 核心相当于 1000 个毫核心。
- 您可以使用“m”后缀来表示毫核,以指定 CPU 请求和限制。
例子
- 100m 代表 100 毫核,也就是 0.1 个 CPU 核心。
- 500m 代表 500 毫核,也就是 0.5 个 CPU 核心。
CPU 是一个绝对单位,也就是说,无论一个节点有多少个核心,1 个 CPU 都是一样的。
我们的 Mendix 应用程序部署配置了以下小尺寸模板值:
- 100m 的 CPU 请求
- 512Mi 的内存请求
模拟自动缩放
我们写这篇文章的目的是:
- 模拟 Mendix 托管在 Kubernetes 集群中的应用程序。
- 配置水平 Pod 自动缩放器来扩展 Mendix 实时中的应用程序副本 Mendix Kubernetes 环境运行于 Mendix 用于私有云连接模式。
- 配置 Cluster Autoscaler 来扩展集群节点的数量,以分配新的副本 Mendix 应用程序。
在此示例环境中,我将托管我的 Mendix Azure AKS 中的群集。对于其他受支持的 Mx4PC 群集类型,请按照供应商推荐的方式配置 CA 功能。
有关如何部署 Mendix 应用程序,你可以查看本指南: https://docs.mendix.com/developerportal/deploy
在开始之前,最好先了解一些先决条件。您是否已经:
- 启用水平 Pod 自动扩缩器 在您的 Mendix 环境?
- 已启用集群自动扩缩器?
- 已安装 Kubernetes 指标服务器 在你的集群中?
配置水平 Pod 自动扩缩器
让我们启用 HPA 并将指标设置为 80% CPU 使用率阈值:
# kubectl -n mendix-app autoscale mendixapp blogapp1-master --cpu-percent=80 --min=1 --max=3
horizontalpodautoscaler.autoscaling/blogapp1 autoscaled

配置集群自动扩缩器 (CA)
您可以启用 CA 从命令行 或 Azure 门户。在此示例中,我将最大节点数设置为 3:
产生流量!
在下面的视频中,你可以在左上角看到我直接向 Mendix 通过在两分钟内发送 1000 个并发连接来应用。我使用 这个工具 在一个临时的吊舱内,但还有许多其他人可以做同样的事情!

Kubernetes 集群中的水平 Pod 自动缩放器视图
让我们探索一下相同序列在 Grafana 仪表板中的样子:

Grafana 仪表板中的水平 Pod 自动缩放器视图
一旦我们开始向 Mendix 应用中,我们观察到以下情况:
- CPU 使用率 blogapp1-master 应用范围从8米上升到100米以上(右上屏幕)。
- - 水平 Pod 自动缩放器 开始扩展 Pod。
- 又创建了两个 Pod。
- 其中一个 Pod 当前处于待处理状态,无法部署。现有节点中没有足够的空间来分配另一个 Pod。
- 几分钟后, 集群自动缩放器 确实触发并在集群中创建一个新节点(屏幕右下方)
- - 待审批 Pod 现已部署。
探索自动扩展前置时间
让我们总结一下所有内容是如何联系在一起的:
- 水平 Pod 自动缩放器反应时间。
- 默认情况下, kubelet 每 10 秒抓取一次 pod 的 CPU 和内存使用情况.
- 每分钟,Metrics Server 都会汇总这些指标 并将它们暴露给其余的 Kubernetes API。
- 默认情况下, 水平 Pod 自动缩放器每 15 秒检查一次 Pod 指标.
- 在最坏的情况下,Horizontal Pod Autoscaler 可能需要长达 1 分半钟才能触发自动缩放(即 10 秒 + 60 秒 + 15 秒)。
- 集群自动缩放器的反应时间。
- 集群自动扩缩器 每 10 秒检查一次集群中未调度的 Pod.
- 在具有 30 个或更少节点且每个节点最多有 100 个 pod 的集群上,整个过程大约需要 30 秒。
- 节点配置时间。
- 然后,还有节点配置时间,这主要取决于云提供商。
- 在 3 到 5 分钟内配置新的计算资源是很标准的。
- Mendix Pod 创建时间。
- 开始 Mendix 运行时间通常不应超过 30 秒。

在最坏的情况下,总延迟可能长达 7 分钟。还不错吧?然而, 在获得更多 pod 之前,您能否处理 7 分钟的突然激增的流量?
有没有什么方法可以调整自动缩放以减少缩放时间?
尝试调整一些默认值:
- HPA 的默认刷新时间由 水平 Pod 自动缩放器同步周期 (默认15秒)。
- Metrics Server 中指标抓取的间隔,由 度量分辨率标志 (默认60秒)。
- 集群自动扩缩器对未分配 Pod 的反应时间由 扫描间隔标志 (默认10秒)。
闭幕词
扩展和处理 Kubernetes 集群的增长乍一看似乎是一项艰巨的任务,但只要采取正确的策略并利用 Mendix 对于私有云,您已经做好了充分准备来驾驭这一激动人心的旅程。关键在于找到添加更多节点和优化现有节点之间的最佳平衡点。
最后再说一句—— Mendix 与应用程序容器密集型相比,应用程序往往相对数据库密集型,因此请确保(自动)扩展数据库。
快乐缩放!