基于RocketMQ指标的容器水平伸缩
本文介绍如何利用Kubernetes事件驱动自动伸缩工具Keda,根据自定义的RocketMQ消息堆积指标,启动容器水平伸缩(HPA)。
索引
功能介绍
随着企业业务的不断发展,消息传递的需求也日益增加。RocketMQ作为一种高性能、高可靠、高扩展性的分布式消息中间件,已经被广泛应用于企业级应用中。但在使用RocketMQ时,消息堆积是常见的问题,特别是在高负载情况下,消息堆积很容易导致系统负载过高,甚至服务崩溃。为了解决这个问题,您可以利用Kubernetes事件驱动自动伸缩工具Keda,根据自定义的RocketMQ消息堆积指标,启动容器水平伸缩应用。阿里云的RocketMQ 5.0版本已默认打通阿里云Prometheus,支持默认将消息堆积的监控数据采集阿里云Prometheus中。
基于RocketMQ消息堆积指标,通过Keda进行弹性伸缩应用的方案可以帮助您实现自动化和高效性的应用程序伸缩,从而提高系统的可靠性和稳定性。如果您采用的是开源的RocketMQ,考虑通过JMX的Prometheus Exporter提供消息对接的数据也可以实现类似的能力,更多信息,请参见RocketMQ开源社区。
本文将采用阿里云Prometheus作为数据源,实现RocketMQ的消息对接伸缩对象配置。
前提条件
- 已部署ack-keda组件。具体操作,请参见事件驱动弹性。
- 已创建消息队列RocketMQ版实例,且实例版本为5.0及以上。具体操作,请参见创建实例。
- 已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群、创建Kubernetes专有版集群。
步骤一:部署工作负载
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
- 在无状态页面,单击使用YAML创建资源。
- 在创建页面,使用如下内容创建一个名为sample-app的应用,然后单击创建。
apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: default labels: app: sample-app spec: replicas: 1 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: sample-app image: nginx:1.7.9 // 修改为业务真实的RocketMQ的消费者镜像。 resources: limits: cpu: "500m"
步骤二:配置ScaledObject
- 登录消息队列RocketMQ版控制台,在左侧导航栏中选择实例列表。
- 单击目标实例名称,进入实例详情页面。在左侧导航栏中单击Topic 管理,查看并记录名称的值和右上方实例 ID,例如:keda、mq-cn-uax33****。
- 登录应用实时监控服务ARMS控制台,在左侧导航栏中选择 。
- 单击目标实例cloud-product-prometheus_{{RegionId}},在左侧导航栏中单击设置,展开云服务:rocketmq区块,记录HTTP API地址(Grafana 读取地址)。
- 使用如下内容,创建YAML文件ScaledObject.yaml。
参数说明如下。apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: prometheus-scaledobject namespace: default spec: scaleTargetRef: name: sample-app maxReplicaCount: 10 minReplicaCount: 2 triggers: - type: prometheus metadata: serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing metricName: rocketmq_consumer_inflight_messages query: sum({__name__=~"rocketmq_consumer_ready_messages|rocketmq_consumer_inflight_messages",instance_id="rmq-cn-uax3xxxxxx",topic=~"keda"}) by (consumer_group) threshold: '30'
参数 说明 scaleTargetRef.name 配置扩缩容的对象,这里配置步骤一:部署工作负载创建好的应用sample-app。 maxReplicaCount 最大副本数。 minReplicaCount 最小副本数。 serverAddress 配置存储RocketMQ指标数据的Prometheus地址,即步骤4记录的HTTP API地址(Grafana 读取地址)。 metricName PromQL请求数据。 query 对metricName中PromQL请求的数据做聚合操作,此处聚合方式为消息堆积量的PromSql。 threshold 扩缩容的阈值,本示例将消息堆积量30做为阈值,超过30就会扩容。 - 执行如下命令,创建资源。
// 下发伸缩配置。 kubectl apply -f ScaledObject.yaml scaledobject.keda.sh/prometheus-scaledobject created // 获取伸缩配置状态。 kubectl get ScaledObject NAME SCALETARGETKIND SCALETARGETNAME MIN MAX TRIGGERS AUTHENTICATION READY ACTIVE FALLBACK AGE prometheus-scaledobject apps/v1.Deployment sample-app 2 10 prometheus True False False 105s // 检查HPA的生成情况。 kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 0/30 (avg) 2 10 2 28m
步骤三:配置RocketMQ实例的地址和用户名、密码
本示例借助rocketmq-keda-sample项目生产及消费数据,需要在项目代码中配置完成步骤2中记录的RocketMQ实例的地址和用户名、密码。
步骤四:生产及消费数据实现扩缩容
- 登录消息队列RocketMQ版控制台,在左侧导航栏,选择实例列表。
- 单击目标实例名称,查看并记录实例用户名、实例密码和接入点和网络信息。
- 运行Producer程序生产数据,然后执行如下命令,查看HPA详情。
预期输出:kubectl get hpa
预期输出表明,sample-app已经扩容到keda组件设置的最大值。NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 32700m/30 (avg) 2 10 10 47m
- 关掉Producer程序,运行Consumer程序,然后执行如下命令。
预期输出:kubectl get hpa -w
预期输出表明,在数据消费结束一段时间后,sample-app缩容至keda组件设置的最小值。NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-prometheus-scaledobject Deployment/sample-app 222500m/30 (avg) 2 10 10 50m keda-hpa-prometheus-scaledobject Deployment/sample-app 232400m/30 (avg) 2 10 10 51m keda-hpa-prometheus-scaledobject Deployment/sample-app 0/30 (avg) 2 10 10 52m keda-hpa-prometheus-scaledobject Deployment/sample-app 0/30 (avg) 2 10 2 57m